在Linux环境下,可以使用backtrace
函数和backtrace_symbols
函数来打印C程序的堆栈跟踪信息。下面是一个示例程序,展示了如何在Linux中打印堆栈跟踪:
#include <stdio.h>
#include <stdlib.h>
#include <execinfo.h>
void printStackTrace() {
void* stackTrace[100];
int stackTraceSize = backtrace(stackTrace, sizeof(stackTrace) / sizeof(void*));
char** stackTraceSymbols = backtrace_symbols(stackTrace, stackTraceSize);
if (stackTraceSymbols != NULL) {
printf("Program stack trace:\n");
for (int i = 0; i < stackTraceSize; i++) {
printf("%s\n", stackTraceSymbols[i]);
}
free(stackTraceSymbols);
}
}
void func3() {
printStackTrace();
}
void func2() {
func3();
}
void func1() {
func2();
}
int main() {
func1();
return 0;
}
在这个示例程序中,printStackTrace
函数使用backtrace
函数获取当前程序的堆栈跟踪信息,并使用backtrace_symbols
函数将地址转换为可读的符号字符串。然后,它将堆栈跟踪信息打印到标准输出。
要编译并运行这个程序,使用以下命令:
gcc program.c -o program -rdynamic
./program
编译时需要添加-rdynamic
选项,以保留符号信息。然后运行程序,将看到打印出的堆栈跟踪信息。
这种方法在不同的平台上可能会有所不同,具体取决于操作系统和编译器的支持。
网友评论