使用WinDbg在内存对象中打印

时间:2011-12-11 16:30:35

标签: windows windbg

我有一个简单的C ++服务,它从文件中读取文本并通过网络发送。随着时间的推移,此服务的内存消耗在客户站点上增加。在QA测试中没有观察到这种行为。

我想知道是否可以在任何给定时间提取内存中的所有字符串对象。

是否可以自动执行此过程,以便我在不同时间从客户处获取转储,并在每次查找内存的大小或内容并比较结果。

3 个答案:

答案 0 :(得分:3)

对于c ++,答案是否定的(在C#中是另一回事)。在c ++世界中,如果您怀疑自己有泄漏,则需要在“泄漏”发生之前在进程上启用usermode堆栈跟踪(在gflags.exe中为+ ust)。泄漏发生后,获取进程的转储并检查它。要检查它(我假设您在此响应中使用本机Windows堆),您将需要遍历堆结构以找出分配的位置,然后检查堆栈回溯以获取最常见分配大小的样本

实施例

  1. 在应用程序运行之前,运行gflags / i MyApp.exe + ust。这将设置regkey,为操作系统提供有关如何处理进程MyApp.exe
  2. 的特殊说明
  3. 运行程序并发生“不良行为”
  4. 收集流程的转储,同时容易看到不良行为(越容易看到,就越容易找到)
  5. 在Windbg中打开转储
  6. !heap -summary并找到具有大量虚拟字节数的堆
  7. 第一个colomn是你的堆柄。使用上一步中找到的条目中的堆句柄并运行!heap -stat -h -grp。这将列出使用给定堆中空间最多的堆分配。
  8. 所以我们现在知道哪个堆很大,以及最常见的条目的大小。我们知道需要一些地址,所以我们可以查看分配它们的调用堆栈。运行!heap -flt s。
  9. 最后一步(我们太近了)。运行!heap -p -a。现在,您将获得用于生成此分配的代码路径的堆栈回溯。现在你可以回到你的代码,找出为什么没有被释放。

答案 1 :(得分:1)

听起来你有内存泄漏。我只使用windbg来调试托管应用程序。也许这个Link可以帮助你一点。

答案 2 :(得分:1)