【发布时间】:2010-02-10 20:35:29
【问题描述】:
我正在使用第三方库编译我的应用程序,似乎有一些奇怪的行为表明存在堆栈溢出问题(这只是猜测)。
但是当我在崩溃的行之后添加一个打印语句时,应用程序运行良好。如果我删除打印语句(一个简单的 cout 上崩溃
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,它没有给我任何看起来可疑的东西。
它似乎崩溃了,因为我试图释放一个无效的指针,但我不知道为什么指针是无效的,因为它正在释放一个局部变量(即当它超出范围时)。指针被损坏是有原因的,但这有点像大海捞针。有没有什么好的技术可以尝试解决这类问题?非常感谢!
【问题讨论】:
-
您看到的是堆损坏的典型症状。错误几乎肯定不在发生崩溃的代码中,甚至不在发生崩溃的代码附近。
-
Valgrind 不会发现堆损坏问题(即,如果我错误地删除了两次)那你为什么说这是一个堆问题?
-
我想知道 StackOverflow 有多少堆栈溢出问题?
-
@John,我真的很想知道。另外:我们是否需要一个“NOT-Meta”标签来表明它不属于 meta-stackoverflow? B-)(是的,显然,实际上阅读帖子,甚至主题,都会解决这个问题......)