查看運行中的python腳本的堆棧


轉載自:http://www.708luo.com/?p=32

對於c/c++程序,我們可以在運行過程中通過pstack來查看程序當前的執行堆棧。

那么對於python腳本呢?

 

方法一:

如果腳本是前台運行,可以直接Ctrl+c中止該腳本,即可查看當前的執行堆棧。

如果腳本是后台運行的,可以先fg jobid,然后直接Ctrl+c中止腳本。當前的執行堆棧會被打印到腳本后台運行時的輸出中(如果是./test.py &運行則是輸出到前台;如果是nohup ./test.py &運行則是輸出到nohup.out;如果加了輸出重定向,則是打印到重定向的輸出文件中)

 

方法二:

通過pdb完成,主要是為python腳本設置一個signal_handler,在其hang住的時候發送信號給它,然后進入debug模式。這時可以用w命令打印出當前執行堆棧。

參考這里http://blog.csdn.net/toymaker/article/details/6982131

不過這個方式,對后台運行的程序無效(不管是否先將程序轉到前台)。而且需要提前加部分代碼,對於已經在運行中的腳本無效。

好處是,如果程序是前台運行的,進入debug模式之后還可以繼續運行,而不像方法一直接就終止腳本了。(有一點要注意的是:如果腳本處於sleep狀態,經過信號處理之后sleep就被喚醒了)

 

方法三:

使用gdb打印python腳本當前執行堆棧。(不依賴gdb版本)

具體使用方式:

1. 編譯帶調試符號的python解析器:編譯python時使用make "CFLAGS=-g -fno-inline -fno-strict-aliasing"

2. 添加gdb中可以使用的函數:從這里下載文件,將其內容寫入到~/.gdbinit中(gdb 7.*版本無需此操作)

3. 運行gdb python <pid> 來attach到python進程

4. 運行pystack即可打印出堆棧

該方式不會終止腳本,所以如果可以的話,推薦使用這種方式。

該方法官方文檔在這里

 

方法四:

使用gdb打印python腳本當前執行堆棧。(需要gdb 7.*版本,未成功嘗試)

該方法在這里有說明。

嘗試時遇到" RuntimeError: No type named size_t."錯誤,關於該錯誤的說明,可以查看這里


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM