Dav*_*eas 17
如果您允许系统转储核心文件,您可以使用gdb分析它们:
$ ulimit -c unlimited # bash sentence to allow for infinite sized cores
$ ./stack_overflow
Segmentation fault (core dumped)
$ gdb -c core stack_overflow
gdb> bt
#0 0x0000000000400570 in f ()
#1 0x0000000000400570 in f ()
#2 0x0000000000400570 in f ()
...
Run Code Online (Sandbox Code Playgroud)
有时我看到一个生成错误的核心文件有不正确的堆栈跟踪,但在大多数情况下,bt会产生一堆对同一方法的递归调用.
核心文件可能有一个不同的名称,可能包含进程ID,它取决于当前系统中内核的默认配置,但可以使用(以root身份运行或使用sudo)进行控制:
$ sysctl kernel.core_uses_pid=1
Run Code Online (Sandbox Code Playgroud)
有了GCC你可以试试这个:
-fstack-protector
发出额外的代码来检查缓冲区溢出,例如堆栈粉碎攻击.这是通过向具有易受攻击对象的函数添加保护变量来完成的.这包括调用alloca的函数,以及大于8字节的缓冲区的函数.输入功能时会初始化防护装置,然后在功能退出时进行检查.如果防护检查失败,则会打印错误消息并退出程序.
-fstack-protector-all
与-fstack-protector类似,但所有功能都受到保护.
http://gcc.gnu.org/onlinedocs/gcc-4.3.3/gcc/Optimize-Options.html#Optimize-Options
| 归档时间: |
|
| 查看次数: |
7531 次 |
| 最近记录: |