1717static struct cme_Error generic_error = {0 };
1818
1919#define CREATE_GENERIC_ERROR (status_code , err_msg ) \
20- generic_error.stack_length = 0; \
21- generic_error.code = (status_code); \
22- generic_error.source_line = __LINE__; \
2320 snprintf(generic_error.msg, CME_STR_MAX, "%s", (err_msg)); \
24- snprintf(generic_error.source_func, CME_STR_MAX, "%s", __func__);
21+ generic_error.code = (status_code); \
22+ generic_error.stack_length = 1; \
23+ generic_error.stack_symbols[0].source_file = __FILE__; \
24+ generic_error.stack_symbols[0].source_func = __func__; \
25+ generic_error.stack_symbols[0].source_line = __LINE__;
2526
2627cme_error_t cme_error_create (int code , char * source_file , char * source_func ,
2728 int source_line , char * fmt , ...) {
@@ -32,17 +33,11 @@ cme_error_t cme_error_create(int code, char *source_file, char *source_func,
3233 return & generic_error ;
3334 }
3435
35- err -> stack_length = 0 ;
3636 err -> code = code ;
37- err -> source_line = source_line ;
38-
39- if (source_file ) {
40- snprintf (err -> source_file , CME_STR_MAX , "%s" , source_file );
41- }
42-
43- if (source_func ) {
44- snprintf (err -> source_func , CME_STR_MAX , "%s" , source_func );
45- }
37+ err -> stack_length = 1 ;
38+ err -> stack_symbols [0 ].source_func = source_func ;
39+ err -> stack_symbols [0 ].source_file = source_file ;
40+ err -> stack_symbols [0 ].source_line = source_line ;
4641
4742 if (fmt ) {
4843 va_list args ;
@@ -72,40 +67,33 @@ int cme_error_dump_to_str(cme_error_t err, uint32_t n, char *buffer) {
7267 size_t offset = 0 ;
7368 int written ;
7469
75- /* 1) Common fields */
7670 written = cme_sprintf (buffer + offset , n - offset ,
7771 "====== ERROR DUMP ======\n"
7872 "Error code: %d\n"
79- "Error message: %s\n"
80- "Src file: %s\n"
81- "Src line: %d\n"
82- "Src func: %s\n" ,
83- err -> code , err -> msg , err -> source_file , err -> source_line ,
84- err -> source_func );
73+ "Error message: %s\n" ,
74+ err -> code , err -> msg );
8575 if (written < 0 ) {
8676 return ENOBUFS ;
8777 }
78+
79+ offset += (size_t )written ;
80+
81+ written =
82+ cme_sprintf (buffer + offset , n - offset , "------------------------\n" );
83+ if (written < 0 )
84+ return ENOBUFS ;
8885 offset += (size_t )written ;
8986
90- #ifdef CME_ENABLE_BACKTRACE
91- if (err -> stack_length > 0 ) {
92- written =
93- cme_sprintf (buffer + offset , n - offset , "------------------------\n" );
94- if (written < 0 ) {
87+ for (uint32_t i = 0 ; i < err -> stack_length ; ++ i ) {
88+ const struct cme_StackSymbol * sym = & err -> stack_symbols [i ];
89+ written = cme_sprintf (buffer + offset , n - offset , "%u:%s:%s:%u\n" , i ,
90+ sym -> source_func ? sym -> source_func : "??" ,
91+ sym -> source_file ? sym -> source_file : "??" ,
92+ sym -> source_line );
93+ if (written < 0 )
9594 return ENOBUFS ;
96- }
9795 offset += (size_t )written ;
98-
99- for (int i = 0 ; i < err -> stack_length ; ++ i ) {
100- written = cme_sprintf (buffer + offset , n - offset , "[%p]\n" ,
101- err -> stack_symbols [i ]);
102- if (written < 0 ) {
103- return ENOBUFS ;
104- }
105- offset += (size_t )written ;
106- }
10796 }
108- #endif
10997
11098 return 0 ;
11199}
@@ -124,19 +112,23 @@ int cme_error_dump_to_file(cme_error_t err, char *path) {
124112 return 0 ;
125113}
126114
127- cme_error_t cme_return (cme_error_t err ) {
115+ cme_error_t cme_error_push_symbol (cme_error_t err , const char * file ,
116+ const char * func , int line ) {
128117#ifndef CME_ENABLE_BACKTRACE
118+ (void )file ;
119+ (void )func ;
120+ (void )line ;
129121 return err ;
130122#else
131- if (!err ) {
123+ if (!err )
124+ return err ;
125+ if (err -> stack_length >= CME_STACK_MAX )
132126 return err ;
133- }
134-
135- if (err -> stack_length < CME_STACK_MAX ) {
136- err -> stack_symbols [err -> stack_length ++ ] =
137- __builtin_extract_return_addr (__builtin_return_address (0 ));
138- }
139127
128+ struct cme_StackSymbol * f = & err -> stack_symbols [err -> stack_length ++ ];
129+ f -> source_file = file ;
130+ f -> source_func = func ;
131+ f -> source_line = line ;
140132 return err ;
141133#endif
142- };
134+ }
0 commit comments