- 在程序运行时打印相关调用栈信息(函数名,文件行号等),便于梳理调用逻辑等
#include <stdio.h>
#include <execinfo.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>#define MAX_FRAMES 128
#define BUFFER_SIZE 512
void PrintStackTrace()
{void *callstack[MAX_FRAMES];int frames = backtrace(callstack, MAX_FRAMES);if (frames <= 0){fprintf(stderr, "Failed to retrieve backtrace\n");return;}char **strs = backtrace_symbols(callstack, frames);if (strs == NULL){fprintf(stderr, "Failed to retrieve backtrace symbols\n");return;}printf("Stack trace:\n");for (int i = 0; i < frames; ++i){char *address = strchr(strs[i], '[');if (address != NULL){*address = '\0';++address;char command[BUFFER_SIZE];snprintf(command, BUFFER_SIZE, "addr2line -f -e ./stack %s", address);FILE *fp = popen(command, "r");if (fp != NULL){char buffer[BUFFER_SIZE];while (fgets(buffer, BUFFER_SIZE, fp) != NULL){printf(" %s", buffer);}pclose(fp);}else{fprintf(stderr, "Failed to execute addr2line command\n");}}}free(strs);
}void Bar()
{PrintStackTrace();
}void Foo()
{Bar();
}int main()
{Foo();return 0;
}
gcc -g stack.c -o stack -rdynamic
./stack
