【问题标题】:Memory Debugging内存调试
【发布时间】:2013-08-29 01:15:47
【问题描述】:

目前我分析了一个 C++ 应用程序及其内存消耗。在某个函数调用之前和之后检查进程的内存消耗是可能的。但是,出于技术原因或为了提高效率,操作系统(Linux)似乎不仅分配了所需的字节数,而且总是分配更多的字节数,这些字节可以稍后由应用程序使用。这使得分析应用程序的内存行为变得困难。

有解决方法吗?可以将 Linux 切换到只分配所需字节数/页数的模式吗?

【问题讨论】:

  • 您测量了哪些内存使用情况(例如堆或堆栈),以及如何测量?你用valgrind了吗?
  • 我测量了进程的虚拟大小。 Valgrind 有一组有限的数字舍入模式,因此我的应用程序无法在 Valgrind 下运行。
  • 显示一些源代码并解释更多关于您的应用程序的信息。 valgrind 是一个非常值得信赖的工具,所以如果你的应用程序无法使用它运行,很可能是你的错......
  • @Basile Starynkevitch:这是 Valgrind 的限制。我的应用程序使用多精度算术。操作需要在真实 CPU 上存在但在 Valgrind 中未实现的舍入模式。

标签: linux memory


【解决方案1】:

如果您使用 malloc/new,分配器将始终分配比您请求的字节多一点的字节,因为它需要一些空间来进行内部管理,而且它可能需要对齐页面边界上的字节。分配的补充字节数量取决于实现。 您可以考虑使用 gperftools (google) 等工具来监控所使用的内存。

【讨论】:

    【解决方案2】:

    几年前我想检查内存韭菜的进程。

    我所做的如下:我编写了一个非常小的调试器(它比听起来容易),它只是为 malloc()、free()、mmap() 和类似的函数设置断点(我做过在 Windows 下但在 Linux 下更简单——我在 Linux 中这样做是为了另一个目的!)。

    每当到达断点时,我都会记录函数参数并继续执行程序...

    通过处理日志文件(半自动),我可以发现内存泄漏。

    缺点:无法同时使用另一个调试器来调试程序。

    【讨论】:

      猜你喜欢
      • 2011-12-05
      • 1970-01-01
      • 2012-06-13
      • 2010-12-01
      • 2011-09-13
      • 1970-01-01
      • 1970-01-01
      • 2018-01-26
      • 2020-08-21
      相关资源
      最近更新 更多