2014-09-18 15 views
2

gcc adventure.c -o adventure 다음에 리눅스 (우분투) 터미널에서 adventure을 실행하면 컴파일되어 실행됩니다. 런타임 중에 오류가 발생하면 (예 : 세그멘테이션 오류) 터미널 출력으로 오류가보고됩니다.리눅스 에서처럼 명령 행에서 실제 오류 표시

그러나 Windows에서는 런타임 오류로 인해 "adventure.c"가 대화 상자 작업을 중지하고 cmd.exe 화면의 출력에 아무 것도 기록되지 않습니다.

Windows에서보고 된 오류가 발생할 수있는 방법이 있습니까?

+0

은 무엇이 C와 무슨 상관 이죠 ... A는 crt0을 수정,하지만 난 그런 일에 터치 싫어 사용하는 것입니다 ++? – crashmstr

+0

나는 c와 C++가 단일 파일 프로그램을 가지고있을 때 거의 동일한 컴파일/실행 사이클을 가지고 있다고 생각했다. C++ 태그를 제거 할 것 같아요 – user717572

+0

Windows에서 "직접"지원하지 않는다고 생각합니다. 그러나 GetLastError (http://msdn.microsoft.com/en-us/library/)를 시도 할 수 있다고 상상합니다. windows/desktop/ms679360 (v = vs.85) .aspx) 및 [FormatMessage] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms679351(v=vs.85))를 참조하십시오.aspx) –

답변

1

윈도우에서, 당신은 당신이 실행 파일을 (빌드하는 서브 시스템을 정의 심판 :. /SUBSYSTEM (Specify Subsystem) 두 개 공유지 서브 시스템이 명령 줄 응용 프로그램을위한 CONSOLE 및 GUI 사람을위한 WINDOWS 있습니다

바와 같이 참조 페이지에 설명 된의. 서브 시스템은 일반적으로 표준 C main 기능이 있으면 CONSOLE으로 자동 설정됩니다. 일반적으로 CONSOLE 응용 프로그램과 관련된 오류는 응용 프로그램에 연결된 콘솔에 표시되고 응용 프로그램과 관련된 오류 메시지 상자가 열립니다.

하지만 모험 버전에는 무엇이 있는지 정확히 알지 못합니다. (많은 사람들이 주위에 존재합니다 ...) - 스 니프, 모험을 할 때 나는 젊었습니다. SIGSGV (C ..에서 쉬운) 콘솔 프로그램을 생성하고 오류가 표시되는 위치를 확인해야합니다. 코멘트 당

편집 :

앤드류 메디 주석 후 잘

(그 덕분에), 나는 테스트를하고 ... 그는 바로 :-(는 ... 심지어 콘솔 progam 메시지 상자에 의해이 열립니다 . 기본 및

그래서 당신은 당신이 원하는 것을 달성하기 위해 Microsoft structured exception handling를 사용해야합니다 ... 슬픈 아무것도 기록하지 않습니다,하지만 당신은 약간의 소스 코드를 그런 식으로 수정해야합니다

  • 원본 소스 :

    를,515,
    #include ... 
    ... 
    
    int main(...) { 
        ... 
    } 
    

단순히 치명적인 오류를 잡아 구조화 예외 핸들러와 원래의 코드를 감싸는 모든 오류의 코드 어드레스에 기록

#include ... 
#include <excpt.h> 
#include <windows.h> 
... 

int real_main(...) { 
    ... 
} 

int filter(DWORD code, LPEXCEPTION_POINTERS info) { 
    fprintf(stderr, "Fatal error %x at %x\n", code, 
     info->ExceptionRecord->ExceptionAddress); 
    return EXCEPTION_EXECUTE_HANDLER; 
} 

int main(int argc, char *argv[]){ 
    int cr; 
    __try { 
     cr = real_main(...); 
    } 
    __except(filter(exception_code(), exception_info())) { 
     cr = 1; 
    } 
    return cr; 
} 
수정 된 소스 오류 발생합니다. 오류가 발견되면 Windows는 더 이상 메시지 상자를 열지 않습니다 (디버거에서는 제외). 일반적으로 오류 텍스트를 표시하려면 FormatMessage을 사용하는 것이 더 좋겠지 만 시도한대로 사용할 수는 없습니다.

클리너 방법은

+1

정말 도움이되지 않습니다. Windows에서 프로세스 크래시는 하위 시스템에 관계없이 대화 상자를 트리거합니다. 환경 변수를 사용하여 대화 상자를 표시하지 않을 수 있지만 콘솔로 인쇄하려면 대화 상자를 변경할 수 없습니다. –

+0

@AndrewMedico : 네 말이 맞아요, 구조화 된 예외 처리 솔루션으로 게시물을 편집했습니다. –

+0

예외 처리 솔루션은 기본 설정이 부족하여 문제가없는 것으로 보입니다. 실제 프로젝트의 경우 디버거 또는 적절한 오류 처리 기능을 사용하지만 작은 "진행중인 작업을 시도하는"종류의 프로그램에서는 주로 성가신 일입니다. 왜 다른 사람들이이 행동에 귀찮은 것 같아서 궁금합니다. – user717572