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

рд╣рдо рд╕рднреА, рд╕рдордп-рд╕рдордп рдкрд░, рдбрд┐рдмрдЧрд░ рд╕реЗ рдбрд┐рдмрдЧ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдбреАрдмрдЧрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ C ++, C #, Java рдФрд░ рд╕реИрдХрдбрд╝реЛрдВ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдпрд╛ рддреЛ рдмрд╛рд╣рд░реА (WinDbg) рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд╡рд╛рддрд╛рд╡рд░рдг (рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ) рдореЗрдВ рдПрдореНрдмреЗрдбреЗрдб рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдЖрдкрдиреЗ рдХрднреА рд╕реЛрдЪрд╛ рд╣реИ рдХрд┐ рдбрд┐рдмрдЧрд░ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ?
рдФрд░ рдЖрдк рднрд╛рдЧреНрдпрд╢рд╛рд▓реА рд╣реИрдВред рд▓реЗрдЦреЛрдВ рдХреА рдЗрд╕ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рд╣рдо рд╕рдордЭреЗрдВрдЧреЗ рдХрд┐ рдХреИрд╕реЗ рдФрд░ рдХреИрд╕реЗ рдбреАрдмрдЧрд┐рдВрдЧ рдЕрдВрджрд░ рд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИред рдпрд╣ рдЖрд▓реЗрдЦ рдХреЗрд╡рд▓ Windows рдХреЗ рд▓рд┐рдП рдбрд┐рдмрдЧрд░ рд▓рд┐рдЦрдиреЗ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рддрд╛ рд╣реИред рд╕рдВрдХрд▓рдХ, рд▓рд┐рдВрдХрд░реНрд╕ рдФрд░ рдЕрдиреНрдп рдЬрдЯрд┐рд▓ рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреЗ рдмрд┐рдирд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рдХреЗрд╡рд▓ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдбреАрдмрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдПрдХ рдмрд╛рд╣рд░реА рдбреАрдмрдЧрд░ рд▓рд┐рдЦреЗрдВрдЧреЗред рдЗрд╕ рд▓реЗрдЦ рдХреЛ рдкрд╛рдардХ рдХреЛ рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ рдХреА рдореВрд▓ рдмрд╛рддреЗрдВ рд╕рдордЭрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдбреАрдмрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ:
- рдзреНрд╡рдЬ DEBUG_ONLY_THIS_PROCESS рдпрд╛ DEBUG_PROCESS рдХреЗ рд╕рд╛рде рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд╛рд░рдВрдн рдХрд░реЗрдВ;
- рдПрдХ рдбреАрдмрдЧ рд▓реВрдк рд╢реБрд░реВ рдХрд░реЗрдВ рдЬреЛ рд╕рдВрджреЗрд╢реЛрдВ рдФрд░ рдШрдЯрдирд╛рдУрдВ рдХреЛ рдкрдХрдбрд╝ рд▓реЗрдЧрд╛;
рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдпрд╛рдж рд░рдЦреЗрдВ:
- рдбреАрдмрдЧрд░ рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ / рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╣реИ рдЬреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдбреАрдмрдЧ рдХрд░реЗрдЧрд╛;
- рдбреАрдмрдЧреНрдб рдкреНрд░реЛрдЧреНрд░рд╛рдо (рдУрдкреА) рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ / рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╣реИ рдЬрд┐рд╕реЗ рдбреАрдмрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ;
- рдпрд╣ рдбрд┐рдмрдЧрд░ рд╣реИ рдЬреЛ рдУрдкреА рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдбрд┐рдмрдЧрд░ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ (рд╡рд┐рднрд┐рдиреНрди рдереНрд░реЗрдбреНрд╕ рдореЗрдВ) рд╕реЗ рдЬреБрдбрд╝ рд╕рдХрддрд╛ рд╣реИ;
- рдХреЗрд╡рд▓ рд╡реЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдБ рдЬрд┐рдиреНрд╣реЗрдВ рдбреАрдмрдЧрд░ рдХреЗ рдЕрдВрддрд░реНрдЧрдд рд╕реЗ рдкреНрд░рд╛рд░рдВрдн рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдбреАрдмрдЧ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░, CreateProcess рдФрд░ рдбреАрдмрдЧрд░ рд▓реВрдк рдПрдХ рд╣реА рдереНрд░реЗрдб рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП;
- рдЬрдм рдбрд┐рдмрдЧрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкреВрд░реА рд╣реЛ рдЬрд╛рддреА рд╣реИ, рддреЛ рдпрд╣ рдУрдкреА рдХреЛ рднреА рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИ;
- рдЬрдм рдбреАрдмрдЧрд░ рд╡реНрдпрд╕реНрдд рдИрд╡реЗрдВрдЯ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рд╡реНрдпрд╕реНрдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдУрдкреА рдХреЗ рд╕рднреА рдереНрд░реЗрдбреНрд╕ рдХреЛ рдереЛрдбрд╝реА рджреЗрд░ рдХреЗ рд▓рд┐рдП рдЬрдорд╛ рджреЗрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдж рдореЗрдВ;
рдПрдХ рдбрд┐рдмрдЧ рдзреНрд╡рдЬ рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╢реБрд░реВ рдХрд░рдирд╛
рд╣рдо 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);
рдХреЙрдиреНрдЯрд┐рдиреНрдпреВрдбреЗрдмреБрдЬ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдУрдПрд╕ рдХреЛ рдУрдкреА рдЪрд▓рд╛рдирд╛ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддреЗ рд╣реИрдВред 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;
NDebugStringLength рдлрд╝реАрд▓реНрдб рдореЗрдВ рд╕рдорд╛рдкреНрддрд┐ рдирд▓ рд╕рд╣рд┐рдд рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреА рд▓рдВрдмрд╛рдИ рд╣реИред FUnicode рдлрд╝реАрд▓реНрдб рд╢реВрдиреНрдп рд╣реИ рдпрджрд┐ рд╕реНрдЯреНрд░рд┐рдВрдЧ ANSI рд╣реИ, рдФрд░ рдЧреИрд░-рд╢реВрдиреНрдп рд╣реИ рдпрджрд┐ рдпрд╣ рдпреВрдирд┐рдХреЛрдб рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдореЗрдВ nDebugStringLength X2 рдмрд╛рдЗрдЯреНрд╕ рдкрдврд╝рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЪреЗрддрд╛рд╡рдиреА! lpDebugStringData рдореЗрдВ рдПрдХ рд╕рдВрджреЗрд╢ рдХреЗ рд╕рд╛рде рдПрдХ рд▓рд╛рдЗрди рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реВрдЪрдХ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕реВрдЪрдХ рдХреЛ
рдбрд┐рдмрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреА рдореЗрдореЛрд░реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛
рд╣реИ , рди рдХрд┐ рдбреАрдмрдЧрд░ рдХреЛред
рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рдореЗрдореЛрд░реА рд╕реЗ рдбреЗрдЯрд╛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ ReadProcessMemory рдкрд░ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рд╣рдореЗрдВ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдЪреВрдВрдХрд┐ рд╣рдордиреЗ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдмрдирд╛рдИ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред
case OUTPUT_DEBUG_STRING_EVENT: { CStringW strEventMessage;
рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдСрдк рдореЗрдореЛрд░реА рдХреЛ рдкрдврд╝рддреЗ рд╕рдордп рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдП?
рдЦреИрд░, рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ me рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛ рджреВрдВ рдХрд┐ рдбреАрдмрдЧ рд╕рдВрджреЗрд╢ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рджреМрд░рд╛рди рдбрд┐рдмрдЧрд░ рдУрдкреА рдХреЗ рд╕рднреА рдереНрд░реЗрдбреНрд╕ рдХреЛ рдЬрдорд╛ рджреЗрддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реНрд╡рдпрдВ рдкреВрд░реА рдирд╣реАрдВ рдХрд░ рдкрд╛рдПрдЧреА, рдХреЛрдИ рднреА рдХрд╛рд░реНрдп рдкреНрд░рдмрдВрдзрдХ (рдорд╛рдирдХ рдпрд╛ рдирд╣реАрдВ) рднреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдпрджрд┐ рдЖрдк рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЕрдЧрд▓реЗ рд╕рдВрджреЗрд╢ рдореЗрдВ, рд╣рдорд╛рд░реЗ рдбрд┐рдмрдЧрд░ рдХреЛ EXIT_PROCESS_DEBUG_EVENT рдИрд╡реЗрдВрдЯ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧрд╛ред
CREATE_PROCESS_DEBUG_EVENT рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг
рдШрдЯрдирд╛ рддрдм рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ рдЬрдм рдУрдкреА рдмрд╕ рд╢реБрд░реВ рд╣реЛ рд░рд╣рд╛ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдкрд╣рд▓рд╛ рд╕рдВрджреЗрд╢ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдбреАрдмрдЧрд░ рдХреЛ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рд╕рдВрджреЗрд╢ рдХреЗ рд▓рд┐рдП, рд╕рдВрдмрдВрдзрд┐рдд DEBUG_EVENT рдлрд╝реАрд▓реНрдб CreateProcessInfo рд╣реЛрдЧреАред рдиреАрдЪреЗ рдЖрдк рдЦреБрдж CREATE_PROCESS_DEBUG_INFO рдХреА рд╕рдВрд░рдЪрдирд╛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:
struct CREATE_PROCESS_DEBUG_INFO { HANDLE hFile;
рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ 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);
рдЖрдкрдиреЗ рджреЗрдЦрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдХрдИ рдХреНрд╖реЗрддреНрд░реЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рднрд╛рдЧреЛрдВ рдореЗрдВ рд╣рдо рдЗрд╕ рд╕рдм рдкрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред
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;
рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо 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 {
рдереНрд░реЗрдб рдЖрдИрдбреА 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);
lpStartAddress - рдУрдкреА рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рд╕реНрдЯреНрд░реАрдо рдлрд╝рдВрдХреНрд╢рди рдХреА рд╢реБрд░реБрдЖрдд рдХрд╛ рдкрддрд╛, рдбрд┐рдмрдЧрд░ рдирд╣реАрдВ; рд╣рдо рдЗрд╕реЗ рдкреВрд░реНрдгрддрд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ рдШрдЯрдирд╛ рддрдм рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ рдЬрдм рдореБрдЦреНрдп рдУрдкреА рдереНрд░реЗрдб рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реИ, рдХреЗрд╡рд▓ рддрдм рдЬрдм рдирдП рдореБрдЦреНрдп рдзрд╛рдЧреЗ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред
EXIT_THREAD_DEBUG_EVENT рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг
рдЬреИрд╕реЗ рд╣реА рдмрдЪреНрдЪрд╛ рдереНрд░реЗрдб рдкреВрд░рд╛ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдПрдХ рд░рд┐рдЯрд░реНрди рдХреЛрдб рджреЗрддрд╛ рд╣реИ, рдпрд╣ рдИрд╡реЗрдВрдЯ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИред DEBUG_EVENT рдореЗрдВ dwThreadId рдлрд╝реАрд▓реНрдб рдореЗрдВ рд╕рдорд╛рдкреНрддрд┐ рдереНрд░реЗрдб рдХреА рдЖрдИрдбреА рд╣реИред CREATE_THREAD_DEBUG_EVENT рд╕реЗ рд╕реНрдЯреНрд░реАрдо рдФрд░ рдЕрдиреНрдп рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд░рдгреА рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕ рдШрдЯрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо ExitThread рдлрд╝реАрд▓реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ EXIT_THREAD_DEBUG_INFO рдкреНрд░рдХрд╛рд░ рдХреА рд╣реИ:
struct EXIT_THREAD_DEBUG_INFO { DWORD dwExitCode;
рдиреАрдЪреЗ рдШрдЯрдирд╛ рд╣реИрдВрдбрд▓рд░ рдХреЗ рд▓рд┐рдП рдХреЛрдб рд╣реИ:
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);
рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг 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);
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];
рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо EXCEPTION_RECORD рдореЗрдВ рддрд▓реНрд▓реАрди рд╣реЛрдВ, рдореИрдВ рдЖрдкрд╕реЗ EXCEPTION_DEBUG_INFO :: dwFirstChance рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛
рдЬрдм рдХреЛрдИ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рдЕрдВрддрд░реНрдЧрдд рд╣реЛрддреА рд╣реИ, рддреЛ рдУрдкреА рдХреЗ рдорд┐рд▓рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдбрд┐рдмрдЧрд░ рдХреЛ рд╣рдореЗрд╢рд╛ рдПрдХ рдЕрдкрд╡рд╛рдж рдорд┐рд▓рддрд╛ рд╣реИред рдЖрдкрдиреЗ + ++ рдХреЗ рддрд╣рдд рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдбреАрдмрдЧ рдХрд░рддреЗ рд╕рдордп "SomeModule рдореЗрдВ 0x00412882 рдкрд░ рдкреНрд░рдердо-рдЕрдкрд╡рд╛рдж рдЕрдкрд╡рд╛рдж" рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рджреЗрдЦреА рд╣реЛрдЧреАред рдпрд╣ рдлрд░реНрд╕реНрдЯ рдЪрд╛рдВрд╕ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИред рдПрдХ рд╣реА рдЕрдкрд╡рд╛рдж рджреВрд╕рд░реЗ рдореМрдХрд╛ рдЕрдкрд╡рд╛рджреЛрдВ рдкрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдЬрдм рдПрдХ рдУрдкреА рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рджреВрд╕рд░реЗ рдореМрдХреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдУрдкреА рдЗрд╕ рдЕрдкрд╡рд╛рдж рдХреЛ рд╕рдВрднрд╛рд▓ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рдпрд╣ рд╕рд┐рд░реНрдл рдЧрд┐рд░ рд╕рдХрддрд╛ рд╣реИред рдпреЗ рдЕрдкрд╡рд╛рдж C ++ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рдирд╣реАрдВ рд╣реИрдВ, рдмрд▓реНрдХрд┐ Windows SEH рдЗрдВрдЬрди рдХреЗ рд╣реИрдВред рдореИрдВ рд▓реЗрдЦ рдХреЗ рдЕрдЧрд▓реЗ рднрд╛рдЧ рдореЗрдВ рдереЛрдбрд╝рд╛ рдФрд░ рдЦреБрд▓рд╛рд╕рд╛ рдХрд░реВрдВрдЧрд╛ред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдбрд┐рдмрдЧрд░ рдЕрдкрд╡рд╛рдж рд╕рдВрджреЗрд╢ (рдкрд╣рд▓рд╛ рдореМрдХрд╛ рдЕрдкрд╡рд╛рдж) рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд╕реЗ рдЙрд╕реЗ рдУрдкреА рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рддреЗрдЬреА рд╕реЗ рдЕрдкрд╡рд╛рдж рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓рддреА рд╣реИред рдХреБрдЫ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдиреЗ рдбрд┐рдмрдЧрд░ рдХреЛ рдЕрдкрдирд╛ рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ-рдореМрдХрд╛ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдлреЗрдВрдХ рджрд┐рдпрд╛ред
ContinueDebugEvent рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдФрд░
рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди (dwContinueStatus) рдХрд╛ рддреАрд╕рд░рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗрд╡рд▓ рдПрдХ рдЕрдкрд╡рд╛рдж рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдЕрдиреНрдп рдШрдЯрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЕрдкрд╡рд╛рдж рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, ContinueDebugEvent рдХреЛ рдЗрд╕рдХреЗ рд╕рд╛рде рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:
- DBG_CONTINUE рдпрджрд┐ рдЕрдкрд╡рд╛рдж рдбреАрдмрдЧрд░ рджреНрд╡рд╛рд░рд╛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкрдХрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ред рдбреАрдмрдЧ рдХрд┐рдП рдЧрдП рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕реЗ рдХреБрдЫ рднреА рдЕрдзрд┐рдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЗрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
- рдбреАрдмрдЧ_EXCEPTION_NOT_HANDLED рдпрджрд┐ рдпрд╣ рдЕрдкрд╡рд╛рдж рдбреАрдмрдЧрд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ (рд╣реИрдВрдбрд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред рдбреАрдмрдЧрд░ рдХреЗрд╡рд▓ рдпрд╣ рд░рд┐рдХреЙрд░реНрдб рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдкрд╡рд╛рдж рдерд╛ред
рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрджрд┐ DBG_CONTINUE рдХреЛ рдбрд┐рдмрдЧрд┐рдВрдЧ рдИрд╡реЗрдВрдЯ рдХреЗ рджреМрд░рд╛рди рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдареАрдХ рдЙрд╕реА рдЕрдкрд╡рд╛рдж рдХреЛ рдбреАрдмрдЧрд░ рдореЗрдВ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рд╡рд╣реА рдИрд╡реЗрдВрдЯ рддреБрд░рдВрдд рдЖ рдЬрд╛рдПрдЧрд╛ред рд▓реЗрдХрд┐рди рдЬрдм рд╕реЗ рд╣рдо рд╕рд┐рд░реНрдл рдбрд┐рдмрдЧрд░ рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЪрд▓реЛ рдПрдХ рдмрдВрджреВрдХ рдирд╣реАрдВ, рдПрдХ рд╕реБрд░рдХреНрд╖рд┐рдд рдЧреБрд▓реЗрд▓ рдХреЗ рд╕рд╛рде рдЦреЗрд▓рддреЗ рд╣реИрдВ, рдФрд░ рд╣рдо EXCEPTION_NOT_HANDLED рд▓реМрдЯрд╛рдПрдВрдЧреЗред рдЗрд╕ рд▓реЗрдЦ рдХрд╛ рдЕрдкрд╡рд╛рдж рдЗрдВрдЯ 3 (рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ) рд╣реИ, рдЬрд┐рд╕ рдкрд░ рд╣рдо рдмрд╛рдж рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВрдЧреЗред
рдЕрдкрд╡рд╛рдж рдХреЛрдб
- EXCEPTION_ACCESS_VIOLATION
- EXCEPTION_ARRAY_BOUNDS_EXCEEDED
- EXCEPTION_BREAKPOINT
- EXCEPTION_DATATYPE_MISALIGNMENT
- EXCEPTION_FLT_DENORMAL_OPERAND
- EXCEPTION_FLT_DIVIDE_BY_ZERO
- EXCEPTION_FLT_INEXACT_RESULT
- EXCEPTION_FLT_INVALID_OPERATION
- EXCEPTION_FLT_OVERFLOW
- EXCEPTION_FLT_STACK_CHECK
- EXCEPTION_FLT_UNDERFLOW
- EXCEPTION_ILLEGAL_INSTRUCTION
- EXCEPTION_IN_PAGE_ERROR
- EXCEPTION_INT_DIVIDE_BY_ZERO
- EXCEPTION_INT_OVERFLOW
- EXCEPTION_INVALID_DISPOSITION
- EXCEPTION_NONCONTINUABLE_EXCEPTION
- EXCEPTION_PRIV_INSTRUCTION
- EXCEPTION_SINGLE_STEP
- EXCEPTION_STACK_OVERFLOW
рд╢рд╛рдВрдд рд╣реЛ рдЬрд╛рдУ, рдореИрдВ рдЙрди рд╕рднреА рдХрд╛ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВред рдХреЗрд╡рд▓ EXCEPTION_BREAKPOINT:
case EXCEPTION_DEBUG_EVENT: { EXCEPTION_DEBUG_INFO& exception = debug_event.u.Exception; switch( exception.ExceptionRecord.ExceptionCode) { case STATUS_BREAKPOINT:
рдЖрдкрдХреЛ рдЗрд╕ рдмрд╛рдд рдХреА рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдХрд┐ рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рдХреНрдпрд╛ рд╣реИред рдорд╛рдирдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдкрд░реЗ, рдПрдХ рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рдХреЛ рдбрд┐рдмрдЧрдмреНрд░реЗрдХ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдпрд╛ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдирд┐рд░реНрджреЗрд╢ {рдЗрдВрдЯ 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