我在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远远超出了反汇编的范围。
答案 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
在这种情况下,我无法获取数据,因为我的库副本与您的不同,所以地址没有意义。
除非您有核心文件,否则您仍然无法获得完整的回溯。