如何定期执行WinDbg命令?

如何定期执行WinDbg命令?,windbg,Windbg,我希望定期(例如每分钟)在WinDbg中执行一些命令。在这种特殊情况下,我希望获得句柄统计信息(!handle)和.NET对象统计信息(!dumpheap-stat)来构建一个图形。作为一种解决方法,我目前正在使用procdump并每分钟创建一个转储,但这需要大量的硬盘空间(对于.NET来说是完整的小型转储),并且需要我以后分析所有转储(由脚本自动执行) 如何定期执行WinDbg命令? 假设: 用户模式实时调试。目标应用程序一直在运行。命令结束于;g,以便在执行命令后继续运行。计时不需要精确,尤

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

如何定期执行WinDbg命令?

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

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

您可以使用它公开MDbg类(托管调试器,基本上是WinDbg+SOS加载的),并使用托管应用程序控制调试器并在其上执行comamnds

或者,您也可以使用它来执行SOS命令,而不必使用Windbg,也可以使用受管流程在活动流程上执行SOS命令,这是未来支持的方式

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