gpt4 book ai didi

c++ - 在 C++ 应用程序运行时检查各种内存使用情况

转载 作者:太空狗 更新时间:2023-10-29 12:26:28 25 4
gpt4 key购买 nike

我正在使用 CentOS 7 并运行 C++ 应用程序。最近我切换到应用程序用于各种 MySQL C API 函数的库的更新版本。但是在集成新库之后,我发现程序的内存使用量大幅增加,即如果运行超过一两天,应用程序就会崩溃。准确地说,应用程序的内存使用量开始增加,直到应用程序单独使用系统总内存的 74.9%,然后被系统强制关闭。

有什么方法可以跟踪整个应用程序(包括静态变量)的内存使用情况。我已经尝试过 valgrind 的工具 Massif .

谁能告诉我内存使用量增加的可能原因是什么,或者有什么工具可以让我深入了解内存的分配方式(静态和动态)。是否有任何工具可以告诉我们有关在 linux 环境中运行的 C++ 应用程序的内存分配?

提前致谢!

最佳答案

静态内存在程序启动时分配。您是否看到内存增长或启动增加?

由于“一两天就会崩溃”,问题很可能是内存泄漏或数据结构的无限增长。 Valgrind 应该能够帮助两者。如果 valgrind 使用 --leak-check-full 选项显示大泄漏,那么您可能已经发现了问题。

要检查无限增长,请在程序中您怀疑堆已增长的位置放置一个先发制人的 _exit()。例如,在主循环中放置一个计时器,让程序在 10 分钟后退出。如果 valgrind 显示一个很大的“退出时正在使用”,那么您可能有数据结构的无限增长但不是泄漏。 Massif 可以帮助追踪这一点。 ms_print 给出了函数堆栈分配的详细信息。

如果您发现问题,请尝试切换回旧版本的库。如果问题消失,请检查并确保您在新版本中正确使用 API。如果您没有源代码,那么您在修复方面就会遇到困难。

如果您想更进一步,可以为 malloc/free 编写一个共享库插入器,看看发生了什么。这里有个好start . Linux 有 backtrace有助于确定确切堆栈的功能。

最后,如果您必须使用第 3 方库并发现堆无限制地增长或泄漏,那么您可以使用共享库插入器直接调用 free/delete。这是一个不推荐的有风险的最后一搏策略,但我已经在生产中使用它来使过程一瘸一拐。

关于c++ - 在 C++ 应用程序运行时检查各种内存使用情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39035110/

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