#include <stdio.h>
#include <unistd.h>
#include <stdio.h>
#include <execinfo.h>
#include <stdlib.h>
#include <string.h>
void backtrace()
{
const int maxLevel = 200;
void* buffer[maxLevel];
int level = backtrace(buffer, maxLevel);
const int SIZE = 1024;
char cmd[SIZE] = "addr2line -C -f -e ";
char* prog = cmd + strlen(cmd);
int r = readlink("/proc/self/exe", prog, sizeof(cmd) - (prog-cmd)-1);
FILE* fp = popen(cmd, "w");
if (!fp)
{
perror("popen");
return;
}
for (int i = 0; i < level; ++i)
{
fprintf(fp, "%p\n", buffer[i]);
}
fclose(fp);
}
void foo(int, char*)
{
backtrace();
}
void bar(double)
{
foo(0, NULL);
}
int main()
{
bar(0.0);
return 0;
}
backtrace获取堆栈
最新推荐文章于 2022-09-09 21:07:02 发布
本文提供了一个使用C语言实现的回溯打印示例,通过调用`backtrace`函数来获取当前进程的调用堆栈信息,并利用`addr2line`工具将地址转换为对应的源文件名和行号,展示了如何在一个简单的程序中记录和输出函数调用的堆栈轨迹。
649

被折叠的 条评论
为什么被折叠?



