我想要strace
一个正在运行的进程,我知道我可以用它来做strace -p <pid>
,但我相信该进程挂在了一些阻塞调用上,例如sem_wait()
在从未发布的信号量上,等等,并且 的输出strace
只有一行,例如:
Process 195 attached - interrupt to quit
poll([{fd=3, events=POLLIN}, {fd=6, events=POLLIN}], 2, 3600000^C <unfinished ...>
是否可以指定strace
输出更多行上下文/历史记录?我猜不是,因为我猜的strace
是实时输出和每个函数/指令,但我想我会要求确认。
答案1
例如,您还可以使用 附加到进程gdb
,并查看当前堆栈,这可能会有所帮助,特别是如果您使用调试符号编译了程序,您将获得更多信息。
例如,sleep
在后台运行,获取其 pid 并使用 pid 和目标文件运行 gdb,然后给出bt
回溯命令。要继续程序,请键入detach
.
$ sleep 999 &
[1] 17340
$ gdb -p 17340 /bin/sleep
Reading symbols from /bin/sleep...(no debugging symbols found)...done.
Attaching to program: /usr/bin/sleep, process 17340
Missing separate debuginfos, use: dnf debuginfo-install coreutils-8.24-8.fc23.x86_64
(gdb) bt
#0 0x00007fb84f43d510 in __nanosleep_nocancel () from /lib64/libc.so.6
#1 0x0000562be81da29f in rpl_nanosleep ()
#2 0x0000562be81da100 in xnanosleep ()
#3 0x0000562be81d7a1d in main ()
(gdb) detach
Detaching from program: /usr/bin/sleep, process 17340
(gdb) quit
答案2
你是对的,没有历史记录。
如果不明显,输出显示进程正在调用poll
,等待来自文件描述符 3 和 6 的输入。运行ls -l /proc/195/fd
应该显示这些描述符连接到的内容。