pstack 命令如何工作?
我很好奇 pstack 命令如何打印在 PID 下运行的所有线程的堆栈跟踪?
它必须与 gdb 的方式有所不同,因为进程在 gdb 环境内运行,但 pstack 是在进程执行后执行的。
I am curious to find how does the pstack command prints the stack trace of all the threads running under the PID?
It has to be someway different than the way gdb does since the process runs inside the gdb environment, but pstack is executed after the execution of the process.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
它的总体思路与gdb 相同。 pstack 使用 ptrace,它允许外部进程附加到已知的 pid 并打印出信息(通过当前寄存器知道堆栈)。
如果您想确切地了解它是如何完成的,请查找有关
ptrace
的信息。此外,进程并不真正在“gdb 内部”运行。您可以通过运行
gdb可执行pid
将gdb附加到正在运行的进程,而不会有太多麻烦。It's the same general idea as gdb. pstack uses ptrace, which allows an external process to attach to a known pid and print out the information (stack is known via the current registers).
If you want to know exactly how it's done, look for information about
ptrace
.Also, processes don't really run "inside the gdb". You can attach gdb to a running process without much trouble by running
gdb executable pid
.pstack 打印与 cat /proc/"pid"/tasks/*/stack 类似的输出,因此它很可能读取 procfs 而不是使用 ptrace。
pstack print similar output as cat /proc/"pid"/tasks/*/stack so it most likely that it read the procfs rather than using the ptrace.