WinDbg中的ba命令(访问中断)没有像Daniel Pravat和Mario Hewardt在《高级Windows调试》一书中宣传的那样工作

WinDbg中的ba命令(访问中断)没有像Daniel Pravat和Mario Hewardt在《高级Windows调试》一书中宣传的那样工作,windbg,Windbg,我正在读丹尼尔·普拉瓦特和马里奥·赫瓦特的书。我对第二章有疑问 我正在Windows 10 Pro版本2004 build 19041.572上使用WinDBG 10.0.19041.1 X86。我使用Microsoft Visual Studio Community 2019版本16.7.6构建了02sample.exe,并将GeneratedBugInformation属性设置为DebugFull。我正在调试02sample.exe的Debug | x86配置 我正在阅读第2章中名为“设置访

我正在读丹尼尔·普拉瓦特和马里奥·赫瓦特的书。我对第二章有疑问

我正在Windows 10 Pro版本2004 build 19041.572上使用WinDBG 10.0.19041.1 X86。我使用Microsoft Visual Studio Community 2019版本16.7.6构建了02sample.exe,并将GeneratedBugInformation属性设置为DebugFull。我正在调试02sample.exe的Debug | x86配置

我正在阅读第2章中名为“设置访问断点”的章节,我看到了书中的内容与我所经历的内容之间的差异

行为上的第一个区别是使用以下命令

0:000> dt gGlobal
0:000> ba w4 gGlobal+0
此命令失败,出现以下错误

Symbol gGlobal not found.
下面的命令不起作用

0:000> dt 02sample!gGlobal
*** WARNING: Unable to verify checksum for 02sample.exe
gGlobal
   +0x000 m_ref            : 0n0
行为上的下一个区别是使用以下命令

0:000> dt gGlobal
0:000> ba w4 gGlobal+0
根据以下输出,这似乎是可行的

0:000> bl
     0 e Disable Clear  00969130 w 4 0001 (0001)  0:**** 02sample!gGlobal

但是,未命中断点。我不明白为什么。

符号可能尚未加载
请尝试.reload/f或.reload/f foo.exe
在尝试不合格dt gGlobal之前
一个合格的foo!gGlobal将始终工作,因为它加载符号

请查收!sym噪音

0:000> !sym noisy
noisy mode - symbol prompts off
0:000> dt gGlobal
Symbol gGlobal not found.
0:000> dt gGlobal
Symbol gGlobal not found.
0:000> dt gGlobal
Symbol gGlobal not found.
0:000> dt awd!gGlobal
SYMSRV:  BYINDEX: 0x2
snipxxxxxxxxxxxxxxx
DBGHELP: awd - public symbols & lines
        C:\Users\XXX\Desktop\awd\Chapter2\Debug\awd.pdb
   +0x000 m_ref            : 0n0
0:000>
这本书是如何告诉您设置ba断点的?
在系统断点处停止时,无法在模块上设置ba断点
因为系统将重置线程上下文

您必须转到入口点,然后按照windbg的建议设置ba断点,您这样做了吗

:\>cdb -c "g @$exentry;ba w4 awd!gGlobal;g;u .;kb;q" awd.exe |awk "/Reading/,/quit/"
0:000> cdb: Reading initial command 'g @$exentry;ba w4 awd!gGlobal;g;u .;kb;q'
*** WARNING: Unable to verify checksum for awd.exe
Breakpoint 0 hit
awd!Global::Global+0x21:
00a23461 8b45fc          mov     eax,dword ptr [ebp-4]
00a23464 83c404          add     esp,4
00a23467 3bec            cmp     ebp,esp
00a23469 e895ddffff      call    awd!ILT+510(__RTC_CheckEsp) (00a21203)
00a2346e 8be5            mov     esp,ebp
00a23470 5d              pop     ebp
00a23471 c3              ret
00a23472 cc              int     3
ChildEBP RetAddr  Args to Child
0026f9d4 00a21687 0026f9ec 522c59df 00a21670 awd!Global::Global+0x21
0026f9dc 522c59df 00a21670 00a2b208 0026fa50 awd!`dynamic initializer for 'gGlobal''+0x17
0026f9ec 00a24a5e 00a2b000 00a2b30c 91b61bad ucrtbased!_initterm+0x3f
0026fa50 00a2498d 0026fa60 00a24d08 0026fa6c awd!__scrt_common_main_seh+0xbe
0026fa58 00a24d08 0026fa6c 7683ed6c 7ffde000 awd!__scrt_common_main+0xd
0026fa60 7683ed6c 7ffde000 0026faac 773337eb awd!wmainCRTStartup+0x8
0026fa6c 773337eb 7ffde000 761f96f6 00000000 kernel32!BaseThreadInitThunk+0xe
0026faac 773337be 00a21145 7ffde000 00000000 ntdll!__RtlUserThreadStart+0x70
0026fac4 00000000 00a21145 7ffde000 00000000 ntdll!_RtlUserThreadStart+0x1b
quit:
如果您碰巧误解了对wmain()的entrypoint,并在到达wmain()时设置了ba中断,那么它可能永远不会被命中,因为所讨论的代码已经被执行