如何在我的功能上设置断点并列出其来源?

时间:2011-05-08 04:14:28

标签: windbg

现在我无法在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没有?

1 个答案:

答案 0 :(得分:3)

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

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

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