2014-01-21 17 views
0

我有一個運行在64位Linux機器上的Python守護進程。它正在崩潰。不是一個友好,直接的調試,Python異常堆棧跟蹤類型的崩潰,要麼 - 這是一個分段錯誤。 linux的dmesg的日誌有一個簡潔的驗屍:此係統上Python崩潰;如何解碼dmesg日誌中的段錯誤?

python2.7[27509]: segfault at 7fe500000008 ip 00007fe56644a891 sp 00007fe54e1fa230 error 4 in libpython2.7.so.1.0[7fe566359000+193000] 
python2.7[23517]: segfault at 7f5600000008 ip 00007f568bb45891 sp 00007f5678e55230 error 4 in libpython2.7.so.1.0[7f568ba54000+193000] 

libpython2.7.so.1.0具有符號,我可以運行objdump -d得到一個彙編語言轉儲。所以我很想知道哪個函數導致段錯誤。

我該如何解碼其中一個dmesg segfault聲明並找到錯誤的函數?一行說「7fe566359000 + 193000」,接下來說「7f568ba54000 + 193000」。我猜這意味着兩個段錯誤都來自同一個位置。 193000 = 0x2f1e8。我認爲0x2f1e8會導致Python庫彙編轉儲中的指令,但它不會; 0x2f1e8遠遠超出了反彙編的範圍。

+0

你找到了你的問題的答案? – Jasonw

回答

0

即從庫加載的基地址,所以你應該用.text加載地址由返回的它比較(例如)eu-readelf

[email protected] ~ % eu-readelf -S /usr/lib/libpython2.7.so 
There are 25 section headers, starting at offset 0x1b1a80: 

Section Headers: 
[Nr] Name     Type   Addr    Off  Size  ES Flags Lk Inf Al 
[ 0]      NULL   0000000000000000 00000000 00000000 0  0 0 0 
[….] 
[10] .text    PROGBITS  000000000003f220 0003f220 000e02a0 0 AX  0 0 16 
[….] 

,你應該能夠做到什麼就是用您與addr2line工具得到地址:

addr2line -e /usr/lib/libpython2.7.so 0x6e408 

在這種情況下,因爲我的圖書館的副本與你不同,所以地址是沒有意義的,我不能獲取數據。

當然,除非你有核心文件,否則你仍然不會得到完整的回溯。