Mar*_* Ba 3 windows debugging windbg visual-studio
在调试Windows进程时,有时会尽可能早地中断.
Inital Callstack看起来像这样:(例如,当您在DllMain函数中设置断点时,您会得到此信息DLL_PROCESS_ATTACH)
...
ntdll.dll!_LdrpCallInitRoutine@16() + 0x14 bytes
ntdll.dll!_LdrpRunInitializeRoutines@4() + 0x205 bytes
> ntdll.dll!_LdrpInitializeProcess@20() - 0x96d bytes
ntdll.dll!__LdrpInitialize@12() + 0x6269 bytes
ntdll.dll!_KiUserApcDispatcher@20() + 0x7 bytes
Run Code Online (Sandbox Code Playgroud)
因此,在其中一个ntdll例程中设置断点应该会非常早地打破这个过程.
但是,在调试器中启动进程之前,我无法弄清楚如何在那里设置断点.是否可以在Visual Studio(2005)中使用?怎么样?可以在WinDbg中完成吗?
我会使用类似GFlags的东西在进程启动时启动调试器.
以下是test.exe的示例gflags设置

这是调试器输出.请注意调用堆栈 ntdll!LdrpInitializeProcess
CommandLine:"C:\ temp\test.exe"符号搜索路径为:srv*; srv c:\ symbols http://msdl.microsoft.com/download/symbols 可执行搜索路径为:
00d20000 00000000ModLoad :00000000 00d28000
image0000000000d20000 (1b40.464): Break instruction exception - code 80000003 (first chance) ntdll!LdrpDoDebuggerBreak+0x30: 0000000077c7cb60 cc int 3 0:000> k Child-SP RetAddr
呼叫站点000000000012ed70 0000000077c32ef5 ntdll!LdrpDoDebuggerBreak + 0x30 000000000012edb0 0000000077c11a17 ntdll!LdrpInitializeProcess + 0x1b4f 000000000012f2a0 0000000077bfc32e ntdll!?? :: FNODOBFM ::string'+0x29220 000000000012f310 00000000`00000000 ntdll!LdrInitializeThunk + 0xe
或者您可以在调试器中打开像Windbg这样的进程ntdll!LdrpInitializeProcess,默认情况下会突破.
HTH