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)이란 뜻이다!
역시... 이런게 없을리가 없지...ㅋㅋㅋ
'개발 및 운영 > 프로그래밍' 카테고리의 다른 글
효율적인 그리고 안전한 소켓 통신 서버 (0) | 2017.11.13 |
---|---|
KiUserApcDispatcher Hooking (0) | 2017.10.21 |
[JsServerSocket] Linux용 다중클라이언트 서버 라이브러리 (0) | 2017.04.12 |
라이브러리 없이 mktime등 time함수 구현 (0) | 2016.02.21 |
프록시 환경 libwebsockets 에서 실제 클라이언트 IP 헤더 패치 (0) | 2015.07.31 |
댓글