linux crash 栈分析

dump xxx.so中的符号表, dump命令根据自己的需求选择合适的:
1. 导出符号表命令1:./arm-himix200-linux-objdump -d /home/username/work/sample.so > /home/username/libxx_sample.txt
2. 导出符号表命令2:aarch64-linux-gnu-objdump -d libxxx.so > sample.txt

crash栈信息:
--> Caught signal 6 (unknown origin) <--
backtrace(size=16)
/system/object/lib/libxxx.so(+0x503a24) [0x7fabfd9a24]
/system/object/lib/libxxx.so(+0x504acc) [0x7fabfdaacc]
linux-vdso.so.1(__kernel_rt_sigreturn+0) [0x7fafffc6c0]
/lib/aarch64-linux-gnu/libc.so.6(gsignal+0xe0) [0x7fa9b6db48]
/lib/aarch64-linux-gnu/libc.so.6(abort+0x110) [0x7fa9b5be68]
/usr/lib/aarch64-linux-gnu/libstdc++.so.6(_ZN9__gnu_cxx27__verbose_terminate_handlerEv+0x188) [0x7fa9e14278]
/usr/lib/aarch64-linux-gnu/libstdc++.so.6(+0x9dfac) [0x7fa9e11fac]
/usr/lib/aarch64-linux-gnu/libstdc++.so.6(+0x9e000) [0x7fa9e12000]
/usr/lib/aarch64-linux-gnu/libstdc++.so.6(+0x9e2cc) [0x7fa9e122cc]
/usr/lib/aarch64-linux-gnu/libstdc++.so.6(_ZSt19__throw_logic_errorPKc+0x48) [0x7fa9e0df98]
/usr/lib/aarch64-linux-gnu/libstdc++.so.6(+0x13234c) [0x7fa9ea634c]
/system/object/lib/libxxx.so(_ZN13ObjectService2ER14EVENT_T+0x1824) [0x7fac162588]
/system/object/lib/libxxx.so(_ZN13ObjectService6+0x124) [0x7fac1594e8]
/system/object/lib/libxxx.so(_ZN13ObjectService5ThreadEPv+0x20) [0x7fac159560]
/lib/aarch64-linux-gnu/libpthread.so.0(+0x8888) [0x7faa2f6888]
/lib/aarch64-linux-gnu/libc.so.6(+0xd078c) [0x7fa9c0878c]

注释:_ZN13ObjectService6Ev 为符号 +0x1824 表示地址偏移


符号表信息片段:
00000000004a96b0 <_ZN17func14SendMsgEb@plt>:
68c4c0: 97f8747c bl 4a96b0 <_ZN17func14SendMsgEb@plt>
68c4d8: 97f87476 bl 4a96b0 <_ZN17func14SendMsgEb@plt>
00000000006c0ed0 <_ZN17func14SendMsgEb@@Base>:
6c0ee4: 54000080 b.eq 6c0ef4 <_ZN17func14SendMsgEb@@Base+0x24>
6c0ef0: 1400000a b 6c0f18 <_ZN17func14SendMsgEb@@Base+0x48>
6c0f00: 540000cc b.gt 6c0f18 <_ZN17func14SendMsgEb@@Base+0x48>

注释:00000000004a96b0 和 00000000006c0ed0表示是函数本身执行的地方,其他为调用的地方


执行命令找出符号库中的地址:
nm out/build/lib/libxxx.so |grep <symbol>

用addr2line工具找出出错的源文件及代码行号(要用上面命令的地址+偏移)
addr2line -e out/build/lib/libxxx.so -f 762340


aarch64-linux-gnu-addr2line 工具可以查看符号表中的地址对应的源文件函数位置,需加参数 -a
@<file> Read options from <file>
-a --addresses Show addresses
-b --target=<bfdname> Set the binary file format
-e --exe=<executable> Set the input file name (default is a.out)
-i --inlines Unwind inlined functions
-j --section=<name> Read section-relative offsets instead of addresses
-p --pretty-print Make the output easier to read for humans
-s --basenames Strip directory names
-f --functions Show function names
-C --demangle[=style] Demangle function names
-h --help Display this information
-v --version Display the program's version


linux-gnu工具链介绍:
aarch64-linux-gnu-addr2line aarch64-linux-gnu-elfedit aarch64-linux-gnu-gcov aarch64-linux-gnu-ld.bfd aarch64-linux-gnu-size
aarch64-linux-gnu-ar aarch64-linux-gnu-g++ aarch64-linux-gnu-gcov-dump aarch64-linux-gnu-ld.gold aarch64-linux-gnu-strings
aarch64-linux-gnu-as aarch64-linux-gnu-gcc aarch64-linux-gnu-gcov-tool aarch64-linux-gnu-nm aarch64-linux-gnu-strip
aarch64-linux-gnu-c++ aarch64-linux-gnu-gcc-6.3.1 aarch64-linux-gnu-gdb aarch64-linux-gnu-objcopy
aarch64-linux-gnu-c++filt aarch64-linux-gnu-gcc-ar aarch64-linux-gnu-gfortran aarch64-linux-gnu-objdump
aarch64-linux-gnu-cpp aarch64-linux-gnu-gcc-nm aarch64-linux-gnu-gprof aarch64-linux-gnu-ranlib
aarch64-linux-gnu-dwp aarch64-linux-gnu-gcc-ranlib aarch64-linux-gnu-ld aarch64-linux-gnu-readelf

原文地址:https://www.cnblogs.com/liangzige/p/15659107.html