Windbg分析C#内存Dump:如何获取对象所属模块?
Windbg分析内存Dump:对象模块查看与符号加载问题解决
1. 查看System.Object[]对象所属模块
要确定这些数组对象的所属模块,按以下步骤操作:
- 从
!Dumpheap -stat的输出中,找到System.Object[]对应的方法表(MT)地址(格式类似00007ffdabc12345`) - 执行命令
!dumpmt -md <MT地址>,输出头部的Module字段会显示对应模块的名称和基地址 - 补充操作:若拿到具体对象实例地址,可先执行
!do <对象实例地址>获取其MT,再用上述命令关联模块;也可直接用!module <MT地址>快速定位所属模块
2. 解决符号加载显示deferred的问题
按以下步骤排查修复:
- 修正符号路径配置:Windbg符号路径无需加
*后缀,直接设置本地pdb目录即可。执行命令:
若需同时加载系统模块符号,可搭配微软公共符号服务器使用组合路径:.sympath C:\Temp_Folder.sympath srv*C:\Temp_Folder*https://msdl.microsoft.com/download/symbols - 强制重新加载符号:配置路径后执行强制重载命令:
若仅需加载单个模块,指定模块名即可:.reload /f.reload /f <目标模块名>.dll - 验证符号匹配性:确保本地
.pdb文件与生成Dump时的进程模块版本完全一致(包括时间戳、校验和)。用lm v <模块名>查看Windbg中模块的版本信息,再通过dumpbin /headers <模块文件>对比本地二进制文件的信息 - 开启加载日志排查:若仍失败,执行
!sym noisy开启符号加载日志,再执行.reload,从日志中定位具体错误(如路径找不到、版本不匹配等)
内容的提问来源于stack exchange,提问作者Dominique
相关产品推荐
相关产品推荐

