【问题标题】:How to execute WinDbg commands in regular intervals?如何定期执行 WinDbg 命令?
【发布时间】:2014-01-18 19:58:22
【问题描述】:

我想定期在 WinDbg 中执行一些命令,例如每一分钟。在这种特殊情况下,我想获取句柄统计信息 (!handle) 和 .NET 对象统计信息 (!dumpheap -stat) 来构建图表。作为一种解决方法,我目前使用procdump 并每分钟创建一个转储,但这会占用大量硬盘空间(.NET 的完整小型转储),并且需要我稍后分析所有转储(由脚本自动执行)。

如何定期执行 WinDbg 命令?

假设: 用户模式实时调试。目标应用程序一直在运行。该命令以;g 结束,以便在命令执行后继续运行。时间不需要很精确,尤其是命令的执行时间无关紧要。

在我开始使用调试器引擎实现我自己的调试器之前,我想我可以问问是否可以通过 WinDbg 本身来实现。

【问题讨论】:

    标签: windbg


    【解决方案1】:

    您可以使用 WMemoryProfiler 公开 MDbg 类(托管调试器,基本上是 Windbg + SOS 加载)并使用托管应用程序来控制调试器并在其上执行命令。

    或者您使用ClrMD,它允许您在没有 Windbg 的情况下从托管进程的实时进程上执行 SOS 命令,这也是未来支持的方式。

    为了找到句柄泄漏,我采用了另一种方法。您可以挂钩分配和释放句柄的 Api 调用(例如 EasyHook 将任何 Api 与托管代码挂钩)。然后,在您的钩子中,您可以发出一个可以启用的 ETW 事件,例如通过 Windows 性能工具包的 xperf。这种方法的妙处在于,您可以登录 ETW 事件,处理分配和释放调用,并获取一个日志文件,您可以对其进行解析以查找属于您的泄漏的未完成调用。 因为我确实通过 ETW 事件记录了它,所以我得到了从内核到 RtlThreadStart 方法的完整调用堆栈,包括一个完整的托管调用堆栈,如果您正在跟踪托管应用程序中的句柄泄漏,这将更有帮助。例如,你可以用它做什么检查this。这种方法是迄今为止我发现的最好的方法,因为它不会像 Windbg 那样减慢应用程序的速度,而且您可以在很长一段时间内基本上无影响地监控您的应用程序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-28
      • 1970-01-01
      • 2012-05-30
      • 1970-01-01
      • 2020-09-09
      相关资源
      最近更新 更多