0

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

unknown location(0): fatal error in "BaumIteration_OneDimensionCase": memory access violation at address: 0xfffffff8: no mapping at fault address

用于优化构建(Linux 下 gcc 中的 -O3),但在调试构建中工作正常。我试图调试发布版本,但它只是没有提供任何有用的信息。解决此问题的标准技术是什么?

在其他一些问题中,有人建议使用valgrind。在这种特殊情况下我该如何使用它(如果这是正确的前进方式......)?

4

3 回答 3

1

如前所述,存在一些代码错误,但由于生成的代码不同,使用的内存地址不同,它不会出现在未优化的调试版本中。

由于您询问了 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++ 抛出的错误/警告。它可能显示错误的可能原因。

调试好运!

于 2013-02-26T11:28:46.340 回答
0

即使在调试版本中也可能存在问题,但由于内存布局和损坏的内容,它可能不会出现。作为起点,看看所有的动态分配、释放、数组、指针、未初始化的变量!

如果我遇到这个问题,我会逐步减少代码大小,看看问题是否存在,这样我就可以找到导致问题的位置!

于 2013-02-25T11:09:44.460 回答
0

另一种选择是 Intel Inspector,它具有与 Valgrind 类似的功能。它带有并行工作室,非常擅长跟踪内存错误并指出问题所在。

如果您正在以便宜的价格工作,那可能无济于事,但我们都在我工作的地方使用英特尔编译器,所以节省大量时间而不是试图追捕它是一个梦想

于 2019-02-12T15:07:51.850 回答