我正在编写自己的基于枚举的回溯。基本上,每个函数调用都会将其错误附加到预定义的堆栈中,该堆栈最终将包括所有函数调用中的所有错误。
我想创建一种有效的方法来解析它。最后,我从整个代码库中获得了int backtrace[]
的枚举值,我想将每个枚举值与其名称关联起来。
这当然应该在发生故障后完成(而不是在运行时进行),所以我所缺少的是一种可能将所有枚举及其值转储到文件中的方法,也许是编译步骤的一部分。然后,我可以编写一个解析错误的脚本。
是否有一个简单的(跨平台)静态工具可以做到这一点?
答案 0 :(得分:0)
不知道如何记录错误,但如何:
typedef enum
{
E_SUCCESS = 0,
E_FAIL,
...
} error_t;
typedef struct
{
error_t code;
char * error_name;
} backtrace_entry_t;
backtrace_entry_t backtrace[..];
#define FUNC_EXIT(error_code__) \
do { \
backtrace[func_id].code = (error_code__); \
backtrace[func_id].error_name = #error_code__; \
} while (0)
然后,当您调用FUNC_EXIT(E_SUCCESS);
时,该函数的回溯将为:{.code = 0, .error_name = "E_SUCCESS"}
问题是,如果调用FUNC_EXIT(var);
(其中var
是一些局部变量),您将无法获得正确的名称。
另一种选择,尽管仍然不是自动的:
typedef enum
{
E_SUCCESS = 0,
E_FAIL,
...
NOF_ERROR_CODES
} error_t;
#define MAP_E_CODE_TO_NAME(error_code__) [error_code__] = #error_code__
const char * error_to_name_mapping[NOF_ERROR_CODES] = {
MAP_E_CODE_TO_NAME(E_SUCCESS),
MAP_E_CODE_TO_NAME(E_FAIL),
...
};
将使用const char *
给出一个{"E_SUCCESS", "E_FAIL", ...}
数组,您可以像这样使用它:
printf("The name of error code %d is '%s'", error, error_to_name_mapping[error]);
这里的问题是,您必须对增加值的错误具有正值。