我正在使用第三方库编译我的应用程序,似乎有一些奇怪的行为表明堆栈溢出问题(这只是猜测)。
但是当我在崩溃应用程序的行之后添加一个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,并没有给我任何看起来可疑的东西。
似乎它正在崩溃,因为我正在尝试释放无效指针,但我不知道为什么指针无效,因为它释放了一个局部变量(即当它超出范围时)。指针因某种原因而被破坏,但这有点像在大海捞针。有没有什么好的技术可以尝试和融合这类问题?非常感谢!
答案 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
在阵列上进行过一次......
希望这有帮助, 最好的祝福, 汤姆。