退出代码

Azure Sphere 高级应用程序可以使用退出代码返回与代码中发生错误的位置及其发生原因相关的信息。 退出代码对应于介于 0 和 255 之间的值,其中 0 表示成功。

在应用中定义和使用退出代码

遵循以下准则在应用中定义和使用退出代码:

  • 创建一个退出代码变量,并在应用程序开头将其初始化为成功 (0) 。
  • 从错误导致应用程序退出的任何函数返回退出代码。 函数退出代码可以提供有关操作错误的详细信息。 例如,向 IoT Central 应用程序发送消息的函数可能会返回一个错误代码,该错误代码提供有关故障发生位置的详细信息:消息构造、IoT 连接、消息传输等。 负责初始化外围设备的其他函数将返回唯一的退出代码,以指示特定外围设备的故障。
  • 如果函数设置或返回失败退出代码 ( (非零) ,请确保立即将其传播回,以便main函数返回。 这将导致应用程序使用给定的退出代码退出。 Azure Sphere OS 将立即重启应用程序 (,除非使用带有连接开发板的调试器) ,并且可以使用错误报告来诊断退出失败的原因。

错误报告

高级应用程序退出时,Azure Sphere OS 会记录应用程序返回的退出代码,然后每天将包含此信息的错误报告上传到 Azure Sphere 安全服务。 通过将错误报告中的退出代码与应用程序中定义的退出代码进行比较,通常可以确定错误的位置和原因。 有关详细信息 ,请参阅解释 AppExits

RTApps 无法将错误数据直接返回到 Azure Sphere 安全服务。 如果要在 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变量分配初始成功值,应用程序就保留在main循环中。 如果main应用程序逻辑的任何部分将变量设置为exitCode成功值以外的值,则应用程序将中断main循环,并使用设置 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;
}