WinDbg执行!runaway报错could not get process information,6如何解决?
原因分析
!runaway 是WinDbg原生的调试扩展命令,不属于SOS扩展集,所以它的运行状态和SOS.dll、clr.dll的版本匹配度完全无关,这是你其他SOS命令可正常运行、仅!runaway报错的核心原因。
你遇到的报错中错误码6对应Windows系统错误 ERROR_INVALID_HANDLE(无效句柄),触发该问题的常见场景有三类:
- 转储文件捕获不完整:你使用的是迷你转储(Minidump),捕获时未包含进程全局内核信息模块。
!runaway需要读取进程内核对象中存储的所有线程累计运行时间数据,而默认迷你转储仅保留线程栈、基础CLR数据等信息,刚好包含了.ttime需要的单线程时间数据,缺失了!runaway需要的全局进程统计数据,所以会出现.ttime正常、!runaway报错的情况。 - WinDbg运行权限不足:在非管理员权限下运行WinDbg时,部分存储在内核区域的转储进程信息读取会被系统权限拦截,被识别为无效句柄。
- 转储位数与调试环境不匹配:如果捕获的是32位w3wp进程的转储,却在64位WinDbg中未开启wow64兼容模式直接加载,
!runaway读取进程结构时地址偏移计算错误,也会触发无效句柄报错。
解决方法
- 优先重新捕获完整转储:使用procdump工具执行命令
procdump -ma w3wp.exe <转储保存路径>捕获完整内存转储,-ma参数会保留所有进程内核信息、线程时间统计数据,可完全支持!runaway命令运行。如果使用任务管理器抓转储,需要在系统高级设置中调整转储类型为「完整转储」,默认任务管理器生成的迷你转储无法满足!runaway的运行要求。 - 启动WinDbg时右键选择「以管理员身份运行」,再加载转储文件执行命令。
- 如果是32位w3wp转储,优先使用32位版本WinDbg加载;如果使用64位WinDbg,先执行
!wow64exts.sw切换到32位兼容模式后再运行!runaway。 - 无需重新抓转储的替代方案:执行命令
~* .ttime批量输出所有线程的运行时间,手动排序后即可定位CPU占用最高的线程,实现和!runaway完全一致的分析效果。
内容的提问来源于stack exchange,提问作者Kevin Tal Rasha
相关产品推荐
相关产品推荐

