ASAN 检测内存错误 debug
编译时添加选项
-fsanitize=address -fno-omit-frame-pointer
或在封装器中处理-c
时添加编译选项,在链接阶段添加-lasan
插桩后生成
.ll
后,在链接阶段需添加-lasan
选项,使其编译动态依赖库时有效链接阶段生成动态库时添加
-lasan
,使其链接到动态库
若运行时提示如下错误:==20926==ASan runtime does not come first in initial library list; you should either link runtime to your application or manually preload it with LD_PRELOAD.
Q: I’ve built my shared library with ASan. Can I run it with unsanitized executable?
A: Yes! You’ll need to build your library with dynamic version of ASan and then run executable with
LD_PRELOAD=path/to/asan/runtime/lib
.解决方法:
# 1. 找到libasan.so 动态库位置, 一般GCC都自带, # 一般在 /usr/lib/gcc/XXXX/XXX/libasan.so find / -name "libasan.so" # LD_PRELOAD=/usr/lib/gcc/x86_64-linux-gnu/9/libasan.so ./openssl
配合Objdump
,ida pro
等反汇编工具进行定位
#-d:将代码段反汇编
#-S:将代码段反汇编的同时,将反汇编代码和源代码交替显示,编译时需要给出-g,即需要调试信息。
#-C:将C++符号名逆向解析。
#-l:反汇编代码中插入源代码的文件名和行号。
#-j section:仅反汇编指定的section。可以有多个-j参数来选择多个section。
Objdump -C -S XXX.so > XXX.so.s
若遇到/bin/ld: DWARF error: invalid or unhandled FORM value: 0x25
- 更换 /bin/ld 为 llvm-lld
- 编译时增加-gdwarf-4选项
- 或者编译安装最新的
binutils2.4
版本 , 最新版本的已经支持DWARF-v5 参考我的文章Linux编译安装Binutils2.4版本
参考: DWARF error: invalid or unhandled FORM value: 0x25
配合addr2line
工具可以将地址转换为源代码位置
#0 0x49cb6d (/home/workhome/llvm_test/llvm-tutorial-opt/work07/dev/mywrapper/exec/taint_track_dev+0x49cb6d)
#1 0x4ea223 (/home/workhome/llvm_test/llvm-tutorial-opt/work07/dev/mywrapper/exec/taint_track_dev+0x4ea223)
#2 0x4ea1b5 (/home/workhome/llvm_test/llvm-tutorial-opt/work07/dev/mywrapper/exec/taint_track_dev+0x4ea1b5)
#3 0x4e9f14 (/home/workhome/llvm_test/llvm-tutorial-opt/work07/dev/mywrapper/exec/taint_track_dev+0x4e9f14)
#4 0x4e9b8f (/home/workhome/llvm_test/llvm-tutorial-opt/work07/dev/mywrapper/exec/taint_track_dev+0x4e9b8f)
#5 0x4e61a1 (/home/workhome/llvm_test/llvm-tutorial-opt/work07/dev/mywrapper/exec/taint_track_dev+0x4e61a1)
#6 0x4c2b00 (/home/workhome/llvm_test/llvm-tutorial-opt/work07/dev/mywrapper/exec/taint_track_dev+0x4c2b00)
#7 0x4cac2c (/home/workhome/llvm_test/llvm-tutorial-opt/work07/dev/mywrapper/exec/taint_track_dev+0x4cac2c)
#8 0x4c6801 (/home/workhome/llvm_test/llvm-tutorial-opt/work07/dev/mywrapper/exec/taint_track_dev+0x4c6801)
#9 0x4c4c83 (/home/workhome/llvm_test/llvm-tutorial-opt/work07/dev/mywrapper/exec/taint_track_dev+0x4c4c83)
#10 0x4c9304 (/home/workhome/llvm_test/llvm-tutorial-opt/work07/dev/mywrapper/exec/taint_track_dev+0x4c9304)
#11 0x4a0a97 (/home/workhome/llvm_test/llvm-tutorial-opt/work07/dev/mywrapper/exec/taint_track_dev+0x4a0a97)
#12 0x7f8927588082 (/lib/x86_64-linux-gnu/libc.so.6+0x24082) (BuildId: 1878e6b475720c7c51969e69ab2d276fae6d1dee)
$ addr2line -e <binary_file> 0x3df53d
/home/workhome/XXXX/track-impl-dev.cpp:2459