Android java、native、kernel获取堆栈信息常用方法总结

前言

编程语言是工具,在实际工作中我们可能往往会用到一种编程语言工具或者多种编程语言工具才能实现一个完整功能的需求;尤其是在 Android 的开发过程中,从上层到底层,涉及 java、C++、C,而且目前看谷歌正在部署引入新的开发语言 Rust ,大有替代 C++ 和 C 部分功能实现的趋势;下一步,我们很有可能又得再多学习一门编程语言了。

在实际开发中,因为经常分析问题,需要从上到下跟踪一些代码调用流程,所以就会有分别在 java、native、kernel 打印调用堆栈的需求;之前也都是零散的在用,今天花了一些时间,梳理了一下,记录分享之。

正文

Android java、native、kernel打印堆栈常用方法总结:

一、java

import android.util.Log;

Log.e("LOG_TAG", "log info", Log.getStackTraceString(new Throwable()));
//或者
android.util.Log.e("LOG_TAG", "log info", android.util.Log.getStackTraceString(new Throwable()));

二、native

//mk添加:
LOCAL_SHARED_LIBRARIES += libutils libutilscallstack
//头文件添加:
#include <log/log.h>
#include <utils/CallStack.h>
//在想调用Callstack的函数中加入如下代码:
android::CallStack callstack;
callstack.update();
callstack.log("LOG_TAG", ANDROID_LOG_INFO, "xxxx");//LOG_TAG是TAG;xxxx是backtrace的前缀;
//或者
android::CallStack stack("my_test");

三、kernel

#include "linux/printk.h"

//常用dump_stack,打印堆栈信息
dump_stack();

//或者可用WARN_ON,其原型可以看到也是调了dump_stack,打印堆栈信息,不会OOPS;
WARN_ON(xxxx == yyyy);
#define WARN_ON(condition) do { /
     if (unlikely((condition)!=0)) { /
         printk("Badness in %s at %s:%d/n", __FUNCTION__, __FILE__,__LINE__); /
         dump_stack(); /
    } /
} while (0)

//如果想OOPS,可以使用 BUG_ON
BUG_ON(bad_thing);

四、通过 debuggerd命令 或者 tombstone机制获取堆栈信息

1、使用debuggerd命令:


root:/ # debuggerd -h
usage: debuggerd [-bj] PID
-b, --backtrace   just a backtrace rather than a full tombstone
-j                 collect java traces

root:/ # debuggerd -b 1884

说明:以上 1884 是 pid。

2、利用 tombstone机制:

手动制造进程 crash,即可触发生成/data/tombstone 目录文件,手动导出即可。

root:/ # kill -11 1884

说明:以上 1884 是 pid。

附:kill 命令 signals

root:/ # kill -l
1    HUP Hangup                      
2    INT Interrupt                    
3    QUIT Quit                        
4    ILL Illegal instruction          
5    TRAP Trap                        
6    ABRT Aborted                      
7    BUS Bus error                    
8    FPE Floating point exception    
9    KILL Killed                      
10   USR1 User signal 1                
11   SEGV Segmentation fault          
12   USR2 User signal 2      
13   PIPE Broken pipe        
14   ALRM Alarm clock        
15   TERM Terminated          
16   STKFLT Stack fault        
17   CHLD Child exited        
18   CONT Continue            
19   STOP Stopped (signal)    
20   TSTP Stopped            
21   TTIN Stopped (tty input)
22   TTOU Stopped (tty output)
23   URG Urgent I/O condition    
24   XCPU CPU time limit exceeded
25   XFSZ File size limit exceeded
26   VTALRM Virtual timer expired  
27   PROF Profiling timer expired
28   WINCH Window size changed    
29   IO I/O possible            
30   PWR Power failure          
31   SYS Bad system call        
32   Signal 32              
33   Signal 33
......

如果你有更好的方法和经验,欢迎一起交流学习。

程序员秘书

Linux/Android/嵌入式/工具人/生产力/技术伴于生活和成长,愿永为少年,心中有火,眼中有光,记录一个普通程序员的成长点滴。

你可能感兴趣的Linux文章:

Linux远程拷贝文件scp命令详细

借助Linux shell脚本搞定一个开机异常问题

Linux ftrace 之 function、function_graph 使用笔记(一)

Linux shell 语法  if [ $? == 0 ]  详细

创建Linux用户并获得root权限且在window下实现访问

常见.zip文件该如何操作才能正确解压

早知道这两种命令工具,早高效~

linux开发vi/vim使用知多少

常用linux命令cat、tac、head、tail笔记

linux下查找文件,看这篇就够了

新入职,尽快平移老员工的环境配置是正道

写shell脚本偷了个懒,syntax error之谜

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值