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

时间:2016-08-19 09:05:28

标签: c++ linux memory-leaks heap-memory mysql-connector

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

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

任何人都可以告诉我增加内存使用的可能原因或任何可以让我深入了解内存分配(静态和动态)的工具。是否有任何工具可以告诉我们在Linux环境中运行的C ++应用程序的内存分配?

提前致谢!

1 个答案:

答案 0 :(得分:1)

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

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

要检查无限增长,请在程序中将可抢占的_exit()置于您怀疑堆已经增长的位置。例如,在主循环上放置一个计时器,并在10分钟后让程序_exit。如果valgrind在退出时显示“正在使用”,那么您可能无限制地增长数据结构但不会泄漏。 Massif可以帮助追踪这一点。 ms_print提供了带有函数堆栈的分配细节。

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

如果你想加倍努力,你可以为malloc / free编写一个共享的库插入器来查看发生了什么。这是一个很好的start。 Linux具有backtrace功能,可以帮助确定确切的堆栈。

最后,如果您必须使用第三方库并发现堆没有绑定或泄漏,那么您可以使用共享库插入器直接调用free / delete。这是一个冒险的最后一道未经推荐的策略,但我已经在生产中用来跛行一个过程。