윈도우에서, 당신은 당신이 실행 파일을 (빌드하는 서브 시스템을 정의 심판 :. /SUBSYSTEM (Specify Subsystem) 두 개 공유지 서브 시스템이 명령 줄 응용 프로그램을위한 CONSOLE
및 GUI 사람을위한 WINDOWS
있습니다
바와 같이 참조 페이지에 설명 된의. 서브 시스템은 일반적으로 표준 C main
기능이 있으면 CONSOLE
으로 자동 설정됩니다. 일반적으로 CONSOLE
응용 프로그램과 관련된 오류는 응용 프로그램에 연결된 콘솔에 표시되고 응용 프로그램과 관련된 오류 메시지 상자가 열립니다.
하지만 모험 버전에는 무엇이 있는지 정확히 알지 못합니다. (많은 사람들이 주위에 존재합니다 ...) - 스 니프, 모험을 할 때 나는 젊었습니다. SIGSGV (C ..에서 쉬운) 콘솔 프로그램을 생성하고 오류가 표시되는 위치를 확인해야합니다. 코멘트 당
편집 :
앤드류 메디 주석 후 잘
(그 덕분에), 나는 테스트를하고 ... 그는 바로 :-(는 ... 심지어 콘솔 progam 메시지 상자에 의해이 열립니다 . 기본 및
그래서 당신은 당신이 원하는 것을 달성하기 위해
Microsoft structured exception handling를 사용해야합니다 ... 슬픈 아무것도 기록하지 않습니다,하지만 당신은 약간의 소스 코드를 그런 식으로 수정해야합니다
단순히 치명적인 오류를 잡아 구조화 예외 핸들러와 원래의 코드를 감싸는 모든 오류의 코드 어드레스에 기록
#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
을 사용하는 것이 더 좋겠지 만 시도한대로 사용할 수는 없습니다.
클리너 방법은
은 무엇이 C와 무슨 상관 이죠 ... A는
crt0
을 수정,하지만 난 그런 일에 터치 싫어 사용하는 것입니다 ++? – crashmstr나는 c와 C++가 단일 파일 프로그램을 가지고있을 때 거의 동일한 컴파일/실행 사이클을 가지고 있다고 생각했다. C++ 태그를 제거 할 것 같아요 – user717572
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) –