调试在调试器内部不会发生的崩溃

时间:2012-09-29 09:37:28

标签: c++ debugging stl crash

我将一段单片代码拆分为动态加载的库和调用它的main()。我没有使用除stdc ++以外的其他库,也没有任何类,只是没有成员函数的模板化结构。我没有明确分配任何内存,也没有删除或释放代码中的任何内容。我确实使用list<T>中的擦除对象。

切换到库+主页后,我遇到间歇性崩溃。

*** glibc detected *** : free(): invalid pointer:

从回溯中看起来似乎是列表迭代器,但是名称错误的符号使得很难确定。

然而,它不会在gdb中崩溃,valgrind也不会检测到任何内存损坏或泄漏。

之前我没有构建共享库。这就是我正在使用的

g++ -fPIC -shared library_src.cpp -o libblaH.so

g++ main.cpp -lblaH

整个库都在一个源文件中,库函数包含在extern "C"块中,以便c用户可以访问,但是现在我用g ++编译main()作为c ++代码。

现在,当我添加优化选项时,-O2(特别是)我开始遇到崩溃。

我试过electricfence它说无效指针没有被malloc分配。

我很欣赏有关如何捕获这个错误的建议。我的感觉是我在一个列表迭代器无效,但我不确定。我认为除了删除的条目外,它们无法失效。

1 个答案:

答案 0 :(得分:1)

出于某种原因,这个尖叫声未经初始化给我。许多年前,当我按小时向公司收费以帮助调试崩溃时,就像这样,有一半时间,问题是未初始化的变量。

我将使用的方法是:

  1. 系统地初始化所有变量,并在声明时初始化它们ALL。绝对没有例外。
  2. 查找无效的迭代器。即指向已擦除对象的迭代器无效,不应使用。
  3. 寻找变量劫持。即,具有相同名称的变量在相同的翻译单元中工作正常但在单独的翻译单元中不起作用。
  4. 查找不安全的函数调用,例如sprintf,其中format string与参数不匹配。
  5. 使用#pragma选择性地禁用部分代码中的优化以缩小问题区域。有点像二分搜索;禁用上半场,仍然崩溃,下半场出现问题,禁用上半场和下半场的1/2 ......
  6. 我假设没有涉及多个线程。当线程涉及时,更多的事情可能会出错。当我在客户现场聘用时,我总是让他们在我启动任何调试器之前先初始化所有变量。 50%的时间我可以在第1步之后回家。