在遇到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给我程序中的行号,但这次没有。
答案 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)
无论如何,某个地方你的程序覆盖了堆栈,这通常很难调试......