使用巨大的Valgrind和低级C ++ API

时间:2012-01-17 05:38:07

标签: c++ api qt valgrind low-level

我发现了问题“Is anyone using Valgrind and Qt?”,虽然这似乎澄清了一些事情,但我发现它所掌握的信息仍然是一个免费的问题。 我想知道的是为什么 - 当我调试我的应用程序时(尤其是Qt) - 我看不到对我创建的函数的引用?相反,我发现来自较低API(例如Qt)的大量信息似乎有很多内存泄漏。这是否意味着我的应用程序没有任何内存泄漏,或者它是否意味着有太多关于内存泄漏的信息,它首先针对较低级别的API,然后选择继续使用更高级别的代码?

我使用以下标志运行我的valgrind可执行文件:

valgrind  --leak-check=full  --show-reachable=yes -v ./HelloGL 

此外,这到底是怎么回事?

ERROR SUMMARY: 925 errors from 899 contexts (suppressed: 29 from 7)

Pastebin

1 个答案:

答案 0 :(得分:4)

我认为你的问题是调用树非常深。您可以使用以下方法调整报告的深度:

  

--num-callers=<number> [默认值:12]

     

指定标识程序位置的堆栈跟踪中显示的最大条目数。请注意,仅使用前四个功能位置(当前功能中的位置以及其三个直接呼叫者的位置)常见错误。因此,这不会影响报告的错误总数。

     

此值的最大值为50.请注意,较高的设置会使Valgrind运行速度稍慢并占用更多内存,但在处理具有深层嵌套调用链的程序时非常有用。

问题是Qt的内部问题还是由于您使用Qt引起的问题很难回答。但是,当呼叫跟踪无法返回到您的代码时,很难确定问题的确切位置。总的来说,你应该假设你的代码比Qt更容易出错。

关于错误摘要:valgrind总共发现了954个错误。但是,其中29个来自已知会导致问题的函数,因此错误消息被抑制。事实上,这29个问题发生在已知导致问题的七个地点(功能,环境)中。其他925错误未被抑制,这意味着它们要么来自您的代码,要么是新发现的,在系统代码出错之前从未发现过。这些错误有899个单独的上下文(所以有很多不同的地方造成麻烦,只有很少的重复)。上下文是记录的调用链(产生特定错误的函数)的片段。所以,确定了很多问题。您只需要能够看到哪些功能触发了这些问题。