为什么我会遇到段故障?

时间:2013-02-26 04:47:42

标签: c gcc segmentation-fault

在遇到seg故障后,我使用了gdb a.out core命令。之后我使用了backtrace(bt),这就是gdb告诉我的内容

  

警告:核心文件可能与指定的可执行文件不匹配。

     

警告:在0xfbe8

处读取共享库列表条目时出错      

警告:在0x74c085ff

读取共享库列表条目时出错      

Core由'family.out smith.ged'生成。

     

程序以信号11,分段故障终止。

     

(weightign)0 0x08086a6 in count_records()

     

(gdb)bt

     

(weightign)0 0x080486a6 in count_records()

     

(weightign)1 0x08048906 in __libc_csu_init()

     

(weightign)2 0xbf85624c在??()

中      

(磅号)3 0xbf856310在? ()

     

Backtrace已停止:此框架内部的前一个框架(损坏的堆栈?)

有人可以告诉我一些可能导致这个段错误的信息吗?通常gdb给我程序中的行号,但这次没有。

1 个答案:

答案 0 :(得分:3)

这里可能发生的事情是你已经破坏了堆栈。程序的很多状态(包括告诉你你所使用的函数的所有堆栈帧)都驻留在堆栈上,因此一旦被覆盖,调试器就只有可用的损坏信息。

执行此操作的常用方法是将声明为局部变量的缓冲区溢出为字符串,例如

int main()
{
    char buf[4];
    return func1(buf);
}

int func1(char* theBuf)
{
    return func2(theBuf);
}

int func2(char* sameBufBackSomeplaceInTheStack)
{
     sprintf(sameBufBackSomeplaceInTheStack, "The stack is doomed.");
     return 0;
}

结果可能会有所不同,但在我执行此操作后,我的销毁堆栈在调试器中看起来像这样:

Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_INVALID_ADDRESS at address: 0x0000000000000000
0x0000000100000d00 in _mh_execute_header ()
(gdb) where
#0  0x0000000100000d00 in _mh_execute_header ()
#1  0x0000000000000000 in ?? ()
(gdb) 

无论如何,某个地方你的程序覆盖了堆栈,这通常很难调试......