簡體   English   中英

Python崩潰了; 如何在dmesg日志中解碼段錯誤?

[英]Python crashed; how to decode segfault in dmesg log?

我有一個在64位Linux機器上運行的Python守護程序。 它崩潰了。 Python異常堆棧跟蹤也不是一種友好,易於調試的崩潰,這是分段錯誤。 Linux的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通知之一並找到錯誤的功能? 一行顯示“ 7fe​​566359000 + 193000”,下一行顯示“ 7f568ba54000 + 193000”。 我猜這意味着兩個段錯誤都來自同一位置。 193000 = 0x2f1e8。 我以為0x2f1e8會在Python庫匯編轉儲中導致一條指令,但事實並非如此。 0x2f1e8超出了拆卸范圍。

那是庫加載的基礎地址,因此您應該將其與eu-readelf返回的.text的加載地址進行比較:

flame@saladin ~ % 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

在這種情況下,我無法獲取數據,因為我的庫副本與您的庫副本不同,因此地址沒有意義。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM