1. 在linux 下执行make 生成可执行文件test 和动态库libtest.so, 其中test执行时会链接libtest.so

2. 在终端下运行程序test 时会崩溃退出,报segment falut。此时用dmesg 找出程序信息的退出信息

dmesg | grep "test" -i
# 输出信息如下:
[6006.438055] test[2106] segfault at a0df3f64 ip b6f5d74c sp a0df3f68 error 6 in libtest.so[b6eeb000+18d000]

3. 确认哪个文件发生的崩溃问题,确认方法如下:

    在dmesg信息里找到关键字in, in 后面为发生崩溃的文件名

4. 如果是可执行文件发生崩溃,则可用如下命令找到发生崩溃的位置:

addr2line -C -f -s -e 可执行文件名 ip
# ip 为 dmesg 信息中 ip 后面的数值, 如此例中为 b6f5d74c

5. 如果是动态库文件发生崩溃,则可用如下命令找到发生崩溃的位置:

addr2line -C -f -s -e 动态库文件名 pos
# pos: 为 dmesg 信息中 ip减库的偏移位置,库的和偏移位置为 dmesg信息 xxx.so后面中括号里面的第一个数值.
# 如此例中为 b6f5d74c - b6eeb000 = 7274C


6. 试例: 

# addr2line -C -f -s -e /test/libtest.so 7274C
free()
test.cpp: 12




Tags: 段错误 Segmentation Fault, 段错误, dmesg, addr2line

Related Posts:

Leave a Comment