You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 19:30:13