본문 바로가기
개발 및 운영/프로그래밍

DebugActiveProcess, WaitForDebugEvent, ContinueDebugEvent 삽질기

by Joseph.Lee 2017. 10. 19.

DebugActiveProcess(pid);


while(WaitForDebugEvent(&dbgEventInfo, INFINITE))

{

if (dbgEventInfo.dwDebugEventCode == EXCEPTION_DEBUG_EVENT)

{

dwdbgContinueStatus = DBG_EXCEPTION_NOT_HANDLED; // 중요!

}

ContinueDebugEvent(dbgEventInfo.dwProcessId, dbgEventInfo.dwThreadId, dwdbgContinueStatus);

}

 


디버거에서 Exception가 발생했을 때 DBG_EXCEPTION_NOT_HANDLED 을 설정해주지 않으면

클라이언트 프로세스가 죽는다...

이거때문에 오늘 4시간넘게 암걸리는줄,,,,ㅠㅠㅠㅠ


안전한 예외 (죽지않아도되는 예외)가 발생했을 때 저걸 설정해주지 않아서 프로그램이 죽는 일이 있었다...ㅠㅠ

아래는 나의 문제많고 나를 암걸리게 했던 코드이다.


dwdbgContinueStatus = DBG_CONTINUE;

...

if ((dbgEventInfo.u.Exception.ExceptionRecord.ExceptionCode & 0xC0000000) == 0xC0000000)

{

// 덤프작성

dwdbgContinueStatus = DBG_EXCEPTION_NOT_HANDLED; // 오류발생하면 클라이언트 프로세스가 죽도록 내버려두게 설정한 용도였는데...

}


if(dwdbgContinueStatus != DBG_EXCEPTION_NOT_HANDLED)

ContinueDebugEvent(dbgEventInfo.dwProcessId, dbgEventInfo.dwThreadId, dwdbgContinueStatus);





---추가---


C++ try catch 가 있어도 WaitForDebugEvent에서 EXCEPTION_DEBUG_EVENT가 발생한다.

진짜 오류?... 즉 Unhandled Exception가 발생하면 DBG_EXCEPTION_NOT_HANDLED을주고 디버깅을 재개하면 즉시 또다시 EXCEPTION_DEBUG_EVENT가 발생한다.

이렇게 Unhandled Exception을 감지할 수 있다.


하지만 이러한 방법의 문제점은...

다른 Debug event가 발생하기 전에 Handled exception이 두번 발생하면 Unhandled Exception으로 인식할 수 있다.

이에 대한 해결책은... 찾는 중이다...ㅠㅠ

무식하게 어느정도의 시간이 지나면 다른 Exception으로 인식하게 할 수 있지만 진짜 무식하고 완벽한 해결방법이 아니다...^^


---위 상황에 대한 해답---

EXCEPTION_DEBUG_INFO에 dwFirstChance란 값이 있는데 이게 1이번 첫번째 예외, 0이면 두번째 (즉 Unhandled Exception)이란 뜻이다!

역시... 이런게 없을리가 없지...ㅋㅋㅋ

반응형

댓글