1

我将一段单片代码拆分为动态加载的库并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++ 编译 main() 作为 c++ 代码。

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

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

我将不胜感激有关如何追捕该错误的建议。我的感觉是我在某处使列表迭代器失效,但我不确定。我认为它们不能失效,除了已删除的条目。

4

1 回答 1

1

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

我会使用的方法是:

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

我假设不涉及多个线程。当涉及线程时,可能会出现更多问题。当我在客户现场被聘用时,我总是让他们先初始化所有变量,然后再启动任何调试器。50% 的时间我可以在第 1 步之后回家。

于 2012-09-30T03:51:43.740 回答