2011-05-08 57 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

相關問題