• 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

  • 相关阅读:
    ASP.NET Core学习——2
    ASP.NET Core学习——1
    ASP.NET Core学习——前言
    数组的特性
    算法的5个层次
    VScode中写vue代码 Ctrl+/添加注释失效
    报错:[Vue warn]: Avoid mutating a prop directly since the value will be overwritten whenever the paren
    Vue中-下拉框可以选择可以填写
    Vue中对获取的数据进行重新排序
    感想
  • 原文地址:https://www.cnblogs.com/liangzige/p/15659107.html
Copyright © 2020-2023  润新知