使用gdb查找程序卡住的位置

时间:2014-07-17 18:11:14

标签: c debugging gdb

我的程序运行不正常。 看起来它陷入无限循环或坏互斥锁定/解锁。但是,我不知道bug在哪里。 我尝试使用gdb进行调试。

我不能使用gdb backtrace命令,因为我没有指定断点。 我无法指定它,因为我不知道错误在哪里。

gdb是否具有“动态”回溯的工具?

3 个答案:

答案 0 :(得分:12)

  

我不能使用gdb backtrace命令,因为我没有指定断点。

是的,你可以。

您需要的只是在某处停止劣质(被调试)程序。

当您第一次附加到程序时,GDB将停止所有线程,您可以检查它们的位置。稍后,您可以点击Ctrl-C,再次查看所有主题。一个有用的命令是thread apply all where

答案 1 :(得分:9)

从程序的“ps -ef”获取进程ID。使用 pstack 确切地知道它挂在哪个函数中。它将打印出执行堆栈跟踪。

示例输出:

$ pstack PROCESS_PID

\#0  0x00000038cfaa664e in waitpid () from /lib64/libc.so.6  
\#1  0x000000000043ed42 in ?? ()  
\#2  0x000000000043ffbf in wait_for ()  
\#3  0x0000000000430bc9 in execute_command_internal ()  
\#4  0x0000000000430dbe in execute_command ()  
\#5  0x000000000041d526 in reader_loop ()  
\#6  0x000000000041ccde in main ()  

答案 2 :(得分:-2)

当您在调试期间感觉自己处于某个infinte循环内部时,请检查代码并

在可能的循环之后创建一个断点并尝试出来,你会明白是否

断点在该循环之后被击中,之后你可以分析你的

中的错误

从代码部分变量或在gdb中重新运行样本repro。