【问题标题】:Identify variable causing memory error识别导致内存错误的变量
【发布时间】:2012-12-20 21:02:00
【问题描述】:

所以我现在遇到了几次奇怪的错误,我正在寻找一些好的方向来识别问题。

基本上我看到的是一个段错误。症状如下:

  1. 仅当程序处于发布模式时才会发生,而不是处于调试模式。
  2. 它显示为段错误,GDB 告诉我它在函数末尾的_list_release/_free()/free() 中。

    Program received signal SIGSEGV, Segmentation fault.

    0xb0328af8 in _list_release () from /usr/qnx650/target/qnx6/x86/lib/libc.so.3

    (gdb) bt

    0 0xb0328af8 in _list_release () from /usr/qnx650/target/qnx6/x86/lib/libc.so.3

    1 0xb032a464 in __free () from /usr/qnx650/target/qnx6/x86/lib/libc.so.3

    2 0xb0329f7d in free () from /usr/qnx650/target/qnx6/x86/lib/libc.so.3

  3. 我没有使用任何动态内存(Eigen(或其他库)中可能出现的内存除外

  4. 我可以在函数结束之前打印所有局部变量,所以它不是双重释放。

上次发生这种情况是内存故障,适合所有这些问题。恼人的是,这次我找不到问题所在。

我想做的是:

  1. 这将非常有用:如何在调试模式下强制出现此错误,然后 GDB 会更有帮助。
  2. 找出导致问题的小虫子的最佳方法是什么。 注意:我不能使用 valgrind,它在我使用的操作系统 (QNX) 上不起作用

任何帮助都会很棒。

【问题讨论】:

  • I can print all local variables just before the end of the function, so its not a double free. 双重释放是未定义的行为,因此不一定正确。
  • @chris 好的,我该如何测试呢?
  • 嗯,避免这些问题的最佳方法是立即使用 RAII 等来防止许多常见的段错误原因。总有 Clang 的 catch-undefined-behaviour 事情,这可能会有所帮助。
  • 您能否在功能更强大的平台上运行您的应用程序以进行测试?
  • 继续 chris 所说的 - 考虑一下:您使用一个向量,用数据填充它,然后释放其内部存储空间。内存仍在进程中,因此尝试读取它会成功,直到有人使用它,您甚至可以正确列出向量的内容。但是尝试释放向量(例如,离开其范围)将导致 AV。

标签: c++ debugging memory gdb segmentation-fault


【解决方案1】:

它显示为段错误,GDB 告诉我它在 _list_release/_free()/free() 中

通常,free() 中的任何崩溃是堆损坏的标志(双重释放、写入已释放的内存、释放未分配的(例如堆栈或全局)内存或溢出堆缓冲区)。

我没有使用任何动态内存

是的,你。您通过其他库间接执行此操作的事实无关紧要。

我可以在函数结束之前打印所有局部变量,所以它不是双重释放。

正如许多评论者已经说过的那样,您的结论并不成立:您可以很好地访问已释放的内存,它甚至可能仍然包含合理的值。

如何在调试模式下强制出现此错误,然后 GDB 会更有帮助。

  • 您可以使用“-O2 -g”(“发布”模式,但启用调试信息)进行构建。
  • GDB 可能不会更有帮助 - GDB 在调试堆损坏方面有点无用。

什么是追查小虫子的最佳方法

你有几个选择:

  • 将您的代码移植到可以使用ValgrindAddressSanitizer 的平台
  • 使用多种调试 malloc 实现之一(dmalloc、mpatrol 等)。 QNX 有one
  • 非常仔细地阅读代码,确保写入的数据不会超出预期。

【讨论】:

  • 所以带有调试标志的构建很有趣。你知道这是否可以用 CMAKE 设置吗?
  • @Ben 我确定可以使用CMAKE 完成,但我不知道细节。
  • 我可以补充一下,我已经将它转移到了 Ubuntu,但在 ubuntu 上没有发生错误。当代码在同事机器上构建时也不会发生(即使它是相同的编译器,以及 cmake 版本和操作系统)。有什么建议吗?
猜你喜欢
  • 1970-01-01
  • 2013-03-01
  • 2017-03-14
  • 1970-01-01
  • 2022-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多