2010-07-07 80 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