调试调试器内部未发生的崩溃

Debugging a crash that does not happen inside a debugger

本文关键字:崩溃 调试器 内部 调试      更新时间:2023-10-16

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

在切换到library+main之后,我会间歇性崩溃。

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

从回溯来看,似乎涉及了一个列表迭代程序,但名称混乱的符号使其难以确定。

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

我以前从未构建过共享库。这就是我正在使用的

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

g++ main.cpp -lblaH

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

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

我试过electricfence,它说无效指针不是由malloc分配的。

我将感谢关于如何查找错误的建议。我的感觉是我在某个地方使列表迭代器失效,但我不确定是怎么失效的。我以为除了删除的条目外,它们不能作废。

出于某种原因,这对我来说是一个未初始化的变量。多年前,当我按小时向公司收取帮助调试崩溃的费用时,有一半的时间,问题是未初始化变量。

我会使用的方法是:

  1. 系统地初始化所有变量,并在声明时初始化它们ALL。绝对没有例外
  2. 查找无效的迭代器。即,指向被擦除对象的迭代器是无效的并且不应该被使用
  3. 查找变量劫持。即,具有相同名称的变量在同一翻译单元中工作良好,但在不同的翻译单元中不工作
  4. 查找不安全的函数调用,如sprintf,其中的格式字符串与参数不匹配
  5. 使用#pragma在部分代码中选择性地禁用优化,以缩小问题区域。有点像二进制搜索;禁用上半场,仍然崩溃,下半场出现问题,禁用上半场和下半场的1/2

我假设不涉及多个线程。当涉及到线程时,可能会出现更多错误。当我受雇于客户站点时,我总是让他们在启动任何调试器之前先初始化所有变量。50%的时间我可以在第一步之后回家。