【问题标题】:Valgrind reports silly arg to malloc, how do I find out where?Valgrind 向 malloc 报告愚蠢的 arg,我如何找出在哪里?
【发布时间】:2012-04-23 01:00:54
【问题描述】:

在 valgrind 下运行我的程序时收到警告:

==24214== 警告:愚蠢的 arg (-1) 到 malloc()

如何确定对malloc() 的调用有问题?有没有办法不用重新编译就可以做到这一点?

程序编译时使用-g(调试)和不使用-s(剥离)。

【问题讨论】:

    标签: c memory valgrind


    【解决方案1】:

    在使用 Valgrind 3.2.1 版的相对古老的 RedHat Linux 上进行少量实验后,它似乎没有产生更精确的警告。此外,即使是 Mac OS X 10.7.3 上的 Valgrind 3.7.0 也不能更好地识别错误调用。

    测试代码:

    #include <stdlib.h>
    #include <stdint.h>
    int main(void)
    {
        int   l = -1;
        char *x = malloc(l);
        return (uintptr_t)x & 1;
    }
    

    因此,由于valgrind 没有帮助,您可能只能在程序上使用调试器,中断对malloc() 的调用——可能在参数等于(size_t)-1 时有条件地中断。

    【讨论】:

      【解决方案2】:

      事实上,valgrind 似乎拒绝为这种情况打印堆栈跟踪,即使使用--verbose。请写信到邮件列表;应该有一个选项,否则诊断没有那么有用。

      注意malloc 的参数是一个无符号类型size_t,它的范围内没有-1。这种情况的意思实际上是将size_t的最大可能值传递给malloc

      严格来说,这不是一个错误的 API 调用,但它确实可能表明有问题。 (你的程序不需要千兆字节的数组,对吧?)

      【讨论】:

        【解决方案3】:

        你可以在 malloc 上做一个断点,让它有条件,例如 arg 是

        【讨论】:

        • +1,如果您还可以提供一个简单的 gdb 命令用于条件中断作为示例,那也不会受到影响。
        • 你不能在 malloc 上中断,因为它没有调试符号。
        • 您可以使用 find-and-replace 将 malloc() 替换为两个语句行,即 #define Wrapped_malloc(x) malloc(x); (无效)0;并在那里设置一个断点:它可以在 (void)0 上中断。只需要分支代码库并找到错误,更改不必是永久性的
        • 查找和替换的问题是我在很多函数名的末尾都有malloc这个词。
        • 天哪,这太苛刻了。好吧,请使用查找 '= malloc()' 或 '= ()malloc(*)' 的正则表达式。我不是一个正则表达式的大佬,所以我无法确切建议使用哪个。
        【解决方案4】:

        您可能会发现文本“silly arg”在 valgrind 中的调用位置。调出你的调试器并在那个地方中断。运行你的程序,当它把你带回调试器提示符时,直到你在调用 malloc 的那一行。

        【讨论】:

          【解决方案5】:

          我最终插入了printf's 并查找它是在 valgrind printf 之前还是之后。没有你们推荐的那么花哨,但它比尝试实施其他解决方案更快。

          【讨论】:

          • 嗯,对于一个小程序来说,最简单的解决方案可能是最好的。
          猜你喜欢
          • 2015-06-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-12-24
          • 2021-06-27
          • 1970-01-01
          • 2018-03-13
          • 1970-01-01
          相关资源
          最近更新 更多