我有以下问题,我的C程序:某处是堆栈溢出。尽管未优化和调试带符号编译时,程序与此输出退出(内或GDB的Linux上的外侧):

计划用信号SIGSEGV,分割过错终止。 该程序不再存在。

我可以检测,这实际上是堆栈溢出正在运行的valgrind通过该程序的唯一途径。有什么办法,我可以以某种方式强制操作系统转储调用堆栈跟踪,这将有助于我找到问题?

不幸的是,GDB不允许我容易地挖掘到程序任一

有帮助吗?

解决方案

如果您允许系统核心转储文件,你可以分析他们使用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 ()
...

我看到一个严重生成的核心文件,它具有一个不正确的堆栈跟踪,但在大多数情况下,BT将产生一堆递归调用的相同的方法。某些次

在核心文件可能有不同的名称,其中可能包括进程ID,它取决于你当前的系统内核的默认配置,但可以与控制(root身份运行或使用sudo):

$ sysctl kernel.core_uses_pid=1

其他提示

使用GCC你可以试试这个:

  

-fstack-protector结果       发出额外的代码来检查缓冲区溢出,如堆栈溢出攻击。这是通过添加一个保护变量与弱势对象的功能来完成。这包括调用alloca函数,并用大于8个字节的缓冲器的功能。进入功能时,卫兵被初始化,然后检查当函数退出。如果保护检查失败,错误消息被打印,并且程序退出。

     

-fstack-protector-all结果       像-fstack保护器不同之处在于所有功能都受到保护。

HTTP:// GCC。 gnu.org/onlinedocs/gcc-4.3.3/gcc/Optimize-Options.html#Optimize-Options

当一个程序SIGSEGV模具,它通常将转储在Unix芯。你可以加载芯到调试程序,并检查电池组的状态?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top