如何调试_FORTIFY_SOURCE=2下的"*** buffer overflow detected ***"错误?
定位
_FORTIFY_SOURCE=2触发的缓冲区溢出错误位置 以下是几种直接有效的定位方法:
1. 启用核心转储并分析
- 先开启核心转储:在终端执行
ulimit -c unlimited,程序崩溃时会生成core文件 - 用调试器加载核心文件:
gdb ./program_name core - 在gdb中输入
bt(backtrace)命令,查看完整调用栈,直接定位触发溢出的代码行
2. 编译时保留调试符号
编译程序时添加-g参数保留调试信息,示例命令:
gcc -g -D_FORTIFY_SOURCE=2 your_code.c -o program_name
崩溃后直接用gdb启动程序:gdb ./program_name,输入run让程序运行,崩溃时gdb会自动停在出错位置,再用bt查看调用栈即可。
3. 捕获程序错误输出细节
_FORTIFY_SOURCE=2触发的溢出检测通常会在标准错误输出中打印更多细节(如调用的函数、内存地址),可将错误输出重定向到文件查看:
./program_name 2> error.log
打开error.log查看详细报错,结合调试符号能快速缩小定位范围。
4. 借助地址 sanitizer 精准检测
编译时添加-fsanitize=address参数,ASAN会更精准地定位溢出位置,还能显示溢出的具体字节数:
gcc -g -D_FORTIFY_SOURCE=2 -fsanitize=address your_code.c -o program_name
运行程序后,ASAN会直接在终端输出出错代码行、调用栈,甚至指明被越界访问的缓冲区。
内容的提问来源于stack exchange,提问作者user180574
相关产品推荐
相关产品推荐

