前景
backtrace 文档
说明
通过数组获取调用栈; 一般获取的是内存地址;
借助dladdr获取地址信息, 计算可执行文件中的偏移地址;
实现
有的没有实现backtrace但是大多都支持unwind; 利用unwind实现类似;
backtrace
判断是否支持
#include<stdio.h>
#include<dlfcn.h>
int main()
{
void * bt = dlsym(NULL,"backtrace");
if(NULL != bt)
{
printf("support\n");
}
else
{
printf("not support\n");
}
return 0;
}
编译输出
[root@localhost bt_support]# gcc test.c -ldl -g
[root@localhost bt_support]# ./a.out
support
查看堆栈
pstack
略
gdb
void show() {
while(1);
}
int main() {
show();
}
执行输出
ch@ch-ubuntu:~/ch/cfile/test$ gcc test.c -g
ch@ch-ubuntu:~/ch/cfile/test$ ./a.out &
[2] 42592
ch@ch-ubuntu:~/ch/cfile/test$ sudo gdb -q -ex "bt" -ex "q" -p 42592 <<< "Y"
Attaching to process 42592
Reading symbols from /home/ch/ch/cfile/test/a.out...
Reading symbols from /lib/x86_64-linux-gnu/libc.so.6...
Reading symbols from /usr/lib/debug/.build-id/d1/704d25fbbb72fa95d517b883131828c0883fe9.debug...
Reading symbols from /lib64/ld-linux-x86-64.so.2...
Reading symbols from /usr/lib/debug/.build-id/29/2e105c0bb3ee8e8f5b917f8af764373d206659.debug...
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
0x0000558c38dab132 in show () at test.c:2
2 while(1);
#0 0x0000558c38dab132 in show () at test.c:2
#1 0x0000558c38dab146 in main () at test.c:5
A debugging session is active.
Inferior 1

本文介绍了如何在C语言中获取程序的调用栈信息,包括使用backtrace函数、unwind库以及addr2line工具解析内存地址到源代码位置。示例代码展示了如何实现backtrace功能,以及如何通过dladdr获取地址信息和计算文件中的偏移地址。此外,还提供了自定义的backtrace实现方法,适用于某些环境(如Android、Docker)中缺少backtrace支持的情况。
最低0.47元/天 解锁文章
1421

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



