在main()之前崩溃

Crash before main()

本文关键字:崩溃 main      更新时间:2023-10-16

我的程序在main()函数之前崩溃。我使用"cerr"确定这一点:

int main(int argc, char **argv)
{
  cerr << " MAAIN " << endl;

来自gdb:的消息

   Reading symbols for shared libraries ...........+++............................ done
CA(34652) malloc: *** error for object 0x7fff76694860: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
Program received signal SIGABRT, Aborted.
0x00007fff88e1782a in __kill ()
(gdb) bt
#0  0x00007fff88e1782a in __kill ()
#1  0x00007fff8c4d2a9c in abort ()
#2  0x00007fff8c53184c in free ()
#3  0x00000001026a1db0 in std::basic_stringbuf<char, std::char_traits<char>, std::allocator<char> >::overflow ()
(gdb) 

我已经检查了"删除"answers"免费"功能的代码。所有删除都是这样检查完成的:

if (x) delete x;

请帮我回答两个问题:1.可能的问题是什么?2.如何找到它?(我有一个很大的代码,里面有很多文件和cmake用于编译)。

附言:我读过有没有办法让C/C++程序在main()之前崩溃?但是看看gdb-message,我想库是可以的。

cout不是检查程序崩溃位置的好方法,因为cout不会立即刷新其缓冲区,并且程序可能在cout之后但在刷新缓冲区之前崩溃。最好用cerr而不是cout 检查

在主函数之前,全局变量的构造函数将调用。所以,如果你认为它在开始前崩溃了,就看看它们。

另一种可能性是为调用主函数之前发生的主函数中的数组分配内存。如果它们是巨大的。必须使用new为它们分配内存。

std::basic_stringbuf<char, std::char_traits<char>...告诉我是std::string出错了。一种很可能的情况是,您有一些东西试图"释放"一个字符串,但该字符串没有正确构造,或者被数组的非拒绝使用所覆盖。

或者你依赖于不同源文件中的一些全局变量,所以你有这样的东西:

 // main.cpp:
 ... 
 extern string str;  // str lives in another .cpp file
 .... 
 myclass x(str);   // Construction using str. 
 // otherfile.cpp
 string str("foobar"); 

在这种情况下,在构造x时,可能无法构造str,并且字符串为"无效"。

类似的可能性还有很多。

这里的地址:0x7fff76694860在堆栈上。如果它总是相同的值,你可以试着追踪它在哪里。