当前位置:   article > 正文

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

android::callstack

前言

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

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

正文

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

一、java

  1. import android.util.Log;
  2. Log.e("LOG_TAG""log info", Log.getStackTraceString(new Throwable()));
  3. //或者
  4. android.util.Log.e("LOG_TAG""log info", android.util.Log.getStackTraceString(new Throwable()));

二、native

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

三、kernel

  1. #include "linux/printk.h"
  2. //常用dump_stack,打印堆栈信息
  3. dump_stack();
  4. //或者可用WARN_ON,其原型可以看到也是调了dump_stack,打印堆栈信息,不会OOPS;
  5. WARN_ON(xxxx == yyyy);
  6. #define WARN_ON(condition) do { /
  7.      if (unlikely((condition)!=0)) { /
  8.          printk("Badness in %s at %s:%d/n", __FUNCTION__, __FILE__,__LINE__); /
  9.          dump_stack(); /
  10.     } /
  11. while (0)
  12. //如果想OOPS,可以使用 BUG_ON
  13. BUG_ON(bad_thing);

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

1、使用debuggerd命令:

  1. root:/ # debuggerd -h
  2. usage: debuggerd [-bj] PID
  3. -b, --backtrace   just a backtrace rather than a full tombstone
  4. -j                 collect java traces
  5. root:/ # debuggerd -b 1884

说明:以上 1884 是 pid。

2、利用 tombstone机制:

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

root:/ # kill -11 1884

说明:以上 1884 是 pid。

附:kill 命令 signals

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

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

程序员秘书

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之谜

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号