使用Valgrind和底层C++ API,它们是巨大的。

3
我发现了一个问题:“有人在使用Valgrind和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个回答

4

我认为你的问题在于调用树很深。你可以使用以下命令调整报告的深度:

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

指定在标识程序位置的堆栈跟踪中显示的最大条目数。请注意,仅使用顶部四个函数位置(当前函数的位置及其三个直接调用者的位置)对错误进行汇总。因此,这不会影响报告的错误总数。

此设置的最大值为50。请注意,较高的设置将使Valgrind运行稍微慢一些,并且占用更多内存,但在处理具有深层嵌套调用链的程序时可能很有用。

无论问题是Qt内部问题还是由您对Qt的使用引起的,都很难回答。但是,当调用跟踪无法追溯到您的代码时,很难确定实际问题的所在位置。总体而言,您应该假设问题更可能出现在您的代码而不是Qt本身。

关于错误总结: valgrind 总共发现了954个错误。然而,其中29个来自已知会导致问题的函数,因此错误消息被抑制了。实际上,这些29个问题发生在七个已知会导致问题的位置(函数、上下文)中。其余的925个错误没有被抑制,这意味着它们要么来自您的代码,要么是新发现的、以前从未在系统代码中发现过的错误。这些错误有899个不同的上下文(因此有很多不同的地方引起了麻烦,重复很少)。上下文是记录的调用链片段(使特定错误的函数的函数链),因此识别出了很多问题。您只需要能够看到哪些函数触发了这些问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接