Tag: gdb

gdb奇怪的回溯

我的程序是用dietlibc静态编译的。 它是在ubuntu x64上编译的(使用-m32标志为x86编译)并在centos x86上运行。 编译后的大小只有大约100KB。 我用-ggdb3编译它,没有优化标志。 我的程序使用signal.h来处理SIGSEGV信号,然后调用abort()。 程序运行几天没有问题,但有时会出现段错误。 这是我得到奇怪的回溯,我不明白: username @ ubuntu:〜/ Desktop $ gdb -c core.28569 program-name GNU gdb(GDB)7.2 版权所有(C)2010 Free Software Foundation,Inc。 许可证GPLv3 +:GNU GPL版本3或更高版本 这是免费软件:您可以自由更改并重新分发它。 在法律允许的范围内,不提供任何担保。 输入“显示复制” 和“显示保修”的详细信息。 此GDB配置为“–host = x86_64-linux-gnu –target = i386-linux-gnu”。 有关错误报告说明,请参阅: … 从程序名中读取符号……完成。 [新主题28569] 核心由`program-name’生成。 程序终止,信号6,Aborted。 __kernel_vsyscall()中的#0 0x00914410 设置调试gdb的环境。 函数“internal_error”未定义。 在未来的共享库加载中使断点挂起? (y或[n])[回答N; 输入不是来自终端] 函数“info_command”未定义。 在未来的共享库加载中使断点挂起? (y或[n])[回答N; 输入不是来自终端] .gdbinit:8:源命令文件出错: […]

如何在gdb中加载多个符号文件

如何在gdb加载多个符号文件。 我有一个可执行文件foo.out并加载模块bar.so. 我创建了两个符号文件foo.symbol和bar.symbol。 如何将这两个文件加载到gdb中。 # gdb –core core # (gdb) # (gdb) symbol-file foo.symbol 如何加载第二个符号文件。 或者有没有办法在gdb加载目录的所有文件

glibc检测到错误

任何人都可以帮我理解这个错误信息吗? *** glibc detected *** ./kprank_new3_norm: munmap_chunk(): invalid pointer: 0x00000000096912d0 *** ======= Backtrace: ========= /lib64/libc.so.6(cfree+0x1b6)[0x3df6e75a36] ./kprank_new3_norm[0x409277] ./kprank_new3_norm[0x4092a9] ./kprank_new3_norm[0x4092ea] ./kprank_new3_norm[0x40941f] ./kprank_new3_norm[0x40943b] ./kprank_new3_norm[0x40945f] ./kprank_new3_norm[0x409628] ./kprank_new3_norm[0x4096a7] ./kprank_new3_norm[0x40968d] ./kprank_new3_norm[0x409750] ./kprank_new3_norm[0x4097a5] ./kprank_new3_norm[0x404846] /lib64/libc.so.6(__libc_start_main+0xf4)[0x3df6e1d974] ./kprank_new3_norm(__gxx_personality_v0+0x99)[0x4017f9] ======= Memory map: ======== 00400000-00412000 r-xp 00000000 08:21 25795429 /home/rkrish/abhik/kprank/kprank_new3_norm 00611000-00612000 rw-p 00011000 08:21 25795429 /home/rkrish/abhik/kprank/kprank_new3_norm 09691000-096d3000 rw-p 09691000 00:00 0 [heap] 3df6a00000-3df6a1c000 r-xp 00000000 08:02 […]

你如何使用gdb?

我决定了解我们的C / C + * nix从业者如何使用gdb调试器。 这是我通常使用的: b – break filename.c:line#,function,filename.cpp:function,className :: Member n,c,s – 下一步继续 gdb program name => set breakpoints ==> run [parameter list](我这样做是为了在程序启动前设置断点) l – 列出周围的源代码。 附加processID 6 break [location] gdb programName corefile.core(检查app崩溃的原因) 我有时也会在退出函数(break exit)中设置断点来检查程序堆栈 info b检查所有断点 清除[断点列表] 你如何使用它?

如何监控GDB中的变量并在满足特定条件时记录它?

我想知道是否有任何方法可以监视变量的值,直到例如计数器达到一个值,然后在每个计数器值期间记录变量值的输出?

如何在16位模式下使用GDB?

我有以下代码,我试图实现一个使用BIOS函数打印字符串的函数: int printString(char* string) { int i = 0; while (*(string + i) != ‘\0’) { char al = *(string + i); char ah = 0xe; int ax = ah * 256 + al; interrupt(0x10,ax,0,0,0); i++; } return i; } 函数中断在汇编中实现。 它调用适当的BIOS中断,如第一个参数所给出的,其余参数分别包含ax,bx,cx和dx寄存器的内容: .global _interrupt _interrupt: push bp mov bp, sp push si push ds mov […]

如何让gdb跟随execv? 尽管“跟随执行模式”不工作

我写了两个简单的程序: int main(int ac, char **argv ) { execv( “/home/me/Desktop/execvtest2”, argv ); } 和 int main(int ac, char **argv ) { execv( “/home/me/Desktop/execvtest1”, argv ); } 我用gcc -g将它们编译成相应的输出文件。 我使用gcc(Ubuntu / Linaro 4.4.4-14ubuntu5.1)4.4.5运行Ubuntu 10.10。 当我使用GNU gdb(GDB)7.2-ubuntu调试第一个程序时,我可以直到第一个execv语句,但随后两个文件继续运行。 即使我将follow-exec-mode设置为new,我也无法进入第二个程序。 当我设置catch exec时,gdb会在每次调用execv时停止(某些如何没有第二个程序的链接源,我无法退出gdb,因为它有点挂起!?),但我无法跳过调用“新”(作为exec替换过程)的劣质程序。 那怎么办呢? 必须有一种方法可以进入新的流程吗? 难道我做错了什么? 干杯

如何执行完成,然后从命令内执行另一个命令?

这是我的代码结构的简化示例: void increment(int j); int main() { int i = 0; while(1) { i = increment(i); } return 0; } int increment(int j) { return j + 1; } 这是相应的GDB脚本: b increment command 1 finish print i continue end 问题是finish命令阻止不能调用它之后的命令(即print i和continue )。 有没有办法告诉GDB在任何increment调用后立即打印?

gdb中的“target record-full”使printf上的“n”命令失败并且“进程记录不支持地址0x7ffff7dee6e7处的指令0xc5”?

我想在gdb中使用“reverse-step”和“reverse-next”命令。 堆栈溢出告诉我,我应该在执行上下文中运行“target record-full”,我希望“rn”和“rs”。 但是发生了一些奇怪的错误: 1 2 #include 3 int i=0; 4 void fa() 5 { 6 ++i; 7 printf(“%d\n”,i); 8 ++i; 9 } 10 int main(){ 11 fa(); 12 return 0; 13 } 我编译并运行这个程序: (gdb) b 4 Breakpoint 1 at 0x40052a: file test02.c, line 4. (gdb) r Starting program: /home/Troskyvs/a.out Breakpoint 1, fa () at […]

gdb地址和“真实”地址之间的区别?

如果我在gdb中运行一个C / C ++程序(在使用-g标志编译之后)并检查某些变量,参数等的地址,然后我在gdb之外运行它(使用./ )将这些地址和我在gdb中看到的一样? 如果它们不同,它们通常是相似的,还是会大不相同? 我问这个是因为我有一个缓冲区溢出程序,它在gdb(有和没有断点)中完美运行,但是当我尝试在gdb之外运行它时它不起作用。