рд╣рдо рдбрд┐рдмрдЧрд░ рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рддрд╣рдд рд▓рд┐рдЦрддреЗ рд╣реИрдВ [рднрд╛рдЧ 1]

рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐



рд╣рдо рд╕рднреА, рд╕рдордп-рд╕рдордп рдкрд░, рдбрд┐рдмрдЧрд░ рд╕реЗ рдбрд┐рдмрдЧ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдбреАрдмрдЧрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ C ++, C #, Java рдФрд░ рд╕реИрдХрдбрд╝реЛрдВ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдпрд╛ рддреЛ рдмрд╛рд╣рд░реА (WinDbg) рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд╡рд╛рддрд╛рд╡рд░рдг (рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ) рдореЗрдВ рдПрдореНрдмреЗрдбреЗрдб рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдЖрдкрдиреЗ рдХрднреА рд╕реЛрдЪрд╛ рд╣реИ рдХрд┐ рдбрд┐рдмрдЧрд░ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ?
рдФрд░ рдЖрдк рднрд╛рдЧреНрдпрд╢рд╛рд▓реА рд╣реИрдВред рд▓реЗрдЦреЛрдВ рдХреА рдЗрд╕ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рд╣рдо рд╕рдордЭреЗрдВрдЧреЗ рдХрд┐ рдХреИрд╕реЗ рдФрд░ рдХреИрд╕реЗ рдбреАрдмрдЧрд┐рдВрдЧ рдЕрдВрджрд░ рд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИред рдпрд╣ рдЖрд▓реЗрдЦ рдХреЗрд╡рд▓ Windows рдХреЗ рд▓рд┐рдП рдбрд┐рдмрдЧрд░ рд▓рд┐рдЦрдиреЗ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рддрд╛ рд╣реИред рд╕рдВрдХрд▓рдХ, рд▓рд┐рдВрдХрд░реНрд╕ рдФрд░ рдЕрдиреНрдп рдЬрдЯрд┐рд▓ рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреЗ рдмрд┐рдирд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рдХреЗрд╡рд▓ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдбреАрдмрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдПрдХ рдмрд╛рд╣рд░реА рдбреАрдмрдЧрд░ рд▓рд┐рдЦреЗрдВрдЧреЗред рдЗрд╕ рд▓реЗрдЦ рдХреЛ рдкрд╛рдардХ рдХреЛ рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ рдХреА рдореВрд▓ рдмрд╛рддреЗрдВ рд╕рдордЭрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдбреАрдмрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ:
  1. рдзреНрд╡рдЬ DEBUG_ONLY_THIS_PROCESS рдпрд╛ DEBUG_PROCESS рдХреЗ рд╕рд╛рде рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд╛рд░рдВрдн рдХрд░реЗрдВ;
  2. рдПрдХ рдбреАрдмрдЧ рд▓реВрдк рд╢реБрд░реВ рдХрд░реЗрдВ рдЬреЛ рд╕рдВрджреЗрд╢реЛрдВ рдФрд░ рдШрдЯрдирд╛рдУрдВ рдХреЛ рдкрдХрдбрд╝ рд▓реЗрдЧрд╛;

рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдпрд╛рдж рд░рдЦреЗрдВ:

рдПрдХ рдбрд┐рдмрдЧ рдзреНрд╡рдЬ рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╢реБрд░реВ рдХрд░рдирд╛

рд╣рдо CreateProcess рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рдЫрдареЗ рдкреИрд░рд╛рдореАрдЯрд░ (dwCreationFlags) рдореЗрдВ рд╣рдо рдзреНрд╡рдЬ DEBUG_ONLY_THIS_PROCESS рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдзреНрд╡рдЬ рдбрд┐рдмрдЧрд┐рдВрдЧ (рдбрд┐рдмрдЧрд┐рдВрдЧ рдИрд╡реЗрдВрдЯ, рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд╛рд░рдВрдн / рд╕рдорд╛рдкреНрддрд┐, рдЕрдкрд╡рд╛рдж, рдЖрджрд┐) рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд░рдВрдн рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдВрдбреЛрдЬрд╝ рд╕реЗ рдХрд╣рддрд╛ рд╣реИред рдмрд╛рдж рдореЗрдВ рдПрдХ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдгред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдо рдмрд┐рд▓реНрдХреБрд▓ DEBUG_ONLY_THIS_PROCESS рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдо рдХреЗрд╡рд▓ рдЙрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдбреАрдмрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ рд╣рдо рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рднреА рдирд╣реАрдВред
STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory( &si, sizeof(si) ); si.cb = sizeof(si); ZeroMemory( &pi, sizeof(pi) ); CreateProcess ( ProcessNameToDebug, NULL, NULL, NULL, FALSE, DEBUG_ONLY_THIS_PROCESS, NULL,NULL, &si, &pi ); 

рдЙрд╕рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдХрд╛рд░реНрдп рдкреНрд░рдмрдВрдзрдХ рдореЗрдВ рдирдИ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдЕрднреА рддрдХ рд╢реБрд░реВ рдирд╣реАрдВ рд╣реБрдЖ рд╣реИред рдирдИ рдмрдирд╛рдИ рдЧрдИ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЕрднреА рднреА рдЬрдореА рд╣реБрдИ рд╣реИред рдирд╣реАрдВ, рдЙрдиреНрд╣реЛрдВрдиреЗ рдЕрдиреБрдорд╛рди рдирд╣реАрдВ рд▓рдЧрд╛рдпрд╛, рд╣рдореЗрдВ ResumeTread рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдбрд┐рдмрдЧрд┐рдВрдЧ рдЪрдХреНрд░ рд▓рд┐рдЦреЗрдВред

рдбрд┐рдмрдЧ рд▓реВрдк


