我有一个C语言程序,需要在崩溃时保存堆栈到文件,该如何做?
时间: 2024-04-29 13:27:06 浏览: 11
可以使用backtrace和backtrace_symbols函数来获取函数调用堆栈信息,并将结果输出到文件中。具体实现可以参考以下代码:
```c
#include <execinfo.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void save_stack_trace() {
FILE* fp = fopen("stacktrace.txt", "w");
if (fp == NULL) {
return;
}
void* trace[256];
int trace_size = backtrace(trace, 256);
char** trace_symbols = backtrace_symbols(trace, trace_size);
for (int i = 0; i < trace_size; i++) {
fprintf(fp, "%s\n", trace_symbols[i]);
}
free(trace_symbols);
fclose(fp);
}
void crash_handler(int signum) {
save_stack_trace();
// ...处理其他崩溃信息
exit(1);
}
int main() {
signal(SIGSEGV, crash_handler);
// ...代码中可能发生崩溃的位置
return 0;
}
```
该代码中,save_stack_trace函数使用backtrace和backtrace_symbols函数获取函数调用堆栈信息,并将结果输出到文件中。crash_handler函数是信号处理程序,当程序崩溃时会调用该函数,并在其中调用save_stack_trace函数来保存堆栈信息。使用signal函数将crash_handler函数注册为SIGSEGV信号的处理程序,即在程序崩溃时自动调用crash_handler函数。