如何配置WinDbg在ModLoad事件中显示DLL完整路径?
问题描述
调试应用程序时,WinDbg输出了如下模块加载日志:
* MyApp second chance resolve: Requested assembly: "Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed" * MyApp second chance resolve: Trying to load: "C:\MyApp\Newtonsoft.Json.dll" ModLoad: 000002a7`366b0000 000002a7`36760000 Newtonsoft.Json.dll ModLoad: 000002a7`36760000 000002a7`36810000 Newtonsoft.Json.dll * MyApp second chance resolve: Loaded assembly: "Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed"
但执行lm m Newtonsoft*查看已加载模块列表时,仅显示一个条目:
1:003> lm m Newtonsoft* Browse full module list start end module name 000002a7`36760000 000002a7`36810000 Newtonsoft_Json_2a736760000 (deferred)
虽然可以用Process Monitor确认程序访问了两个不同路径的DLL,但需要重启程序重现问题。想知道是否可以配置WinDbg,让它在ModLoad事件中显示DLL的完整路径,具体操作步骤是什么?
解决方法
可以通过WinDbg的事件断点和自定义命令实现ModLoad时显示完整路径,具体步骤如下:
1. 启用模块加载事件断点
在WinDbg命令窗口输入以下命令,让WinDbg对模块加载事件做出响应:
sxe ld
2. 配置自定义输出动作
输入以下命令,修改ld事件的处理逻辑,让WinDbg在模块加载时自动输出完整路径并继续执行:
sxec ld "!dh -f @$eventstart; g"
!dh -f @$eventstart:调用!dh(Dump Headers)命令,-f参数强制显示模块完整路径,@$eventstart是WinDbg内置变量,代表刚加载模块的起始地址。g:执行继续运行命令,避免每次加载模块都暂停调试流程。
3. 验证效果
设置完成后,模块加载时WinDbg会自动输出包含完整路径的模块信息,示例如下:
... File Type: DLL Image base: 000002a7`366b0000 Time Date Stamp: 63c7d7a0 (Fri Jan 27 15:32:16 2023) Checksum: 000b2d4c Image size: 000b0000 **Full path: C:\MyApp\Newtonsoft.Json.dll** ...
4. 可选:仅跟踪特定模块
如果只想关注特定模块(比如Newtonsoft.Json.dll),可以设置带通配符的断点:
sxe ld:Newtonsoft* sxec ld:Newtonsoft* "!dh -f @$eventstart; g"
这样只有匹配Newtonsoft*的模块加载时才会触发输出,减少无关日志干扰。
内容的提问来源于stack exchange,提问作者Thomas W.
相关产品推荐
相关产品推荐

