现在我无法在WinMain
上设置bp,虽然我可以看到它的反汇编,但我也无法列出WinMain
的来源:
0:000> u WinMain
00401040 55 push ebp
00401041 8bec mov ebp,esp
00401043 6a00 push 0
00401045 e87e0e0000 call monitormt!g_thread_init (00401ec8)
0040104a 83c404 add esp,4
0040104d e8700e0000 call monitormt!gdk_threads_init (00401ec2)
00401052 e8650e0000 call monitormt!gdk_threads_enter (00401ebc)
00401057 e8d4040000 call monitormt!select_device (00401530)
0:000> ba WinMain
^ Unable to set breakpoint error
The system resets thread contexts after the process
breakpoint so hardware breakpoints cannot be set.
Go to the executable's entry point and set it then.
'ba WinMain'
如何在windbg中执行此操作?
更新
似乎bp
有效,但为什么ba
没有?
答案 0 :(得分:3)
调试器显示的消息实际上非常清楚地解释了为什么ba
此时不起作用。指令ba
设置硬件断点。硬件断点通过debug registers设置。调试寄存器是处理器上下文的一部分,由OS设置。您刚刚将进程加载到内存中 - 所有内存布局都已准备就绪,但尚未设置处理器上下文。如果调试器现在设置了一些注册表值,那么这些更改无关紧要,因为OS会在开始执行进程时覆盖所有寄存器值。
软件断点(bp
)在这里更好,因为它通过覆盖您指定给INT 3
指令的地址的指令来工作。显然,它不受处理器上下文更改的影响,因此即使在初始处理器断点上也可以随时工作。
解决方法很简单 - 首先使用t
指令执行一个步骤,然后您可以根据需要使用硬件断点。对于执行断点,我建议使用软件断点。您可以创建任意数量的软件断点,而硬件断点的数量仅限于调试寄存器的数量。