рдбреАрдмрдЧ рд▓реВрдк рдбреАрдмрдЧрд░ рдХрд╛ рджрд┐рд▓ рд╣реИ, рдФрд░ рдЗрд╕реЗ WaitForDebugEvent рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЖрд╕рдкрд╛рд╕ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рджреЛ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ: рдПрдХ DEBUG_EVENT рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рд╕реВрдЪрдХ рдФрд░ рдПрдХ рдЯрд╛рдЗрдордЖрдЙрдЯ (DWORD)ред рд╣рдо рдПрдХ рдЯрд╛рдЗрдордЖрдЙрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрдиреНрдлрд┐рдирд┐рдЯ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВрдЧреЗред рдпрд╣ рдлрд╝рдВрдХреНрд╢рди kernel32.dll рдореЗрдВ рд╕рдорд╛рд╣рд┐рдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдХрд┐рд╕реА рдЕрддрд┐рд░рд┐рдХреНрдд рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рд▓рд┐рдВрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
 BOOL WaitForDebugEvent(DEBUG_EVENT* lpDebugEvent, DWORD dwMilliseconds); 

DEBUG_EVENT рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдХрдИ рдбреАрдмрдЧрд┐рдВрдЧ рдЬрд╛рдирдХрд╛рд░реА рд╢рд╛рдорд┐рд▓ рд╣реЛрддреА рд╣реИ: рдПрдХ рдИрд╡реЗрдВрдЯ рдХреЛрдб, рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЖрдИрдбреА, рдПрдХ рд╕реНрдЯреНрд░реАрдо рдЖрдИрдбреА рдФрд░ рд▓рд╛рдЧреВ рдЬрд╛рдирдХрд╛рд░реАред рдЬреИрд╕реЗ рд╣реА WaitForDebugEvent рдкреВрд░реА рд╣реЛрддреА рд╣реИ рдФрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд▓реМрдЯрддреА рд╣реИ, рд╣рдореЗрдВ рдПрдХ рдбреАрдмрдЧрд░ рд╕рдВрджреЗрд╢ рдорд┐рд▓рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЬрд╛рд░реА рдХреЛрдб рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП ContinueDebugEvent рдкрд░ рдХреЙрд▓ рдХрд░реЗрдВред рдиреАрдЪреЗ рдЖрдк рдиреНрдпреВрдирддрдо рдбрд┐рдмрдЧрд┐рдВрдЧ рдЪрдХреНрд░ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред
 DEBUG_EVENT debug_event = {0}; for(;;) { if (!WaitForDebugEvent(&debug_event, INFINITE)) return; ProcessDebugEvent(&debug_event); // User-defined function, not API ContinueDebugEvent(debug_event.dwProcessId, debug_event.dwThreadId, DBG_CONTINUE); } 

рдХреЙрдиреНрдЯрд┐рдиреНрдпреВрдбреЗрдмреБрдЬ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдУрдПрд╕ рдХреЛ рдУрдкреА рдЪрд▓рд╛рдирд╛ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддреЗ рд╣реИрдВред dwProcessId рдФрд░ dwThreadId рд╣рдореЗрдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдФрд░ рдереНрд░реЗрдб рдмрддрд╛рддрд╛ рд╣реИред рд╣рдореЗрдВ рдпреЗ рдорд╛рди WaitForDebugEvent рд╕реЗ рдорд┐рд▓реЗ рд╣реИрдВред рдЕрдВрддрд┐рдо рдкреИрд░рд╛рдореАрдЯрд░ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдирд┐рд╖реНрдкрд╛рджрди рдЬрд╛рд░реА рд░рдЦрдирд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдпрд╣ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗрд╡рд▓ рддрднреА рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реЛрдЧрд╛ рдЬрдм рдбрд┐рдмрдЧрд┐рдВрдЧ рдореЗрдВ рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдо рдЗрд╕ рдкрд░ рдмрд╛рдж рдореЗрдВ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред рдЗрд╕ рдмреАрдЪ, рд╣рдо рд╕рд┐рд░реНрдл DBG_CONTINUE рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ (рдПрдХ рдЕрдиреНрдп рд╕рдВрднрд╛рд╡рд┐рдд рдореВрд▓реНрдп DBG_EXCEPTION_NOT_HANDLED рд╣реИ)ред

рдбрд┐рдмрдЧ рдЗрд╡реЗрдВрдЯреНрд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛


рдиреМ рдкреНрд░рдореБрдЦ рдбрд┐рдмрдЧрд┐рдВрдЧ рдЗрд╡реЗрдВрдЯ рдФрд░ рдЕрдкрд╡рд╛рдж рд╢реНрд░реЗрдгреА рдореЗрдВ 20 рдЙрдк-рдИрд╡реЗрдВрдЯ рд╣реИрдВред рдЗрд╕реЗ рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд DEBUG_EVENT рдХреА рд╕рдВрд░рдЪрдирд╛ рд╣реИ:
 struct DEBUG_EVENT { DWORD dwDebugEventCode; DWORD dwProcessId; DWORD dwThreadId; union { EXCEPTION_DEBUG_INFO Exception; CREATE_THREAD_DEBUG_INFO CreateThread; CREATE_PROCESS_DEBUG_INFO CreateProcessInfo; EXIT_THREAD_DEBUG_INFO ExitThread; EXIT_PROCESS_DEBUG_INFO ExitProcess; LOAD_DLL_DEBUG_INFO LoadDll; UNLOAD_DLL_DEBUG_INFO UnloadDll; OUTPUT_DEBUG_STRING_INFO DebugString; RIP_INFO RipInfo; } u; }; 

рдЬрдм WaitForDebugEvent рд╕рдлрд▓ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдкреЙрдкреНрдпреБрд▓реЗрдЯ рдХрд░рддрд╛ рд╣реИред dwDebugEventCode рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕рд╛ рдбреАрдмрдЧ рдЗрд╡реЗрдВрдЯ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЖрдпрд╛ рдерд╛ред рдЗрд╕ рдХреЛрдб рдХреЗ рдЖрдзрд╛рд░ рдкрд░, Union'a u рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдШрдЯрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ dwDebugEventCode == OUTPUT_DEBUG_STRING_EVENT рд╣реИ, рддреЛ рдХреЗрд╡рд▓ OUTPUT_DEBUG_STRING_INFO рд╕рд╣реА рдврдВрдЧ рд╕реЗ рднрд░рд╛ рдЬрд╛рдПрдЧрд╛ред

OUTPUT_DEBUG_STRING_EVENT рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ


рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП рдЯреЗрдХреНрд╕реНрдЯ рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЖрдорддреМрд░ рдкрд░ OutputDebugString рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛ рд░рд╣реА рднрд╛рд╖рд╛ / рд░реВрдкрд░реЗрдЦрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдЖрдкрдХреЛ TRACE / ATLTRACE рдореИрдХреНрд░реЛрдЬрд╝ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред .NET рдбреЗрд╡рд▓рдкрд░ System.Diagnostics.Debug.Print / System.Diagnostics.Trace.WriteLine рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдпреЗ рд╕рднреА рддрд░реАрдХреЗ OutputDebugString рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ рдЕрдЧрд░ _DEBUG рдореИрдХреНрд░реЛ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдбреАрдмрдЧрд░ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред
рдЬрдм рдбрд┐рдмрдЧ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╣рдо рдбреАрдмрдЧрд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВред OUTPUT_DEBUG_STRING_INFO рдХреА рд╕рдВрд░рдЪрдирд╛ рдиреАрдЪреЗ рдкреНрд░рд╕реНрддреБрдд рдХреА рдЧрдИ рд╣реИ:
 struct OUTPUT_DEBUG_STRING_INFO { LPSTR lpDebugStringData; // char* WORD fUnicode; WORD nDebugStringLength; }; 

NDebugStringLength рдлрд╝реАрд▓реНрдб рдореЗрдВ рд╕рдорд╛рдкреНрддрд┐ рдирд▓ рд╕рд╣рд┐рдд рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреА рд▓рдВрдмрд╛рдИ рд╣реИред FUnicode рдлрд╝реАрд▓реНрдб рд╢реВрдиреНрдп рд╣реИ рдпрджрд┐ рд╕реНрдЯреНрд░рд┐рдВрдЧ ANSI рд╣реИ, рдФрд░ рдЧреИрд░-рд╢реВрдиреНрдп рд╣реИ рдпрджрд┐ рдпрд╣ рдпреВрдирд┐рдХреЛрдб рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдореЗрдВ nDebugStringLength X2 рдмрд╛рдЗрдЯреНрд╕ рдкрдврд╝рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЪреЗрддрд╛рд╡рдиреА! lpDebugStringData рдореЗрдВ рдПрдХ рд╕рдВрджреЗрд╢ рдХреЗ рд╕рд╛рде рдПрдХ рд▓рд╛рдЗрди рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реВрдЪрдХ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕реВрдЪрдХ рдХреЛ рдбрд┐рдмрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреА рдореЗрдореЛрд░реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ , рди рдХрд┐ рдбреАрдмрдЧрд░ рдХреЛред
рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рдореЗрдореЛрд░реА рд╕реЗ рдбреЗрдЯрд╛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ ReadProcessMemory рдкрд░ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рд╣рдореЗрдВ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдЪреВрдВрдХрд┐ рд╣рдордиреЗ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдмрдирд╛рдИ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред
 case OUTPUT_DEBUG_STRING_EVENT: { CStringW strEventMessage; // Force Unicode OUTPUT_DEBUG_STRING_INFO & DebugString = debug_event.u.DebugString; WCHAR *msg=new WCHAR[DebugString.nDebugStringLength]; // Don't care if string is ANSI, and we allocate double... ReadProcessMemory(pi.hProcess, // HANDLE to Debuggee DebugString.lpDebugStringData, // Target process' valid pointer msg, // Copy to this address space DebugString.nDebugStringLength, NULL); if ( DebugString.fUnicode ) strEventMessage = msg; else strEventMessage = (char*)msg; // char* to CStringW (Unicode) conversion. delete []msg; // Utilize strEventMessage } 

рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдСрдк рдореЗрдореЛрд░реА рдХреЛ рдкрдврд╝рддреЗ рд╕рдордп рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдП?

рдЦреИрд░, рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ me рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛ рджреВрдВ рдХрд┐ рдбреАрдмрдЧ рд╕рдВрджреЗрд╢ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рджреМрд░рд╛рди рдбрд┐рдмрдЧрд░ рдУрдкреА рдХреЗ рд╕рднреА рдереНрд░реЗрдбреНрд╕ рдХреЛ рдЬрдорд╛ рджреЗрддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реНрд╡рдпрдВ рдкреВрд░реА рдирд╣реАрдВ рдХрд░ рдкрд╛рдПрдЧреА, рдХреЛрдИ рднреА рдХрд╛рд░реНрдп рдкреНрд░рдмрдВрдзрдХ (рдорд╛рдирдХ рдпрд╛ рдирд╣реАрдВ) рднреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдпрджрд┐ рдЖрдк рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЕрдЧрд▓реЗ рд╕рдВрджреЗрд╢ рдореЗрдВ, рд╣рдорд╛рд░реЗ рдбрд┐рдмрдЧрд░ рдХреЛ EXIT_PROCESS_DEBUG_EVENT рдИрд╡реЗрдВрдЯ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧрд╛ред

CREATE_PROCESS_DEBUG_EVENT рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг


рдШрдЯрдирд╛ рддрдм рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ рдЬрдм рдУрдкреА рдмрд╕ рд╢реБрд░реВ рд╣реЛ рд░рд╣рд╛ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдкрд╣рд▓рд╛ рд╕рдВрджреЗрд╢ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдбреАрдмрдЧрд░ рдХреЛ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рд╕рдВрджреЗрд╢ рдХреЗ рд▓рд┐рдП, рд╕рдВрдмрдВрдзрд┐рдд DEBUG_EVENT рдлрд╝реАрд▓реНрдб CreateProcessInfo рд╣реЛрдЧреАред рдиреАрдЪреЗ рдЖрдк рдЦреБрдж CREATE_PROCESS_DEBUG_INFO рдХреА рд╕рдВрд░рдЪрдирд╛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:
 struct CREATE_PROCESS_DEBUG_INFO { HANDLE hFile; // The handle to the physical file (.EXE) HANDLE hProcess; // Handle to the process HANDLE hThread; // Handle to the main/initial thread of process LPVOID lpBaseOfImage; // base address of the executable image DWORD dwDebugInfoFileOffset; DWORD nDebugInfoSize; LPVOID lpThreadLocalBase; LPTHREAD_START_ROUTINE lpStartAddress; LPVOID lpImageName; // Pointer to first byte of image name (in Debuggee) WORD fUnicode; // If image name is Unicode. }; 

рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ hProcess рдФрд░ hThread рдЙрди рд▓реЛрдЧреЛрдВ рд╕реЗ рднрд┐рдиреНрди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╣рдореЗрдВ PROCESS_INFORMATION рдореЗрдВ рдорд┐рд▓рддреЗ рд╣реИрдВред рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдФрд░ рдереНрд░реЗрдб рдЖрдИрдбреА рд╕рдорд╛рди рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдкреНрд░рддреНрдпреЗрдХ рд╣реИрдВрдбрд▓ рдЬреЛ рдЖрдкрдХреЛ рд╡рд┐рдВрдбреЛрдЬ рд╕реЗ рдорд┐рд▓рддрд╛ рд╣реИ рд╡рд╣ рдЕрд▓рдЧ рд╣реИред рдЗрд╕рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдХрд╛рд░рдг рд╣реИрдВред
hFile, lpImageName рдХреА рддрд░рд╣, рдУрдкреА рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕рдЪ рд╣реИ, рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо рдЬрд╛рдирддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдордиреЗ рдЗрд╕реЗ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рд▓рд┐рдП EXE рдпрд╛ DLL рдХрд╛ рд╕реНрдерд╛рди рдЬрд╛рдирдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЬрдм рдЖрдк LOAD_DLL_DEBUG_EVENT рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдирд╛рдо рдЬрд╛рдирдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк MSDN рдкрд░ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ, lpImageName рдореЗрдВ рдХрднреА рднреА рдкреВрд░реНрдг рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдУрдкреА рдореЗрдореЛрд░реА рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реЛрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ рдмрд╛рдд рдХреА рдХреЛрдИ рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рд╣реИ рдХрд┐ рдкреВрд░реНрдг рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рднреА рдУрдкреА рдореЗрдореЛрд░реА рдореЗрдВ рд╣реЛрдЧрд╛ред рд╕рд╛рде рд╣реА, рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо рдЕрдзреВрд░рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдлрд╝рд╛рдЗрд▓ рдирд╛рдо hFile рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗред

HFile рд╕реЗ рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ


рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд╣рдореЗрдВ MSDN рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЬрд┐рд╕рдореЗрдВ рд▓рдЧрднрдЧ 10 рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рд╣реИрдВред рдиреАрдЪреЗ рдПрдХ рдЫреЛрдЯрд╛ рд╕рдВрд╕реНрдХрд░рдг рд╣реИ:
 case CREATE_PROCESS_DEBUG_EVENT: { CString strEventMessage = GetFileNameFromHandle(debug_event.u.CreateProcessInfo.hFile); // Use strEventMessage, and other members // of CreateProcessInfo to intimate the user of this event. } 

рдЖрдкрдиреЗ рджреЗрдЦрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдХрдИ рдХреНрд╖реЗрддреНрд░реЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рднрд╛рдЧреЛрдВ рдореЗрдВ рд╣рдо рдЗрд╕ рд╕рдм рдкрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред

LOAD_DLL_DEBUG_EVENT рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг


рдпрд╣ рдИрд╡реЗрдВрдЯ CREATE_PROCESS_DEBUG_EVENT рдХреЗ рд╕рдорд╛рди рд╣реИ, рдФрд░ рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕ рдШрдЯрдирд╛ рдХреЛ рдирд┐рдХрд╛рд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдУрдПрд╕ DLL рдХреЛ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдШрдЯрдирд╛ рд╣рд░ рдмрд╛рд░ рдПрдХ DLL рд▓реЛрдб, рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдпрд╛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд░реВрдк рд╕реЗ рд╣реЛрддреА рд╣реИред рдбреАрдмрдЧ рдЬрд╛рдирдХрд╛рд░реА рдХреЗрд╡рд▓ рдЙрд╕ рд╕рдордп рд╣реЛрддреА рд╣реИ рдЬрдм DLL рд▓реЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдЙрд╕рдХрд╛ рд╡рд░реНрдЪреБрдЕрд▓ рдкрддрд╛ред рдШрдЯрдирд╛ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо Union'a рдлрд╝реАрд▓реНрдб LoadDll рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдореЗрдВ LOAD_DLL_DEBUG_INFO рдЯрд╛рдЗрдк рд╣реИ
 struct LOAD_DLL_DEBUG_INFO { HANDLE hFile; // Handle to the DLL physical file. LPVOID lpBaseOfDll; // The DLL Actual load address in process. DWORD dwDebugInfoFileOffset; DWORD nDebugInfoSize; LPVOID lpImageName; // These two member are same as CREATE_PROCESS_DEBUG_INFO WORD fUnicode; }; 

рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо GetFileNameFromHandle рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЙрд╕реА рддрд░рд╣ рдЬреИрд╕реЗ рд╣рдордиреЗ CREATE_PROCESS_DEBUG_EVENT рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдерд╛ред рдЬрдм рдореИрдВ UNLOAD_DLL_DEBUG_EVENT рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ рддреЛ рдореИрдВ рдпрд╣ рдХреЛрдб рджрд┐рдЦрд╛рдКрдВрдЧрд╛ред UNLOAD_DLL_DEBUG_EVENT рдЗрд╡реЗрдВрдЯ рдореЗрдВ DLL рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдирд╛рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреВрд░реА рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд╣реИред

CREATE_THREAD_DEBUG_EVENT рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг


рдпрд╣ рдШрдЯрдирд╛ рддрдм рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИ рдЬрдм рдУрдкреА рдПрдХ рдирдпрд╛ рдзрд╛рдЧрд╛ рдмрдирд╛рддрд╛ рд╣реИред рд▓рдЧрднрдЧ CREATE_PROCESS_DEBUG_EVENT рдХреА рддрд░рд╣, рдЗрд╕ рдШрдЯрдирд╛ рдХреЛ рдПрдХ рдирдпрд╛ рдзрд╛рдЧрд╛ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдирд┐рдХрд╛рд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдШрдЯрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо CreateThread рдлрд╝реАрд▓реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред CREATE_THREAD_DEBUG_INFO рдХреА рд╕рдВрд░рдЪрдирд╛ рдиреАрдЪреЗ рд╡рд░реНрдгрд┐рдд рд╣реИ:
 struct CREATE_THREAD_DEBUG_INFO { // Handle to the newly created thread in debuggee HANDLE hThread; LPVOID lpThreadLocalBase; // pointer to the starting address of the thread LPTHREAD_START_ROUTINE lpStartAddress; }; 

рдереНрд░реЗрдб рдЖрдИрдбреА DEBUG_EVENT :: dwThreadId рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдереНрд░реЗрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рднреА рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ:
 case CREATE_THREAD_DEBUG_EVENT: { CString strEventMessage; strEventMessage.Format(L"Thread 0x%x (Id: %d) created at: 0x%x", debug_event.u.CreateThread.hThread, debug_event.dwThreadId, debug_event.u.CreateThread.lpStartAddress); // Thread 0xc (Id: 7920) created at: 0x77b15e58 } 

lpStartAddress - рдУрдкреА рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рд╕реНрдЯреНрд░реАрдо рдлрд╝рдВрдХреНрд╢рди рдХреА рд╢реБрд░реБрдЖрдд рдХрд╛ рдкрддрд╛, рдбрд┐рдмрдЧрд░ рдирд╣реАрдВ; рд╣рдо рдЗрд╕реЗ рдкреВрд░реНрдгрддрд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ рдШрдЯрдирд╛ рддрдм рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ рдЬрдм рдореБрдЦреНрдп рдУрдкреА рдереНрд░реЗрдб рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реИ, рдХреЗрд╡рд▓ рддрдм рдЬрдм рдирдП рдореБрдЦреНрдп рдзрд╛рдЧреЗ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред

EXIT_THREAD_DEBUG_EVENT рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг


рдЬреИрд╕реЗ рд╣реА рдмрдЪреНрдЪрд╛ рдереНрд░реЗрдб рдкреВрд░рд╛ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдПрдХ рд░рд┐рдЯрд░реНрди рдХреЛрдб рджреЗрддрд╛ рд╣реИ, рдпрд╣ рдИрд╡реЗрдВрдЯ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИред DEBUG_EVENT рдореЗрдВ dwThreadId рдлрд╝реАрд▓реНрдб рдореЗрдВ рд╕рдорд╛рдкреНрддрд┐ рдереНрд░реЗрдб рдХреА рдЖрдИрдбреА рд╣реИред CREATE_THREAD_DEBUG_EVENT рд╕реЗ рд╕реНрдЯреНрд░реАрдо рдФрд░ рдЕрдиреНрдп рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд░рдгреА рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕ рдШрдЯрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо ExitThread рдлрд╝реАрд▓реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ EXIT_THREAD_DEBUG_INFO рдкреНрд░рдХрд╛рд░ рдХреА рд╣реИ:
 struct EXIT_THREAD_DEBUG_INFO { DWORD dwExitCode; // The thread exit code of DEBUG_EVENT::dwThreadId }; 

рдиреАрдЪреЗ рдШрдЯрдирд╛ рд╣реИрдВрдбрд▓рд░ рдХреЗ рд▓рд┐рдП рдХреЛрдб рд╣реИ:
 case EXIT_THREAD_DEBUG_EVENT: { CString strEventMessage; strEventMessage.Format( _T("The thread %d exited with code: %d"), debug_event.dwThreadId, debug_event.u.ExitThread.dwExitCode); // The thread 2760 exited with code: 0 } 

рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг UNLOAD_DLL_DEBUG_EVENT


рдмреЗрд╢рдХ, рдЗрд╕ рдШрдЯрдирд╛ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╢рд╛рдорд┐рд▓ рд╣реИ рдФрд░ рдУрдкреА рдХреА рд╕реНрдореГрддрд┐ рд╕реЗ DLL рдХреЛ рдкреГрд╖реНрдард╛рдВрдХрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЗрддрдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИ! рдпрд╣ рдХреЗрд╡рд▓ рддрднреА рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ рдЬрдм FreeLibrary рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рддрдм рдирд╣реАрдВ рдЬрдм рд╕рд┐рд╕реНрдЯрдо рд╕реНрд╡рдпрдВ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдЕрдирд▓реЛрдб рдХрд░рддрд╛ рд╣реИред рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, UnloadDll (UNLOAD_DLL_DEBUG_INFO) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
 struct UNLOAD_DLL_DEBUG_INFO { LPVOID lpBaseOfDll; }; 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдХреЗрд╡рд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЖрдзрд╛рд░ рдкрддрд╛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЙрдкрд▓рдмреНрдз рд╣реИред рдЗрд╕реАрд▓рд┐рдП рдореИрдВрдиреЗ рдЖрдкрдХреЛ рддреБрд░рдВрдд LOAD_DLL_DEBUG_EVENT рдХреЗ рдХреЛрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдмрддрд╛рдпрд╛ред DLL рдХреЛ рд▓реЛрдб рдХрд░рддреЗ рд╕рдордп, рд╣рдореЗрдВ lpBaseOfDll рднреА рдорд┐рд▓рддрд╛ рд╣реИред рдЖрдк рдЕрдкрдиреЗ рдкрддреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдирд╛рдо рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдпрд╣ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рд╕рднреА рдкреБрд╕реНрддрдХрд╛рд▓рдп рд▓реЛрдбрд┐рдВрдЧ рдШрдЯрдирд╛рдУрдВ рдХреЛ рдЙрдирдХреЗ рдЕрдирд▓реЛрдбрд┐рдВрдЧ рдЗрд╡реЗрдВрдЯ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╣рдореЗрдВ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд╕рднреА рдирд╛рдореЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ LOAD_DLL_DEBUG_EVENT рд╣рдореЗрдВ рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ рдХрд┐ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреИрд╕реЗ рднрд░реА рд╣реБрдИ рдереАред
рдиреАрдЪреЗ рджреЛрдиреЛрдВ рдШрдЯрдирд╛рдУрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рд╣реИ:
 std::map < LPVOID, CString > DllNameMap; ... case LOAD_DLL_DEBUG_EVENT: { strEventMessage = GetFileNameFromHandle(debug_event.u.LoadDll.hFile); // Storing the DLL name into map. Map's key is the Base-address DllNameMap.insert( std::make_pair( debug_event.u.LoadDll.lpBaseOfDll, strEventMessage) ); strEventMessage.AppendFormat(L" - Loaded at %x", debug_event.u.LoadDll.lpBaseOfDll); } break; ... case UNLOAD_DLL_DEBUG_EVENT: { strEventMessage.Format(L"DLL '%s' unloaded.", DllNameMap[debug_event.u.UnloadDll.lpBaseOfDll] ); // Get DLL name from map. } break; 

EXIT_PROCESS_DEBUG_EVENT рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг


рдпрд╣ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдШрдЯрдирд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ, рдФрд░ рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рдУрдкреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдкрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдШрдЯрдирд╛ рд╣рдореЗрдВ рджрд┐рдЦрд╛рддреА рд╣реИ рдХрд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреИрд╕реЗ рд╕рдорд╛рдкреНрдд рд╣реБрдИ: рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдпрд╛ рддрддреНрдХрд╛рд▓ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрд╛рд░реНрдп рдкреНрд░рдмрдВрдзрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ), рдпрд╛ рдбреАрдмрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреНрд░реИрд╢ рд╣реЛ рдЧрдпрд╛ред рд╕реВрдЪрдирд╛ рд╣рдореЗрдВ EXIT_PROCESS_DEBUG_INFO ExitProcess рд╕реЗ рдорд┐рд▓рддреА рд╣реИ;
 struct EXIT_PROCESS_DEBUG_INFO { DWORD dwExitCode; }; 

рдЬреИрд╕реЗ рд╣реА рд╣рдо рдЗрд╕ рдШрдЯрдирд╛ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рд╣рдореЗрдВ рдбрд┐рдмрдЧ рдЪрдХреНрд░ рдХреЛ рдмрд╛рдзрд┐рдд рдХрд░рдиреЗ рдФрд░ рдбрд┐рдмрдЧ рд╕реНрдЯреНрд░реАрдо рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдзреНрд╡рдЬ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрдЧрд╛ред
 bool bContinueDebugging=true; ... case EXIT_PROCESS_DEBUG_EVENT: { strEventMessage.Format(L"Process exited with code: 0x%x", debug_event.u.ExitProcess.dwExitCode); bContinueDebugging=false; } break; 


EXCEPTION_DEBUG_EVENT рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг


рдпрд╣ рд╕рднреА рдбрд┐рдмрдЧрд┐рдВрдЧ рдШрдЯрдирд╛рдУрдВ рдореЗрдВ рд╕рдмрд╕реЗ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рдФрд░ рдЬрдЯрд┐рд▓ рдмрд╛рдд рд╣реИред MSDN рд╕реЗ:
рдпрд╣ рдШрдЯрдирд╛ рддрдм рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИ рдЬрдм рдбреАрдмрдЧ рдХреА рдЧрдИ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдХреЛрдИ рдЕрдкрд╡рд╛рдж рд╣реЛрддрд╛ рд╣реИ (рд╕рдВрднрд╡рддрдГ рд╢реВрдиреНрдп рд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рд╣реЛрдиреЗ рдкрд░, рд╕рд░рдгреА рдХреА рд╕реАрдорд╛рдУрдВ рд╕реЗ рдкрд░реЗ рдЬрд╛рдХрд░, рдЗрдВрдЯ 3 рдирд┐рд░реНрджреЗрд╢ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реБрдП, рдпрд╛ рдПрд╕рдИрдПрдЪ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рд╕реА рдЕрдиреНрдп рдЕрдкрд╡рд╛рдж рдХреЛ)ред DEBUG_EVENT рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ EXCEPTION_DEBUF_INFO рд╕рдВрд░рдЪрдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИред рдпрд╣ рд╡рд╣ рд╣реИ рдЬреЛ рдЕрдкрд╡рд╛рдж рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред

рдЗрд╕ рдШрдЯрдирд╛ рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рд╡рд░реНрдгрди рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рд▓реЗрдЦ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рд╣рд╛рдБ, рднрд▓реЗ рд╣реА рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ)ред рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдЖрдкрдХреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдкрд╡рд╛рдж рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдКрдВрдЧрд╛ред
рдЕрдкрд╡рд╛рдж рдлрд╝реАрд▓реНрдб рдореЗрдВ рдЕрдкрд╡рд╛рдж рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрддреА рд╣реИ рдЬреЛ рдЕрднреА рд╣реБрдИ рд╣реИред рдиреАрдЪреЗ рдЖрдк EXCEPTION_DEBUG_INFO рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рд╡рд┐рд╡рд░рдг рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:
 struct EXCEPTION_DEBUG_INFO { EXCEPTION_RECORD ExceptionRecord; DWORD dwFirstChance; }; 

ExceptionRecord рдлрд╝реАрд▓реНрдб рдореЗрдВ рдЕрдкрд╡рд╛рдж рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╕реНрддреГрдд рдЬрд╛рдирдХрд╛рд░реА рд╣реИред
 struct EXCEPTION_RECORD { DWORD ExceptionCode; DWORD ExceptionFlags; struct _EXCEPTION_RECORD *ExceptionRecord; PVOID ExceptionAddress; DWORD NumberParameters; ULONG_PTR ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS]; // 15 }; 

рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо EXCEPTION_RECORD рдореЗрдВ рддрд▓реНрд▓реАрди рд╣реЛрдВ, рдореИрдВ рдЖрдкрд╕реЗ EXCEPTION_DEBUG_INFO :: dwFirstChance рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛
рдЬрдм рдХреЛрдИ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рдЕрдВрддрд░реНрдЧрдд рд╣реЛрддреА рд╣реИ, рддреЛ рдУрдкреА рдХреЗ рдорд┐рд▓рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдбрд┐рдмрдЧрд░ рдХреЛ рд╣рдореЗрд╢рд╛ рдПрдХ рдЕрдкрд╡рд╛рдж рдорд┐рд▓рддрд╛ рд╣реИред рдЖрдкрдиреЗ + ++ рдХреЗ рддрд╣рдд рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдбреАрдмрдЧ рдХрд░рддреЗ рд╕рдордп "SomeModule рдореЗрдВ 0x00412882 рдкрд░ рдкреНрд░рдердо-рдЕрдкрд╡рд╛рдж рдЕрдкрд╡рд╛рдж" рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рджреЗрдЦреА рд╣реЛрдЧреАред рдпрд╣ рдлрд░реНрд╕реНрдЯ рдЪрд╛рдВрд╕ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИред рдПрдХ рд╣реА рдЕрдкрд╡рд╛рдж рджреВрд╕рд░реЗ рдореМрдХрд╛ рдЕрдкрд╡рд╛рджреЛрдВ рдкрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдЬрдм рдПрдХ рдУрдкреА рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рджреВрд╕рд░реЗ рдореМрдХреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдУрдкреА рдЗрд╕ рдЕрдкрд╡рд╛рдж рдХреЛ рд╕рдВрднрд╛рд▓ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рдпрд╣ рд╕рд┐рд░реНрдл рдЧрд┐рд░ рд╕рдХрддрд╛ рд╣реИред рдпреЗ рдЕрдкрд╡рд╛рдж C ++ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рдирд╣реАрдВ рд╣реИрдВ, рдмрд▓реНрдХрд┐ Windows SEH рдЗрдВрдЬрди рдХреЗ рд╣реИрдВред рдореИрдВ рд▓реЗрдЦ рдХреЗ рдЕрдЧрд▓реЗ рднрд╛рдЧ рдореЗрдВ рдереЛрдбрд╝рд╛ рдФрд░ рдЦреБрд▓рд╛рд╕рд╛ рдХрд░реВрдВрдЧрд╛ред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдбрд┐рдмрдЧрд░ рдЕрдкрд╡рд╛рдж рд╕рдВрджреЗрд╢ (рдкрд╣рд▓рд╛ рдореМрдХрд╛ рдЕрдкрд╡рд╛рдж) рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд╕реЗ рдЙрд╕реЗ рдУрдкреА рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рддреЗрдЬреА рд╕реЗ рдЕрдкрд╡рд╛рдж рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓рддреА рд╣реИред рдХреБрдЫ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдиреЗ рдбрд┐рдмрдЧрд░ рдХреЛ рдЕрдкрдирд╛ рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ-рдореМрдХрд╛ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдлреЗрдВрдХ рджрд┐рдпрд╛ред

ContinueDebugEvent рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдФрд░


рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди (dwContinueStatus) рдХрд╛ рддреАрд╕рд░рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗрд╡рд▓ рдПрдХ рдЕрдкрд╡рд╛рдж рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдЕрдиреНрдп рдШрдЯрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЕрдкрд╡рд╛рдж рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, ContinueDebugEvent рдХреЛ рдЗрд╕рдХреЗ рд╕рд╛рде рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:

рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрджрд┐ DBG_CONTINUE рдХреЛ рдбрд┐рдмрдЧрд┐рдВрдЧ рдИрд╡реЗрдВрдЯ рдХреЗ рджреМрд░рд╛рди рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдареАрдХ рдЙрд╕реА рдЕрдкрд╡рд╛рдж рдХреЛ рдбреАрдмрдЧрд░ рдореЗрдВ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рд╡рд╣реА рдИрд╡реЗрдВрдЯ рддреБрд░рдВрдд рдЖ рдЬрд╛рдПрдЧрд╛ред рд▓реЗрдХрд┐рди рдЬрдм рд╕реЗ рд╣рдо рд╕рд┐рд░реНрдл рдбрд┐рдмрдЧрд░ рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЪрд▓реЛ рдПрдХ рдмрдВрджреВрдХ рдирд╣реАрдВ, рдПрдХ рд╕реБрд░рдХреНрд╖рд┐рдд рдЧреБрд▓реЗрд▓ рдХреЗ рд╕рд╛рде рдЦреЗрд▓рддреЗ рд╣реИрдВ, рдФрд░ рд╣рдо EXCEPTION_NOT_HANDLED рд▓реМрдЯрд╛рдПрдВрдЧреЗред рдЗрд╕ рд▓реЗрдЦ рдХрд╛ рдЕрдкрд╡рд╛рдж рдЗрдВрдЯ 3 (рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ) рд╣реИ, рдЬрд┐рд╕ рдкрд░ рд╣рдо рдмрд╛рдж рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВрдЧреЗред

рдЕрдкрд╡рд╛рдж рдХреЛрдб



  1. EXCEPTION_ACCESS_VIOLATION
  2. EXCEPTION_ARRAY_BOUNDS_EXCEEDED
  3. EXCEPTION_BREAKPOINT
  4. EXCEPTION_DATATYPE_MISALIGNMENT
  5. EXCEPTION_FLT_DENORMAL_OPERAND
  6. EXCEPTION_FLT_DIVIDE_BY_ZERO
  7. EXCEPTION_FLT_INEXACT_RESULT
  8. EXCEPTION_FLT_INVALID_OPERATION
  9. EXCEPTION_FLT_OVERFLOW
  10. EXCEPTION_FLT_STACK_CHECK
  11. EXCEPTION_FLT_UNDERFLOW
  12. EXCEPTION_ILLEGAL_INSTRUCTION
  13. EXCEPTION_IN_PAGE_ERROR
  14. EXCEPTION_INT_DIVIDE_BY_ZERO
  15. EXCEPTION_INT_OVERFLOW
  16. EXCEPTION_INVALID_DISPOSITION
  17. EXCEPTION_NONCONTINUABLE_EXCEPTION
  18. EXCEPTION_PRIV_INSTRUCTION
  19. EXCEPTION_SINGLE_STEP
  20. EXCEPTION_STACK_OVERFLOW

рд╢рд╛рдВрдд рд╣реЛ рдЬрд╛рдУ, рдореИрдВ рдЙрди рд╕рднреА рдХрд╛ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВред рдХреЗрд╡рд▓ EXCEPTION_BREAKPOINT:
 case EXCEPTION_DEBUG_EVENT: { EXCEPTION_DEBUG_INFO& exception = debug_event.u.Exception; switch( exception.ExceptionRecord.ExceptionCode) { case STATUS_BREAKPOINT: // Same value as EXCEPTION_BREAKPOINT strEventMessage= "Break point"; break; default: if(exception.dwFirstChance == 1) { strEventMessage.Format(L"First chance exception at %x, exception-code: 0x%08x", exception.ExceptionRecord.ExceptionAddress, exception.ExceptionRecord.ExceptionCode); } dwContinueStatus = DBG_EXCEPTION_NOT_HANDLED; } break; } 

рдЖрдкрдХреЛ рдЗрд╕ рдмрд╛рдд рдХреА рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдХрд┐ рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рдХреНрдпрд╛ рд╣реИред рдорд╛рдирдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдкрд░реЗ, рдПрдХ рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рдХреЛ рдбрд┐рдмрдЧрдмреНрд░реЗрдХ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдпрд╛ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдирд┐рд░реНрджреЗрд╢ {рдЗрдВрдЯ 3} рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред .NET рдореЗрдВ, рдЖрдк System.Diagnostics.Debugger.Break рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдбреАрдмрдЧрд░ рдХреЛ STATUS_BREAKPOINT (EXCEPTION_BREAKPOINT рдХреЗ рд╕рдорд╛рди) рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧрд╛ред рдбрд┐рдмрдЧрд░ рд╡рд░реНрддрдорд╛рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдорддреМрд░ рдкрд░ рдЗрд╕ рдШрдЯрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЙрд╕ рд╕реНрдерд╛рди рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб рджрд┐рдЦрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдШрдЯрдирд╛ рд╣реБрдИ рдереАред рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рд╣рдорд╛рд░рд╛ рдбрд┐рдмрдЧрд░ рдЕрднреА рд╡рд┐рдХрд╕рд┐рдд рд╣реЛрдирд╛ рд╢реБрд░реВ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдХреЗрд╡рд▓ рдореВрд▓ рдЬрд╛рдирдХрд╛рд░реА рдмрд┐рдирд╛ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЗ рджрд┐рдЦрд╛рдПрдВрдЧреЗред
рдпрджрд┐ рдХрд┐рд╕реА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдПрдХ рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдбреАрдмрдЧрд░ рдХреЗ рдиреАрдЪреЗ рдирд╣реАрдВ рд╣реИ, рддреЛ рдпрд╣ рдмрд╕ рджреБрд░реНрдШрдЯрдирд╛рдЧреНрд░рд╕реНрдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
 if ( !IsDebuggerPresent() ) AfxMessageBox(L"No debugger is attached currently."); else DebugBreak(); 

рдЕрдВрдд рдореЗрдВ, рдореИрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдбрд┐рдмрдЧрд┐рдВрдЧ рдИрд╡реЗрдВрдЯ рджреЗрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛: EXCEPTION_DEBUG_EVENTред рдпрд╣ рдЖрдпреЛрдЬрди рд▓рдЧрд╛рддрд╛рд░ рд╣реЛрддрд╛ рд░рд╣реЗрдЧрд╛ред Visual Studio рдЬреИрд╕реЗ рдбреАрдмрдЧрд░реНрд╕ рдЗрд╕реЗ рдЕрдирджреЗрдЦрд╛ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди WinDbg рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдирд┐рд╖реНрдХрд░реНрд╖


рдбреАрдмрдЧрдореЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рдбреАрдмрдЧрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

рджреВрд╕рд░рд╛ рд╣рд┐рд╕реНрд╕рд╛ рдФрд░ рднреА рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛ рдФрд░ рд╡рд╣ рд░рд╛рд╕реНрддреЗ рдореЗрдВ рд╣реИ!
UPD: рднрд╛рдЧ 2


Source: https://habr.com/ru/post/In154847/


All Articles