2010-01-06 2 views
1

다음과 같은 문제가 있습니다. 응용 프로그램 (끝나지 않는 서버)이 C++로 작성되었으며 주 스레드 내부의 스레드 (주로 IO를 수행하는 스레드)를 포함하는 서비스로 실행됩니다.프로세스 종료 C++

주 루프에서는 가능한 모든 예외가 발생합니다.

프로세스가 종료되었고 주 루프 또는 스레드 자체에서 아무 것도 인쇄되지 않았습니다. 이벤트 로그에서 프로세스가 코드 1000으로 중지되었음을 확인했습니다.

  1. Windows에서 유닉스와 같은 코어 파일을 생성합니까?
  2. 이벤트 로그에서 메모리 주소를 얻은 경우 응용 프로그램의 어느 부분에서 발생했는지 알 수있는 방법이 있습니까?
  3. 아마도 이것은 단서입니다. 동시에 동일한 유형이 아닌 다른 응용 프로그램을 시작했습니다.
+0

참고 : 스택을 main()에 권선을 풀지 않고 응용 프로그램을 종료하는 방법이 있습니다. exit(), terminate() 및 abort()를 참조하십시오. 이러한 기능은 특정 상황에서 자동으로 호출 될 수 있습니다. –

답변

1

합니까 윈도우 유닉스처럼 코어 파일을 생성보다 아마도 더 나은 아이디어가 직접 구조화 된 예외를 사용하여, 제안 whunmr 으로?

자동으로 생성되지 않습니다.그러나 당신도 코드 또는 windbg를 같은 외부 애플리케이션 을 사용하여, 또는

Dr. Watson을 구현하는 사건의 경우 것은 내가 메모리 주소를 얻을 로그인 에 의해 이러한 파일을 사용할 수 있습니다에 알 수있는 방법이있다 응용 프로그램의 어느 부분이 발생 했습니까? 내가 다른 응용 프로그램을 시작 일어난 것과 같은 시간에 (: 디버그 정보 파일 (PDB)

을 유지하지 않는 경우

아마이 단서가, 방법 일반적인 경우가 없다 동일한 유형이 아님).

응용 프로그램 모두 상호 작용하지 않는 한이, 도움이되는 정보가 아니며 서로 디버거의 설정에 따라 같이 Windows가 사용하는 것입니다 어떤 프로그램

2

구조적 예외 처리를 사용하지 않는 한 catch(...)은 코드에서 잘못 될 수있는 모든 것을 가로 채지 않습니다. 예 :

 
#include "stdio.h" 
int main(char** argv, int c) 
{ 
    try { 
    int this_will_be_zero = (c == 9999); 
    int blowup = 1/this_will_be_zero; 
    } catch (...) { 
    printf("you won't see this message\n"); 
    } 
} 
+0

I 메인에 사용 시도 {} 캐치 (exceptiona의 @e) 캐치 (exceptionb @e) 캐치 (exceptionSTL의 @e) 캐치 (exceptionBaseMineException의 @e) 캐치 (...) –

+1

것을 자신의 요점은 Windows 및 하드웨어 예외 (SEH)가 아닌 C++ 예외 만 잡는 것입니다. __try 및 __except 키워드를보십시오. –

5

사후 디버거로 windbg를 설정해보세요.

  1. 는 명령 행에서 windbg
  2. 는 "windbg -I는"
  3. 는 응용 프로그램에서 처리되지 않은 예외를 얻을 때 다음, WinDbg를 활성화 할 것입니다, 당신이 응용 프로그램을 시작
  4. 실행 설치합니다.
  5. windbg에서 스택 트레이스를 보려면 "kb" or "!uniqstack"을 사용하십시오.

    look here for more commands.
    및 분석 방법은 here입니다.

시도를 사용 SEH :

시도 ++은 C와 창문 (예 : 액세스 위반 등) 구조화 된 예외를 포착하기 위해 응용 프로그램을 구축 할 때 당신은/EHA 컴파일러 스위치를 사용할 필요가
#include "windows.h" 
#include "stdio.h" 

DWORD FilterFunction() 
{ 
printf("you will see this message first.\n"); 
return EXCEPTION_EXECUTE_HANDLER; 
} 


int main(char** argv, int c) 
{ 
__try 
{ 
    int this_will_be_zero = (c == 9999); 
    int blowup = 1/this_will_be_zero; 
} 
__except (FilterFunction()) 
{ 
    printf("you will see this message\n"); 
} 

return 0; 
} 
2

/구조를 잡아라.

Visual Studio의 경우 이것은 프로젝트 속성 구성 속성 -> C/C++ -> 코드 생성 -> C++ 예외 사용으로되어 있습니다. SEH 예외가있는 예 (/ EHa)를 원합니다. 나는 그들이 정확하게 무엇인지 기억할 수는 없지만 이것을 읽는 것이 몇 가지 중요한 결점이 있음을 기억합니다.

링크 : MSDN on C++ exception handling model

편집 :/EHA

+0

FWIW, 나는 main()에서 __try/__catch를 사용하면 좋을 것 같지만, 내 코드를 이식성과 그 모든 것들에 버려 두는 것에 신경을 써야한다. 그러나 OP는 다른 곳에서 main()을 잡는 중임을 나타내므로 아무런 문제가 없습니다. – tragomaskhalos

1

:

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug] 
"Auto"="0" 
"Debugger"="My_Debugger" -p %ld -e %ld" 
"UserDebuggerHotKey"=dword:00000000 

당신이 할 수있는 My_Debugger을 디버깅을 위해 사용중인 프로그램/IDE의 전체 경로로 변경하십시오.

이것은 종종 Dr Watson으로 설정되어 사용자가 원하지 않는 충돌의 로그 항목을 만듭니다.