轉載自: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."錯誤,關於該錯誤的說明,可以查看這里。