调试调试器内部未发生的崩溃
Debugging a crash that does not happen inside a debugger
我将一段单片代码拆分为动态加载的库和调用它的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分配的。
我将感谢关于如何查找错误的建议。我的感觉是我在某个地方使列表迭代器失效,但我不确定是怎么失效的。我以为除了删除的条目外,它们不能作废。
出于某种原因,这对我来说是一个未初始化的变量。多年前,当我按小时向公司收取帮助调试崩溃的费用时,有一半的时间,问题是未初始化变量。
我会使用的方法是:
- 系统地初始化所有变量,并在声明时初始化它们ALL。绝对没有例外
- 查找无效的迭代器。即,指向被擦除对象的迭代器是无效的并且不应该被使用
- 查找变量劫持。即,具有相同名称的变量在同一翻译单元中工作良好,但在不同的翻译单元中不工作
- 查找不安全的函数调用,如sprintf,其中的格式字符串与参数不匹配
- 使用#pragma在部分代码中选择性地禁用优化,以缩小问题区域。有点像二进制搜索;禁用上半场,仍然崩溃,下半场出现问题,禁用上半场和下半场的1/2
我假设不涉及多个线程。当涉及到线程时,可能会出现更多错误。当我受雇于客户站点时,我总是让他们在启动任何调试器之前先初始化所有变量。50%的时间我可以在第一步之后回家。
- 正在VS调试器中监视映射条目
- 为什么我的 VS 代码调试器在我的C++代码周围弹跳?
- 带有 GDB 调试器的 VS 代码内存视图
- 为什么调试器引发"read access violation. this was nullptr"异常?
- VS2017调试器:没有地址,可能是由于编译器优化
- 当前不会命中断点。没有调试器目标代码类型的可执行代码与此文件关联
- 使用 Windows 10 和 MINGW 编译器在 VS Code 上使用 gdb 调试器进行调试时出错
- 如何在可视化代码中生成用于 c++ 开发的调试器?
- 为什么我的程序无法在GDB在线编译器/调试器或Visual Studio C++ 2019中运行
- Popen使Qt调试器崩溃
- 使用向量的函数崩溃,调试器说访问冲突读取位置
- QT项目在配置文件上崩溃,与发布和调试器一起运行
- 调试调试器内部未发生的崩溃
- 为什么在VS 2010 C++中,我的程序在调试器中运行良好时会崩溃,但在没有调试器的情况下运行时会崩溃
- iOS 调试器在文本字段中输入 0.0 时崩溃
- Visual Studio 11的图形调试器在OMSetRenderTarget中捕获时崩溃
- Visual Studio 2015调试器崩溃
- visual c++程序只在调试器中崩溃
- 在Windows Vista/View Studio 2005中,应用程序崩溃弹出窗口中没有JIT调试器的“调试”选项
- c++调试器在崩溃时停止在错误的地方,VS10 win7