gpt4 book ai didi

c++ - 识别导致内存错误的变量

转载 作者:行者123 更新时间:2023-11-30 02:01:20 25 4
gpt4 key购买 nike

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

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

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

    程序收到信号 SIGSEGV,段错误。

    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. 这将非常有用:如何在 Debug模式下强制执行此错误,那么 GDB 会更有帮助。
  2. 找出导致问题的小错误的最佳方法是什么。 注意:我不能使用 valgrind,它不能在我使用的操作系统 (QNX) 上运行

任何帮助都会很棒。

最佳答案

It appears as a segfault and GDB tells me that it is in _list_release/_free()/free()

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

I am not using any dynamic memory

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

I can print all local variables just before the end of the function, so its not a double free.

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

How can I force this error in Debug mode, then GDB would be way more helpful.

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

What is the best way to track down what little bugger

你有几个选择:

  • 将您的代码移植到可以使用的平台 ValgrindAddressSanitizer
  • 使用许多调试 malloc 实现(dmalloc、mpatrol 等)之一。 QNX 有 one .
  • 非常仔细地阅读代码,确保您没有向可能 malloc 的缓冲区写入比预期更多的数据。

关于c++ - 识别导致内存错误的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14190767/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com