: .
: locals , ...
, , , , , .
typedef struct stack_debug_blob_ {
int magic1;
const char * function_name;
int magic2;
struct stack_debug_blob_ * called_by;
int magic3;
} stack_debug_blob;
stack_debug_blob * top_of_stack_debug_blobs = 0;
ENTER (f), . {. (const) char *, , , . blob .
stack_debug_blob new_stack_debug_blob = { \
MAGIC1, (f), MAGIC2, top_of_stack_debug_blobs, MAGIC3}; \
stack_debug_blob * evil_hack = (top_of_stack_debug_blobs = (&new_stack_debug_blob))
, , ENTER, . , evil_hack , .
, blobs . (, stderr, , while (1) {/* nada */}, , ... ), .
EXIT(), blobs, . .
#define EXIT() do { \
check_debug_blobs(); \
top_of_stack_debug_blobs = new_stack_debug_blob.called_by; \
new_stack_debug_blob.magic1 -= 1; \
} while (0)
, RETURN, RETURN EXIT, } while (0).
, blobs, , - stacktrace backtrace.
ENTER (f) EXIT() RETURN (x).
, ...
. , backtrace uclibc?