我正在编译我的应用程序与第三方库,似乎有一些怪异的行为,表明堆栈溢出问题(这只是一个猜测)。如何在Linux中发现堆栈溢出问题?
但是,当我在添加打印语句后崩溃的应用程序运行良好。如果我删除打印语句(一个简单的COUT <
0x00007f48f2027276 in free() from /lib64/libc.so.6
我尝试添加下面的字符数组来代替print语句,这应用程序崩溃停止崩溃,以及,我再尝试打印的字符数组的内容:
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,它没有给我任何看起来可疑的东西。
它似乎是崩溃,因为我试图释放一个无效的指针,但我不知道为什么指针无效,因为它释放了一个局部变量(即当它超出范围)。指针由于某种原因被损坏,但有点像在大海捞针中寻找针。有没有什么好的技术可以尝试并聚合在这类问题上?非常感谢!
2010-02-10
bbazso
+1
你所看到的是堆腐败的典型症状。错误几乎肯定不在崩溃发生的代码中,甚至不在崩溃的代码附近。 –
2010-02-10 20:40:28
+0
那么我该如何诊断呢? –
2010-02-10 21:05:23
+0
Valgrind不会找到堆腐败问题(即如果我错误地删除了两次),那么为什么你会说这是一个堆问题? –
2010-02-11 14:49:29