android backtrace实现

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

前景

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 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值