2010-07-07 57 views
3

我很想知道pstack命令如何打印所有在PID下运行的线程的堆栈跟踪?pstack命令如何工作?

它必须与gdb的方式不同,因为进程在gdb环境内运行,但pstack在执行进程后执行。

+0

http://www.linuxcommand.org/man_pages/pstack1.html – 2014-03-31 04:59:50

回答

3

这和gdb一样。 pstack使用ptrace,它允许外部进程附加到已知的pid并打印出信息(通过当前寄存器可以知道堆栈)。

如果您想确切知道它是如何完成的,请查找有关ptrace的信息。

另外,进程并不真正运行“内部gdb”。您可以通过运行gdb executable pid将gdb附加到正在运行的进程中,而不会造成太大麻烦。

+0

是的,对不起,语言处理的使用不运行内部gdb ...但我的疑问仍然存在,ptrace跟踪进程所作的系统调用,那么它怎么能给出pid内所有线程的堆栈跟踪? – 2010-07-07 10:44:35

+0

这是'strace',负责跟踪系统调用。 'ptrace'可以做更多的事情http://linux.die.net/man/2/ptrace - 这是围绕另一个进程的普遍方式。它可以获取/设置外部进程的寄存器,内存范围,指令指针等等。因此,在堆栈中叩击几乎就像获得SP并读取(下)内存一样简单。 – viraptor 2010-07-07 14:47:51