【问题标题】:Use gdb to find where program stuck使用 gdb 查找程序卡住的位置
【发布时间】:2014-07-17 18:11:13
【问题描述】:

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

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

gdb 是否有“即时”回溯工具?

【问题讨论】:

  • 当你认为你的代码卡住了,你可以按Ctrl-C 进入调试器,然后从那里显示回溯、检查变量等。
  • printf 是另一种调试方法,虽然不如使用调试器理想。

标签: c debugging gdb


【解决方案1】:

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

是的,你可以。

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

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

【讨论】:

    【解决方案2】:

    从程序的“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 ()  
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-19
      • 1970-01-01
      • 1970-01-01
      • 2014-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多