我想定期在WinDbg中执行一些命令,例如每一分钟。在这种特殊情况下,我想获取句柄统计信息(!handle
)和.NET对象统计信息(!dumpheap -stat
)来构建图形。作为一种解决方法,我目前正在使用procdump
并每分钟创建一个转储,但这需要大量的硬盘空间(.NET的完全minidump)并要求我稍后分析所有转储(通过脚本自动化)。
如何定期执行WinDbg命令?
假设:
用户模式实时调试。目标应用程序一直在运行。该命令在;g
结束,以便在执行命令后它将继续运行。时间不需要精确,特别是命令的执行时间无关紧要。
在我开始使用调试器引擎实现自己的调试器之前,我想我可以通过WinDbg本身来询问它是否可行。
答案 0 :(得分:3)
您可以使用公开MDbg类的WMemoryProfiler(基本上是Windbg + SOS Loaged的托管调试器)并使用托管应用程序来控制调试器并在其上执行comamnds。
或者您使用ClrMD,它允许您在托管流程的实时流程上执行SOS命令而不使用Windbg,这是未来支持的方式。
为了找到手柄泄漏,我采用了替代路线。您可以挂钩分配和释放句柄的Api调用(e..g EasyHook以挂钩任何Api与托管代码)。然后你可以在你的钩子中发出一个可以启用的ETW事件,例如通过Windows Performance Toolkit的xperf。这种方法很酷,你可以登录你的ETW事件,句柄分配和免费调用,并获得一个日志文件,你可以解析,找到你的泄漏的未完成的调用。 由于我通过ETW事件进行了记录,因此我获得了从内核到RtlThreadStart方法的完整调用堆栈,包括完整的托管调用堆栈,如果您在托管应用程序中跟踪句柄泄漏,则更有用。例如,您可以使用它来检查this。这种方法是我迄今为止发现的最好的方法,因为它不会像Windbg那样减慢应用程序的速度,并且您可以在很长一段时间内监控您的应用程序基本无影响。