现在,尽管可以看到WinMain的反汇编,但我无法在bpt_code上设置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不起作用?

最佳答案

调试器显示的消息实际上非常清楚地解释了为什么ba在这一点上不起作用。指令ba设置硬件断点。硬件断点是通过debug registers设置的。调试寄存器是处理器上下文的一部分,由OS设置。您刚刚将进程加载到内存中-所有内存布局均已准备就绪,但尚未设置处理器上下文。如果调试器现在设置一些注册表值,则这些更改将无关紧要,因为OS将在开始执行过程时覆盖所有寄存器值。

这里最好使用软件断点(bp),因为它可以通过覆盖指定给INT 3指令的地址处的指令来工作。显然,这不受处理器上下文更改的影响,因此即使在初始处理器断点上也可以随时使用。

解决方法很简单-首先使用t指令执行单个步骤,然后您可以根据需要使用硬件断点。对于执行断点,我建议使用软件断点。您可以创建任意数量的软件断点,而硬件断点的数量仅限于调试寄存器的数量。

关于windbg - 如何在函数上设置断点并列出其来源?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5925542/

10-17 02:47