스레드 종료 코드 란 무엇입니까?


115

디버깅하는 동안 출력 창에서 스레드 종료 코드는 정확히 무엇입니까? 어떤 정보를 제공합니까? 그것은 어떻게 든 유용하거나 나를 괴롭히지 않아야하는 내부적 인 것입니까?

The thread 0x552c has exited with code 259 (0x103).
The thread 0x4440 has exited with code 0 (0x0).

중요성과 함께 가능한 종료 코드 목록이 있습니까?

답변:


100

실제로 종료 코드가 스레드가 종료 방법에 대한 표시를 제공하는 데 사용되는 가정되는하지만 분명히이 주제에 대한 설명을 많이있을하지 않는 것, 0아무것도 그것을 didn를 의미하는 경향이 동안 안전하게 종료 것을 의미하는 경향이있다 예상대로 종료하지 마십시오. 그러나이 종료 코드를 코드에 직접 설정하여이를 완전히 간과 할 수 있습니다.

더 많은 정보를 얻을 수있는 가장 가까운 링크는 다음과 같습니다.

위 링크에서 인용 :

종료 방법이 무엇이든 프로세스 또는 스레드에서 반환하는 정수는 0-255 (8 비트) 값이어야합니다. 0 값은 성공을 나타내고 0이 아닌 값은 실패를 나타냅니다. 모든 정수 값을 종료 코드로 반환 할 수 있지만 정수의 가장 낮은 바이트 만 종료 코드의 일부로 프로세스 또는 스레드에서 반환됩니다. 상위 바이트는 운영 체제에서 프로세스에 대한 특수 정보를 전달하는 데 사용됩니다. 종료 코드는 하나의 성공 또는 실패에 따라 다른 프로그램을 조건부로 실행하는 배치 / 쉘 프로그램에서 매우 유용합니다.


GetEXitCodeThread에 대한 문서에서

중요 GetExitCodeThread 함수는 스레드가 종료 된 후에 만 ​​응용 프로그램에서 정의한 유효한 오류 코드를 반환합니다. 따라서 응용 프로그램은 STILL_ACTIVE (259)를 오류 코드로 사용해서는 안됩니다. 스레드가 STILL_ACTIVE (259) 를 오류 코드로 반환하면 이 값을 테스트하는 응용 프로그램은 스레드가 아직 실행 중임을 의미하는 것으로 해석하고 스레드가 종료 된 후에도 스레드 완료를 계속 테스트 할 수 있습니다. 무한 루프에 응용 프로그램.


이 모든 것에 대한 나의 이해는 자신의 응용 프로그램 에서 자신의 응용 프로그램 내에서 스레드를 사용하는 경우 종료 코드가 그다지 중요하지 않다는 것입니다 . 이에 대한 예외는 서로 종속성이있는 두 개의 스레드를 동시에 실행하는 경우 일 수 있습니다. 외부 소스에서이 오류 코드를 읽어야하는 경우 다른 응용 프로그램이 스레드의 상태를 알 수 있도록 설정할 수 있습니다.


1
출력 창에서 제거하는 방법이 있습니까?
Arne Evertsson 2014 년

26
@ArneEvertsson-도구 | Options ... "Debugging \ Output Window"영역 아래에 "Thread Exit Messages"(On | Off) 설정이 있습니다.
josh poley

2
이는 동기 응용 프로그램 주 스레드 내에서 비동기 메서드를 사용하고 있고 완료 될 때까지 기다리지 않음을 의미 할 수 있습니다. 이 문제를 처리하는 가장 쉬운 방법은이 샘플에 표시된대로 다른 메서드에서 시작되고 반환 된 Task에서 Wait ()를 호출하는 것입니다. asp.net/web-api/overview/advanced/… RunAsync().Wait();
Bron Davies

1
@BronDavies 스레드 풀 스레드가 Wait ()를 호출 한 후에도 오류 코드 259와 함께 종료됩니다. 여기에 내 코드 static void Main(string[] args) { var t = new Task<object>(() => SomeOp(2)); t.Start(); t.Wait(); }가 있습니다. 스레드는 단순히 다음 작업에 할당되기를 기다리는 스레드 풀로 돌아갑니다. 이것이 바로 여기서 종료 코드 STILL_ACTIVE (259)가 매우 직관적으로 들리는 이유입니다.
RBT

링크의 기사가 잘못되었습니다. 스레드 종료 코드 (또는 프로세스 종료 코드)가 단일 바이트 일 필요는 없습니다.
Harry Johnston

55

Sayse가 언급했듯이 종료 코드 259 (0x103)에는 특별한 의미가 있습니다.이 경우 디버깅중인 프로세스가 여전히 실행 중입니다.

스레드는 각 웹 서비스 호출을 실행 한 후에도 계속 실행되기 때문에 웹 서비스 디버깅에서 이것을 많이 보았습니다 (여전히 추가 호출을 수신 중이므로).


7
더 많은 정보 .. 일반적으로 스레드 풀이 소유 한 모든 스레드는 259로 종료됩니다. 참조 : stackoverflow.com/questions/21632584/…
Skrymsli

이것이 무엇을 의미하는지 궁금했고 귀하의 대답은 C # 콘솔 앱을 실행하는 동안 내가 본 것과 정확히 일치했습니다. 감사!
kayleeFrye_onDeck

0

나에게 일어난 일은 내 솔루션에 여러 프로젝트가 있다는 것입니다. 프로젝트 1을 디버그하려고했지만 프로젝트 2가 기본 시작 프로젝트로 설정되었습니다. 이 문제를 해결하고 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 "시작 프로젝트로 설정"을 선택한 다음 디버깅을 실행하는 것이 좋습니다.


1
출력 창에 디버깅 메시지가 문제로 표시되지 않습니다. 나는 그것들을 제거하는 방법이 아니라 그들이 무엇인지 궁금했습니다.
드레이 야나첵
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.