如何在linux中找到堆栈溢出问题?

时间:2010-02-10 20:35:30

标签: c++ debugging overflow

我正在使用第三方库编译我的应用程序,似乎有一些奇怪的行为表明堆栈溢出问题(这只是猜测)。

但是当我在崩溃应用程序的行之后添加一个print语句时运行正常。如果我删除了print语句(一个简单的cout<<“print something”<< endl; statement),应用程序崩溃了

0x00007f48f2027276 in free () from /lib64/libc.so.6

我尝试添加以下char数组来代替print语句,这也停止了崩溃,然后我尝试打印char数组的内容:

char ben[8000] = {0};
memset(&ben, 0, sizeof (ben));

for (int y = 0; y < 8000; ++y)
{
if (ben[y] != 0)
  PRINT ("CHAR[%d]=%d", y, ben[y]);
}

查看数组中是否有任何内容被破坏,但这种方法不起作用。所以我想知道是否有更好的方法来检测这是否是堆栈溢出问题?

我用-fstack-protector-all(lib和我的代码)重新编译了应用程序,但这并没有发现任何东西。我也尝试了valgrind,并没有给我任何看起来可疑的东西。

似乎它正在崩溃,因为我正在尝试释放无效指针,但我不知道为什么指针无效,因为它释放了一个局部变量(即当它超出范围时)。指针因某种原因而被破坏,但这有点像在大海捞针。有没有什么好的技术可以尝试和融合这类问题?非常感谢!

5 个答案:

答案 0 :(得分:5)

使用-fstack-protector-all进行编译将让程序通知您堆栈是否被粉碎。

答案 1 :(得分:2)

你应该给valgrind的Memcheck工具。这是一个内存调试器,如果你访问内存你不应该知道它(堆栈溢出,双重释放,访问释放的指针,数组溢出......)

答案 2 :(得分:0)

闻起来像指针损坏问题,而不是堆栈溢出。如果应用程序很大,请尝试在主要函数的顶部插入return以限制执行的代码量。

一旦可疑代码的范围受到限制,请仔细检查指针管理。特别要确保发送到free()或析构函数的任何指针都没有事先被删除。

答案 3 :(得分:0)

如果memcheck / valgrind没有显示任何内容,您可以随时启动gdb并查看程序集。

要检查的其他一些事项是未初始化的变量,已知这些变量会导致意外错误。也可以使用-Wall,如果你还没有,可能会有所改变。

它确实听起来像一个糟糕的指针问题。有关一些好的提示,请参阅this site

答案 4 :(得分:-4)

这是一个非常可疑的界限,我认为应该是

memset(&ben, 0, sizeof(ben) - 1);

你有memset在阵列上进行过一次......

希望这有帮助, 最好的祝福, 汤姆。