好记性不如铅笔头

编程

Linux下使用addr2line来定位进程崩溃

废话不讲。

CONTENTS

测试代码:

main_entry.c

#include <stdio.h>
#include "mylib.h"

int main(void)
{
    test_funcA();
    return 0;
}

mylib.h

#ifndef MY_LIB_H
#define MY_LIB_H


void test_funcA(void);

#endif // MY_LIB_H

mylib.c

#include <stdio.h>
#include "mylib.h"


void test_funcA(void)
{
    printf("Init  test_funcA called\r\n");

    int *pX = 0;
    *pX = 100;

    printf("test_funcA called\r\n");
}

整体编译: 

cstriker1407@cstriker1407:~/workspace/libtest$ gcc -g main_entry.c mylib.c -o direct.bin
cstriker1407@cstriker1407:~/workspace/libtest$ 
cstriker1407@cstriker1407:~/workspace/libtest$ 
cstriker1407@cstriker1407:~/workspace/libtest$ ./direct.bin 
Init  test_funcA called
段错误 (核心已转储)
cstriker1407@cstriker1407:~/workspace/libtest$ dmesg | tail
........
[21840.270979] direct.bin[14218]: segfault at 0 ip 0000559b33b3c6d0 sp 00007ffe9c674dc0 error 6 in direct.bin[559b33b3c000+1000]

6D0 = 0000559b33b3c6d0 - 559b33b3c000
cstriker1407@cstriker1407:~/workspace/libtest$ addr2line -e direct.bin 6D0 -f -p
test_funcA 于 /home/cstriker1407/workspace/libtest/mylib.c:10

静态库:

cstriker1407@cstriker1407:~/workspace/libtest$ gcc -g -c mylib.c  -o mylib.o
cstriker1407@cstriker1407:~/workspace/libtest$ ar -rcs  libmylib.a  mylib.o
cstriker1407@cstriker1407:~/workspace/libtest$ gcc -g main_entry.c -L. -lmylib -o static.bin
cstriker1407@cstriker1407:~/workspace/libtest$ ./static.bin 
Init  test_funcA called
段错误 (核心已转储)
cstriker1407@cstriker1407:~/workspace/libtest$ dmesg | tail
........
[22252.413286] static.bin[14519]: segfault at 0 ip 0000563d3fee26d0 sp 00007ffc7a0a95d0 error 6 in static.bin[563d3fee2000+1000]

6D0 = 0000563d3fee26d0 - 563d3fee2000
cstriker1407@cstriker1407:~/workspace/libtest$ addr2line -e static.bin 6D0 -f -p
test_funcA 于 /home/cstriker1407/workspace/libtest/mylib.c:10

动态库:

cstriker1407@cstriker1407:~/workspace/libtest$ gcc -g -DPIC -fPIC  -c mylib.c -o mylib.o 
cstriker1407@cstriker1407:~/workspace/libtest$ gcc -g -shared -DPIC -fPIC -o libmylib.so mylib.o
cstriker1407@cstriker1407:~/workspace/libtest$ gcc -g main_entry.c  -L. -lmylib -o dynamic.bin
cstriker1407@cstriker1407:~/workspace/libtest$ export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:./
cstriker1407@cstriker1407:~/workspace/libtest$ldd dynamic.bin 
	linux-vdso.so.1 =>  (0x00007ffcdd78a000)
	libmylib.so (0x00007f8ef5fe3000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f8ef5bf7000)
	/lib64/ld-linux-x86-64.so.2 (0x000055f746964000)
cstriker1407@cstriker1407:~/workspace/libtest$ ./dynamic.bin 
Init  test_funcA called
段错误 (核心已转储)
cstriker1407@cstriker1407:~/workspace/libtest$ dmesg | tail
.........
[22598.662423] dynamic.bin[14722]: segfault at 0 ip 00007f91f48bb6a0 sp 00007ffc18dd83b0 error 6 in libmylib.so[7f91f48bb000+1000]
cstriker1407@cstriker1407:~/workspace/libtest$ addr2line -e libmylib.so 6a0 -f -p
test_funcA 于 /home/cstriker1407/workspace/libtest/mylib.c:10

 

发表评论

4 + 4 =

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据