![](/img/trans.png)
[英]how to copy os.system('cat /var/log/dmesg') to a variable
[英]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通知之一並找到錯誤的功能? 一行顯示“ 7fe566359000 + 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.