EXE 啟動時載入 DLL,DLL 入口點 (DllMain/CWinApp::InitInstance) 執行極早,常規「附加到進程」來不及斷點。
regedit。
2. 定位 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\。
3. 新建鍵:你的 EXE 名稱 (如 MyApp.exe)。
4. 在該鍵下新建字符串值:Debugger = vsjitdebugger.exe (VS JIT 調試器) 或 "C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\devenv.exe" /debugexe。
5. 運行 EXE,系統會自動彈出「即時調試」對話框,選擇 VS 實例,斷點生效於進程最開始。
DebugBreak() 或 __asm int 3// DLL 導出函數 / InitInstance 開頭
#ifdef _DEBUG
DebugBreak(); // 或 __asm { int 3 }
#endif
// 編譯為 Debug 版本,EXE 載入 DLL 觸發此函數時自動中斷,VS 彈出調試器
優點:無需修改註冊表,精確定位到特定函數。缺點:需重新編譯 DLL。
TRACE(_T("DLL InitInstance called\n"));,配合 DebugView (Sysinternals) 實時查看,無需斷點。LoadLibrary 顯式載入 DLL,而非隱式鏈接,可在載入前附加調試器。| 場景 | 推薦方案 |
|---|---|
| 不想改代碼、需最早斷點 | 方案一(註冊表) |
| 可改代碼、定位特定導出函數 | 方案二(DebugBreak) |
| EXE 由服務/排程啟動 | 方案三(子進程調試) |
掌握註冊表強制調試器、DebugBreak 硬中斷、子進程附加三板斧,MFC DLL 調試無死角。