다음을 통해 공유


종료 코드

Azure Sphere 상위 수준 애플리케이션은 종료 코드를 사용하여 코드에서 오류가 발생한 위치 및 오류가 발생한 이유와 관련된 정보를 반환할 수 있습니다. 종료 코드는 0에서 255 사이의 값에 해당하며 여기서 0은 성공을 나타냅니다.

앱에서 종료 코드 정의 및 사용

앱에서 종료 코드를 정의하고 사용하려면 다음 지침을 따르세요.

  • 종료 코드 변수를 만들고 애플리케이션 시작 시 성공(0)으로 초기화합니다.
  • 오류가 발생하여 애플리케이션이 종료된 함수에서 종료 코드를 반환합니다. 함수 종료 코드는 운영 오류에 대한 자세한 정보를 제공할 수 있습니다. 예를 들어 IoT Central 애플리케이션에 메시지를 보내는 함수는 오류 발생 위치(메시지 생성, IoT 연결, 메시지 전송 등)에 대한 세부 정보를 제공하는 오류 코드를 반환할 수 있습니다. 주변 장치 초기화를 담당하는 다른 함수는 특정 주변 장치에서 오류를 나타내는 고유한 종료 코드를 반환합니다.
  • 함수에서 실패 종료 코드(0이 아닌 코드)를 설정하거나 반환하는 경우 기본 함수가 반환되도록 즉시 다시 전파해야 합니다. 이렇게 하면 지정된 종료 코드로 애플리케이션이 종료됩니다. Azure Sphere OS는 연결된 개발 보드에서 디버거를 사용하지 않는 한 애플리케이션을 즉시 다시 시작하고 오류 보고서를 사용하여 종료가 발생하는 이유를 진단할 수 있습니다.

오류 보고서

상위 수준 애플리케이션이 종료되면 Azure Sphere OS는 애플리케이션에서 반환한 종료 코드를 기록하고 나중에 이 정보가 포함된 오류 보고서를 매일 Azure Sphere Security Service에 업로드합니다. 오류 보고서의 종료 코드를 애플리케이션에 정의된 종료 코드와 비교하여 오류의 위치와 원인을 확인할 수 있는 경우가 많습니다. 자세한 내용은 AppExits 해석 을 참조하세요.

RTApps는 Azure Sphere Security Service에 직접 오류 데이터를 반환할 수 없습니다. RTApp에서 오류 추적을 구현하려면 코어 간 통신 메커니즘을 사용하여 RTApp에서 상위 수준 앱으로 오류 데이터를 전달해야 합니다. 자세한 내용은 상위 수준 애플리케이션과 통신실시간 지원 애플리케이션과 통신 을 참조하세요.

샘플 종료 코드 구현

다음 코드 조각은 종료 코드를 상위 수준 애플리케이션에 통합하는 방법의 샘플을 보여 줍니다.

먼저 애플리케이션에서 특정 종료 코드 값을 모두 정의하는 데 사용할 수 있는 열거형을 선언 ExitCode 합니다. 그런 다음 전역 exitCode 변수를 성공 상태(0)로 초기화합니다.

// Exit codes for this application.
typedef enum {
ExitCode_Success = 0;
ExitCode_Init_LED = 1;
ExitCode_Init_Button = 2;
} ExitCode;

// Initialize the termination state.
static volatile sig_atomic_t exitCode = ExitCode_Success;

애플리케이션을 종료해야 하는 오류 사례가 포함된 함수는 ExitCode 열거형을 반환해야 합니다. 애플리케이션을 종료해야 하는 오류 사례에 도달하면 해당 사례에 대해 정의한 특정 종료 코드를 반환합니다. 아래 예제 InitPeripheralsAndHandlers 에서는 LED 및 단추를 초기화하는 함수가 정의됩니다. 초기화에 실패하면 위에 정의된 해당 ExitCode 값이 반환됩니다.

// Initialize the peripherals and handlers. Return ExitCode_Success if all resources were allocated
// successfully; otherwise another ExitCode value which indicates a specific failure.
static ExitCode InitPeripheralsAndHandler(void)
{
	// Open SAMPLE_LED as output.
	led = GPIO_OpenAsOutput(SAMPLE_LED);
	if (led == -1) {
		return ExitCode_Init_LED;
	}

	// Open SAMPLE_BUTTON as input.
	button = GPIO_OpenAsInput(SAMPLE_BUTTON);
	if (button == -1) {
		return ExitCode_Init_Button;
	}
	return ExitCode_Success;
}

초기화 후에도 전역 exitCode 변수에 초기 성공 값이 할당되는 한 애플리케이션은 기본 루프에 유지됩니다. 기본 애플리케이션 논리의 일부가 변수를 성공 이외의 값으로 설정한 exitCode 경우 애플리케이션은 기본 루프에서 벗어나 집합exitCode으로 종료됩니다. Azure Sphere OS는 오류 보고서에서 앱 종료 이벤트 및 해당 종료 코드를 캡처한 다음 애플리케이션을 다시 시작합니다.

int main(int argc, char* argv[])
{
	exitCode = InitPeripheralsAndHandler();

	while (exitCode == ExitCode_Success) {
		// Run other application functions within this loop.
		// When a function encounters an error, set a corresponding exit code and return from that function.
		// This will break out of the while loop if the exit code is not ExitCode_Success.
	}

	return exitCode;
}