关于内存泄漏、内存越界,有个gcc默认的工具Sanitize工具
编译时使用选项
地址错误: -fsanitize=address
内存错误: -fsanitize=memory
内存泄漏: -fsanitize=leak
线程竞速问题: -fsanitize=thread
未定义问题: -fsanitize=undefined
为方便回溯可同时添加保留函数指针标志:-fno-omit-frame-pointer
一般在CFLAGS 中添加 上述选项,特别是address选项。
# -fsanitize-recover=address:一般后台程序为保证稳定性,不能遇到错误就简单退出,而是继续运行,采用该选项支持内存出错之后程序继续运行,需要叠加设置ASAN_OPTIONS=halt_on_error=0才会生效;若未设置此选项,则内存出错即报错退出
Sanitizer的选项通过环境变量控制,例如
ASAN_OPTIONS=verbosity=1:malloc_context_size=20 ./a.out
其他的选项参考以下内容
ASAN_OPTIONS=help=1 ./a.out
export ASAN_OPTIONS=halt_on_error=0:detect_leaks=1
For the list of common sanitizer options see