1

出现段错误后,我使用了 gdb a.out 核心命令。之后我使用了回溯(bt),这就是 gdb 告诉我的

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

警告:读取 0xfbe8 处的共享库列表条目时出错

警告:在 0x74c085ff 读取共享库列表条目时出错

核心由“family.out smith.ged”生成。

程序以信号 11 终止,分段错误。

(磅符号)0 0x08086a6 in count_records ()

(gdb) BT

(磅符号)0 0x080486a6 in count_records()

(磅符号)1 0x08048906 in __libc_csu_init ()

(井号)2 0xbf85624c in ??()

(磅符号)3 0xbf856310 在 ?? ()

回溯停止:此帧内部的前一个帧(损坏的堆栈?)

有人可以给我一些关于可能导致此段错误的原因吗?通常 gdb 会给我程序中的行号,但这次没有。

4

1 回答 1

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) 

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

于 2013-02-26T05:11:38.297 回答