在优化的生成中发现访问冲突,但该冲突未显示在调试生成(gcc)中

Finding an access violation in an optimized build, that does not show up in debug build (gcc)

本文关键字:显示 调试 冲突 gcc 优化 发现 访问冲突      更新时间:2023-10-16

我有(可能很常见(我的代码崩溃的问题:

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类似的功能。它配备了并行工作室,非常善于跟踪内存错误并指出问题所在。

如果你在廉价地工作,那可能没有帮助,但我们都使用我工作的英特尔编译器,所以与试图寻找相比,节省大量时间是一个梦想