cat*_*nts 8 process debugging gdb strace ltrace
我知道 strace 和 ltrace,但这只能分别告诉我进程正在执行哪些系统调用和库调用。我想确切地知道进程正在执行哪些指令。如果可能的话,要么是汇编,要么是 C 和汇编之间的某种中间立场。假设二进制文件没有用调试符号编译,所以更有可能倾向于第一个选项。
用例:进程似乎挂起,strace 或 ltrace 没有输出。确定进程是否正在做“某事”。我意识到这可能很难确定,因为我认为这类似于解决停机问题。但是,有可能收集有用的数据。
第二个用例:好奇心。将整个汇编指令列表转储到文本列表会很有趣。
我的猜测是我可以使用 gdb 来做到这一点,但不确定如何,因为这不是关于调试我编写的程序,而是关于使用 gdb 检查正在运行的进程的健康状况。
操作系统是 CentOS 6。
Bru*_*ger 10
您可以使用gdb: 命令执行此操作ni并si一次运行一条指令。命令n运行下一行代码,对于“next”的大多数值。对于n(和相应的s),您必须进行编译,以便调试符号出现在可执行文件中。
这个 stackoverflow 答案提供了几种或多或少在视觉上执行此操作的方法。
该gdb命令:display/i $pc你是指令之前执行。display $pc显示之前的代码行n或s执行它。
ps -l在进程 ID 上运行并检查S(“状态”)列。如果状态为R,则您的进程正在执行代码。如果进程保持在状态R并且strace没有显示它正在执行任何系统调用,那么进程就会陷入一个很长的、可能是无限的计算中。如果进程处于并保持在 state D,则它会在系统调用中被阻塞。有关进程状态的更多信息,请参阅此进程 STAT 表示什么?,“可中断睡眠”状态表示什么?而如果“杀-9”不工作?.
如果进程正在运行长时间计算,您可以使用 Gdb(或其他调试器)来查看它在做什么。如果可执行文件缺少调试信息(如果您没有专门为此编译程序,通常就是这种情况),那么调试器将只能向您显示机器指令;如果可执行文件包含调试信息,您将能够在堆栈跟踪等中看到函数的名称。要将 Gdb 附加到进程,请运行gdb /path/to/executable 1234where 1234is the process ID。该命令s可让您一次执行一条指令。除非您是一名程序员并且对程序应该做什么有些熟悉,否则在这种情况下您几乎不可能从 Gdb 中获得有用的信息。