如何使用 WinDbg 查看特定偏移处的代码,而不使用转储?

And*_*eiM 1 c++ debugging windbg

我有一个可执行文件在某个客户端上运行。他报告发生了事故mymodule.dll!0xaddr。鉴于我有可执行文件、符号服务器、正确设置的 WinDbg,有没有什么方法可以在0xaddr不加载转储或附加到正在运行的进程的情况下查看该位置的代码?

Tho*_*ler 5

这在某种程度上取决于什么“代码”适合您......

  1. 启动WinDbg
  2. 选择“打开故障转储...”,而不是“打开可执行文件...”
  3. 选择您选择的 EXE 或 DLL 文件,而不是 DMP 文件
  4. 设置您的符号
  5. 输入ln mymodule.dll!0xaddr以查看该地址附近有什么符号
  6. 输入u mymodule.dll!0xaddr以查看汇编代码

如果 EXE 或 DLL 有 PDB 信息并且 WinDbg 能够找到 PDB,并且 PDB 引用源(例如私有符号),您将得到一些有用的信息:

0:000> ln 00412510
[...\addressdemo\addressdemo.cpp @ 8] (00412510)   AddressDemo!main   |  (00412575)   AddressDemo!std::uncaught_exception
Exact matches:

0:000> u 00412510
AddressDemo!main [...\projects\addressdemo\addressdemo.cpp @ 8]:
00412510 55              push    ebp
00412511 8bec            mov     ebp,esp
00412513 81ecc0000000    sub     esp,0C0h
00412519 53              push    ebx
0041251a 56              push    esi
0041251b 57              push    edi
Run Code Online (Sandbox Code Playgroud)

  • 选择 EXE 或 DLL 而不是转储的好技巧。但是,我无法执行命令 `ln mymodule.dll!0xaddr` 或 `ln mymodule!0xaddr`。但是,我可以看到模块加载地址(通常为 0x10000000)并且 `ln 10000000 +0xaddr` 现在可以工作。谢谢! (2认同)