Python崩溃了;如何在dmesg日志中解码segfault?

时间:2014-01-21 22:03:07

标签: python linux gdb segmentation-fault objdump

我在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段错误通知并找到错误的功能?一行显示“7fe566359000 + 193000”,下一行说“7f568ba54000 + 193000”。我猜这意味着两个段错误都来自同一个位置。 193000 = 0x2f1e8。我认为0x2f1e8会导致Python库程序集转储中的指令,但它没有; 0x2f1e8远远超出了反汇编的范围。

1 个答案:

答案 0 :(得分:0)

这是库加载基础的地址,因此您应该将其与.text的加载地址进行比较(例如)eu-readelf

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

在这种情况下,我无法获取数据,因为我的库副本与您的不同,所以地址没有意义。

除非您有核心文件,否则您仍然无法获得完整的回溯。