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

Checking all sorts of memory usage during the runtime of a C++ Application

本文关键字:内存 用情 情况 c++ 应用程序 运行时 检查      更新时间:2023-10-16

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

是否有任何方法可以跟踪整个应用程序的内存使用情况,包括静态变量。我已经尝试了valgrind的工具Massif。

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

提前感谢!

程序启动时分配静态内存。你是否看到内存增长或初创公司增长?

由于需要"一两天崩溃",问题可能是内存泄漏或数据结构的无限增长。Valgrind应该能够在这两方面提供帮助。如果valgrind使用——leak-check-full选项显示了一个大泄漏,那么您可能已经发现了问题。

要检查无限增长,请在程序中怀疑堆已经增长的位置放置一个抢占式_exit()。例如,在主循环上放置一个计时器,并在10分钟后让program_exit退出。如果valgrind显示了一个很大的"在退出时正在使用",那么您可能有数据结构的无限增长,但没有泄漏。Massif可以帮忙追踪。ms_print给出了函数栈分配的详细信息。

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

如果您想要做更多的工作,您可以为malloc/free编写一个共享库interposer来查看正在发生的事情。这是一个良好的开端。Linux具有回溯功能,可以帮助确定确切的堆栈。

最后,如果你必须使用第三方库,并且发现堆在没有绑定或泄漏的情况下增长,那么你可以使用共享库中介器直接调用free/delete。这是一种冒险的最后一招,不推荐使用,但我已经在生产环境中使用了这种策略来缓慢推进流程。