2011-05-08 56 views
2

现在我不能设置WinMain基点,虽然我可以看到它的拆卸,而我不能列出源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中?

UPDATE

看来bp作品,但为什么ba不?

回答

2

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

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

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

+0

如何列出“WinMain”的来源? – 2011-05-08 06:08:40

+0

我试过'ls WinMain',但它不起作用。 – 2011-05-08 10:24:23

+0

这是完全不同的问题。如果您提出新问题,您将获得更好的机会。你有什么样的符号信息?我知道WinDbg可以从PDB符号中提取行号信息,不确定其他符号类型。 – 2011-05-08 18:27:44

相关问题