如何确定流程正在执行哪些指令?


8

我知道strace和ltrace,但这仅告诉我进程正在执行的系统调用和库调用。我想确切地知道流程正在执行什么指令。可能是汇编,也可能是C与汇编之间的某种中间立场。假定二进制文件未使用调试符号进行编译,因此更可能选择第一个选项。

用例:进程似乎已挂起,strace或ltrace没有输出。确定过程是否在做“某事”。我意识到这可能很难确定,因为我想这类似于解决暂停问题。但是,有可能收集有用的数据。

第二个用例:好奇心。将整个汇编指令列表转储到文本列表中会很有趣。

我的猜测是我可以使用gdb来执行此操作,但不确定如何执行此操作,因为这与调试我编写的程序有关,而与使用gdb来检查正在运行的进程的运行状况有关。

操作系统是CentOS 6。


我相当确定您可以使用gdb或调试执行过程ddd。即使在汇编中,也没有调试符号。
Valmiky Arquissandas 2014年

Answers:


10

您可以使用gdb:命令执行此操作,ni并同时si运行一条指令。n对于大多数“ next”值,命令运行下一行代码。对于n(和相应的s),必须进行编译,以便调试符号出现在可执行文件中。

这个stackoverflow答案提供了一些在视觉上或多或少执行此操作的方法。

gdb命令:display/i $pc你是指令之前执行。display $pc在代码行之前显示ns执行它。


使用gdb -p <pid>附加到进程。
安赫尔

6

ps -l在进程ID上运行,然后检查S(“状态”)列。如果状态为R,则您的进程正在执行代码。如果该进程保持状态R并且strace没有显示它正在执行任何系统调用,则该进程将陷入非常长的可能无限的计算中。如果该进程处于且仍处于state D,则它将在系统调用中被阻止。有关过程状态的更多信息,请参见此过程STAT指示什么?“可中断睡眠”状态表示什么?如果“杀-9”不工作?

如果该进程正在运行长时间的计算,则可以使用Gdb(或其他调试器)查看其运行情况。如果可执行文件缺少调试信息(通常情况下,如果您不专门为此编译程序),则调试器将只能向您显示机器指令;如果可执行文件包含调试信息,则可以在堆栈跟踪中查看函数的名称,等等。要将Gdb附加到进程,请运行gdb /path/to/executable 1234where 1234是进程ID。该命令s使您一次可以执行一条指令。除非您是一名程序员并且对程序应该执行的操作有所了解,否则在这种情况下,您几乎不可能从Gdb中获得有用的信息。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.