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

C 使用gdb查找程序卡住的位置,c,debugging,gdb,C,Debugging,Gdb,我的程序运行不正常。 它看起来像是卡在无限循环中,或者是一个坏的互斥锁/解锁。但是,我不知道臭虫在哪里。 我尝试使用gdb进行调试 我不能使用gdb backtrace命令,因为我没有指定断点。 我不能指定它,因为我不知道错误在哪里 gdb是否有“动态”回溯的仪器? 我不能使用gdb backtrace命令,因为我没有指定断点 是的,你可以 您所需要的只是在某个地方停止低级(正在调试的)程序 当您第一次连接到程序时,GDB将停止所有线程,您可以检查它们的位置。稍后,您可以点击Ctrl-C,然后再

我的程序运行不正常。 它看起来像是卡在无限循环中,或者是一个坏的互斥锁/解锁。但是,我不知道臭虫在哪里。 我尝试使用gdb进行调试

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

gdb是否有“动态”回溯的仪器?

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

是的,你可以

您所需要的只是在某个地方停止低级(正在调试的)程序


当您第一次连接到程序时,GDB将停止所有线程,您可以检查它们的位置。稍后,您可以点击
Ctrl-C
,然后再次查看所有线程。一个有用的命令是从程序的“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 ()  

当您认为代码被卡住时,您可以按
Ctrl-C
进入调试器,然后从那里显示bactrace、检查变量等。
printf
是另一种调试方法,尽管不如使用调试器那么理想。