在优化的生成中发现访问冲突,但该冲突未显示在调试生成(gcc)中
Finding an access violation in an optimized build, that does not show up in debug build (gcc)
我有(可能很常见(我的代码崩溃的问题:
unknown location(0): fatal error in "BaumIteration_OneDimensionCase": memory access violation at address: 0xfffffff8: no mapping at fault address
对于优化的构建(Linux下的gcc中的-O3(,但在调试构建中运行良好。我试着调试发布版本,但它没有提供任何有用的信息。解决这个问题的标准技术是什么?
在另一个问题上,有人建议使用valgrind。在这种特殊情况下我该如何使用它(如果这是正确的前进道路…(?
如前所述,存在一些代码错误,但由于生成的代码和使用的内存地址不同,它不会出现在未优化的调试构建中。
既然你问过valgrind,你应该使用的具体valgrind工具是memcheck。它对代码进行运行时分析。它肯定有助于在堆错误中找到任何可能的错误或警告,如内存泄漏、数组超负荷访问(读/写(、双重释放。。。
如果您在Linux平台上,以下是如何在valgrind:下运行二进制文件
valgrind --tool=memcheck --leak-check=full --show-reachable=yes --log-file=valgrind-log.txt -v --track-origins=yes <your binary file>
点击此处阅读更多关于valgrind memcheck的信息。
如果可能的话,如果您使用g++进行构建,请在构建过程中添加以下编译器选项:
-Wall -Wextra -pedantic -Wuninitialized
分析g++引发的错误/警告。它可能显示错误的可能原因。
祝调试好运!
这可能是一个即使在调试构建中也存在的问题,但由于内存布局和损坏的内容,它可能不会出现。作为起点,查看所有的动态分配、释放、数组、指针、未初始化的变量!
如果我遇到这个问题,我会一步一步地减少代码大小,看看问题是否存在,这样我就可以找到导致问题的位置!
另一个选项是Intel Inspector,它具有与Valgrind类似的功能。它配备了并行工作室,非常善于跟踪内存错误并指出问题所在。
如果你在廉价地工作,那可能没有帮助,但我们都使用我工作的英特尔编译器,所以与试图寻找相比,节省大量时间是一个梦想
相关文章:
- Qt 调试显示行号
- 图片不显示,关闭时出错 --> 调试断言失败!表达式:is_block_type_valid(标头>_block_use)
- 如何使C++调试语句显示在 gdb 控制台中
- 为什么调试时没有显示控制台窗口
- 我正在调试这个C++程序.编译器不再显示语法错误,但存在隐藏的逻辑错误
- 按值传递的参数在 Visual Studio 2010, C++ 的调试器中显示为通过引用传递
- VS Code C++程序在调试时不显示任何输出
- 为什么在类构造函数方法中,std::string 参数在调试时显示不同的结果?
- 可视化C++调试器未显示返回值
- GNU 调试器无法从显示中删除变量?
- 在 GDB 中调试生成的代码时显示原始源代码
- 值传递的参数在 Visual Studio 2015 x64 调试器中显示不正确
- 如何禁用调试控制台在我的代码中显示文件地址
- 为什么调试器在排序前显示问题
- C++ 显示字符串变量"<不完整类型>的调试窗口
- VS Code 上的简单 GDB C++调试失败,并显示 NullReferenceException
- LLDB调试器 - 定义自定义类型显示
- 程序在Visual Studio Community 2015中执行后,它会显示调试错误
- Mac OSX 上的 Eclipse CDT 未在首选项集中显示调试菜单
- 为什么 gdb 不能显示调试信息?