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

标签 c++ debugging stl crash

我将一段整体代码拆分为动态加载的库和 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" 中 block 以使其可供 c 用户访问,但现在我正在使用 g++ 将 main() 编译为 c++ 代码。

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

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

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

最佳答案

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

我会使用的方法是:

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

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

关于c++ - 调试不会在调试器内部发生的崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12651614/

相关文章:

c++ - Direct3D9 无法让垂直 fov 相机工作

javascript - 这是 chrome 中关于图像加载的错误吗?

c++ - 函数模板中的逻辑错误

c++ - 创建一组 1 个元素的最佳\最简单\最快的方法是什么? (C++)

debugging - 如何在轨迹测试中保留 session 和 CSRF token

c++ - 使用 Rabin Karp 进行模式搜索

c++ - 尝试添加数组元素给出零

c++ - g++ 编译不识别 '*' 使用 Armadillo 库进行矩阵乘法

c++ - if 语句不起作用并被跳到 else 部分

c++ - 如何在不更改命令行的情况下禁用断言?