Articles of gdb

为什么我不能在fopen中设置断点?

这是我的代码: #include <stdio.h> int main() { fopen("./1.txt","r"); printf("hello"); return 0; } $ g ++ -g -om main.cpp $gdb ./m (gdb) b fopen Breakpoint 1 at 0x804842c (gdb) b printf Breakpoint 2 at 0x804843c (gdb) ib Num Type Disp Enb Address What 1 breakpoint keep y 0x0804842c <fopen@plt> 2 breakpoint keep y 0x0804843c <printf@plt> (gdb) r […]

gdb“watch”不能通过glibc(read)函数修改variables吗?

我想在ch修改时打破。我在gdb中使用watch ch ,它不起作用。 像ch=1; 为什么read()不是? 这样就是对使用watch命令。 或者read()函数是特殊的? 对不起,我的英文,Code说的都是。 文件1.c: #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdio.h> const char *const filename = "/etc/passwd"; int main(void) { int fd; int ch; fd = open(filename, O_RDONLY); read(fd, &ch, sizeof(int)); printf ("%d\n", ch); close (fd); return 0; } gcc -g 1.c debugging: $ gdb a.out GNU […]

为什么我的gdb提示在改变颜色后显示错误

我通过写入set prompt \033[1;33m(gdb) \033[0m到.gdbinit文件中来更改我的gdb提示符的颜色。 而且我改变了我的gdb提示符的颜色。 但是,我发现我的长命令与我的参数将覆盖我的提示后,我不input换行input一个长的命令。 为什么?

查找僵尸线程的来源

我有一个应用程序,我敢肯定“泄漏”线程忘记调用pthread_join。 所以他们的堆栈没有被清理,随着时间的推移会消耗大量的虚拟地址空间。 有没有办法在创build这些线程的软件中find一个地方,或者至less在退出之前找出这些线程正在做什么? 我的应用程序很大,并创build了很多正确连接的线程。 所以捕捉所有的pthread操作是不切实际的。 我需要更精确的东西。 我能够想出一个我认为正在发生的孤立的复制者。 #include <pthread.h> #include <unistd.h> void* worker (void* unusued) { // Do nothing } int main() { pthread_t thread_id; for(int i=0; i < 2000; i++) { pthread_create(&thread_id, NULL, &worker, NULL); } sleep(1000); return 0; } 运行后,“top”显示16GB的虚拟地址空间被占用 但'ps'和'gdb'只显示一个线程 我有我的应用程序中的一切资源。 所以我可以添加任何代码或其他所需的仪器。 换句话说,上面的应用程序正在运行的实例如何发现它有2000个“丢失”线程以及如何发现他们执行了worker()函数?

减lessdebugging会话中的堆栈大小,以捕捉无穷的recursion

我有一个algorithm,“有时”不会中断recursion,并在堆栈溢出结束。 现在我想debugging这种情况。 gdb直接指向我覆盖堆栈寄存器的那一行,但是不可能得到堆栈跟踪,因为gdb需要无尽的时间来展开堆栈并将其显示在ddd中。 我现在只是想减less堆栈大小,以早日获得腐败。 所以我需要一种方法来减less为我的运行任务堆栈。 没有涉及的线程,所以不应该这么大。 但我不知道如果gdb本身有一个操纵堆栈(大小)本身的选项,或者我需要编程改变我的编程开始时的大小,或者我可以减less从OS命令行(linux)开始后的大小debugging会话。 如果gdb有这样一个选项,如果调用树达到最大深度,也许也可以停止。

Linux“gdb a.out param1 param2”是否将param1和2传递给“gdb”或“a.out”?

是否有任何情况下,param1和param2传递给gdb,有些情况下传递给a.out,有些情况下,每个1? Linux shell如何parsing并决定哪个参数为哪个程序? 谢谢。

为什么将GDB断点设置为x86汇编函数的错误地址?

我遇到了一个问题,即在添加断点时,gdb将行号映射到错误的内存地址。 以下x86 Linux汇编程序打印“你好”。 /* hello.s */ .section .data str: .ascii "hello\n" strlen = . – str .section .text print: pushl %ebp movl %esp, %ebp pushl %ebx movl $4, %eax movl $1, %ebx movl $str, %ecx movl $strlen, %edx int $0x80 popl %ebx movl %ebp, %esp popl %ebp ret .globl _start _start: call print movl $1, […]

从shell脚本启动GDB

要开始debugging,我需要做这个步骤: screen -S gdb_program gdb /path/to/program handle SIGPIPE nostop noprint pass – 是gdb命令 c – 是gdb命令 如何编写一个我可以运行的shell脚本: ./gdb.sh

使用GDBdebuggingmultithreading程序(openmp)

所有 我打算在Fedora中使用gdb来debugging24个线程的程序,并且我有如下的GDB输出。 当我想切换到发生分段错误的特定线程时,我不能使用线程命令切换到该线程(GDB输出中的最后4行)。 你能帮我一下吗? 你知道是什么错误吗? GDB输出如下: [root@localhost nameComponentEncoding]# gdb NCE_david GNU gdb (GDB) Fedora (7.2.90.20110429-36.fc15) Copyright (C) 2011 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show […]

在GDB中拆解C函数 澄清GAS大会指示

我有写在这里的C函数(它有一个缓冲区溢出漏洞) void func(char *str) { char buffer[12]; int a=9; strcpy(buffer,str); } 它在gdb中的汇编转换为 |0x4005b4 <func> push %rbp |0x4005b5 <func+1> mov %rsp,%rbp |0x4005b8 <func+4> sub $0x40,%rsp |0x4005bc <func+8> mov %rdi,-0x38(%rbp) |0x4005c0 <func+12> mov %fs:0x28,%rax |0x4005c9 <func+21> mov %rax,-0x8(%rbp) |0x4005cd <func+25> xor %eax,%eax |0x4005cf <func+27> movl $0x9,-0x24(%rbp) |0x4005d6 <func+34> mov -0x38(%rbp),%rdx |0x4005da <func+38> lea -0x20(%rbp),%rax |0x4005de <func+42> mov […]