WinDbg中的ba命令(访问中断)没有像Daniel Pravat和Mario Hewardt在《高级Windows调试》一书中宣传的那样工作
我正在读丹尼尔·普拉瓦特和马里奥·赫瓦特的书。我对第二章有疑问 我正在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章中名为“设置访问断点”的章节,我看到了书中的内容与我所经历的内容之间的差异 行为上的第一个区别是使用以下命令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章中名为“设置访
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中断,那么它可能永远不会被命中,因为所讨论的代码已经被执行