一、JAVA层单步调试

二、Native层单步调试

三、JAVA层堆栈打印

1. 在指定的函数内打印相关java调用 Log.d(TAG,Log.getStackTraceString(new Throwable()));

2. 普通JAVA进程堆栈 ActivityManagerService.dumpStackTraces

保存在系统设置dalvik.vm.stack-trace-file指定的文件data/anr/traces.txt中。可以包含多个进程堆栈信息。

3. 内核进程堆栈

dumpKernelStackTraces,该函数为私有函数,不可调用。

代码在frameworks/base/services/java/com/android/server/Watchdog.java

保存在系统设置dalvik.vm.stack-trace-file指定的文件data/anr/traces.txt中。

4. 出异常时打印当前堆栈

Exception::printStackTrace() try { ... } catch (RemoteException e) {   e.printStackTrace();   ... }

5. 输出指定进程的堆栈 Process.sendSignal(pid, Process.SIGNAL_QUIT)

保存在data/anr/traces.txt。

这个只对java进程有效,由dalvikvm的SignalCatcher.c处理。

四、Native层堆栈打印

1. CallStack

使用方式: #include ... CallStack stack; stack.update(); stack.dump("");  // the parameter is prefix of dump

在使用之前需要修改system/core/include/arch/linux-arm/AndroidConfig.h #define HAVE_DLADDR 1 #define HAVE_CXXABI 1

并在文件frameworks/base/libs/utils/Android.mk中大约105行(LOCAL_SHARED_LIBRARIES)后添加 ifeq ($(TARGET_OS),linux) LOCAL_SHARED_LIBRARIES += libdl endif

重新编译,push生成的libutils.so到/system/lib/目录下,重启设备。

五、JAVA异常分析

这个android会输出信息到logcat。容易分析。

六、Natvie异常分析

native进程异常会导致

debuggerd会输出信息到logcat并保存到/data/tombstones。

可以修改system/core/debuggerd/debuggerd.c中dump_stack_and_code的代码满足更深的调试信息需求。

七、日志Log系统

在java中使用 import android.util.Log; ... Log.d(TAG,"log info");

在Native代码中使用 #define LOG_TAG "YOUR_LOGTAG" ... #include #define LOG_NDEBUG 0 ... LOGD("log info");

或者 Log.d(LOG_TAG,“log info”);

使用adb logcat时可以只显示特定类别的LOG,还可以通过参数 -v threadtime 显示线程号及时间信息。

普通标准输出转为Logcat #system/bin/logwrapper 进程名

八、其他调试手段(命令行)

1. 打印指定JAVA进程的堆栈到文件中 #kill -3 pid

这里的3就是3.5节的Process.SIGNAL_QUIT。

输出在data/anr/traces.txt文件中。

这个只对java进程有效,由dalvikvm处理。

2. 打印指定进程的堆栈到Logcat #kill -11 pid 或者 #kill -7 pid

这个有时有效。其原理是利用了(六)节的机制。

可以用adb logcat看堆栈调用输出。

3. 打印指定进程的系统调用 #strace -f -p pid -o output

主要输出文件、SOCKET、锁等系统操作的信息。

-f表示跟踪所有子进程.

-o输出log到指定文件,可不用。

java 安卓调试_【转】Android 调试技术相关推荐

  1. Java.mob.org.cn搜索_探讨Android全文检索技术

    原标题:探讨Android全文检索技术 写在前面 客户端本地存储数据一般使用的存储方式是:文件.SharedPreference.数据库(SQLite) 如果我们要做一些查询的操作,对于文件的方式,通 ...

  2. 性能测试脚本的编写和调试_编写自动调试器以在测试执行期间捕获异常

    性能测试脚本的编写和调试 以前,我曾说过, 您总是想保留一些调试器断点作为例外 . 这有助于防止代码在不注意的情况下腐烂掉,有时掩盖了另一个问题. 如果您认真对待这一点,那么最好将此想法扩展到自动化测 ...

  3. tensorflow 调试_如何开始调试TensorFlow

    tensorflow 调试 by Daniel Deutsch 由Daniel Deutsch 如何开始调试TensorFlow (How to get started debugging Tenso ...

  4. 谷歌java安卓代码检查工具,Android Studio 代码检查工具介绍

    前言 利用好相关代码检查工具,是一种自我的CodeReview,可以有效降低Bug率,提升自我的代码优化意识.常用的代码检查工具有AndroidStudio 自带的Lint工具. Alibaba Ja ...

  5. android 系统gpu 调试_基于Android系统的GPU动态调频方案 | Imagination中文技术社区

    针对移动终端上GPU的高功耗问题,提出一种基于Android系统的GPU动态调频方案.方案根据各种应用对GPU的性能需求,引入了GPU的频率一性能模型,包括选择工作频率和测量相对性能的方法.动态调频算 ...

  6. 安卓java修改热点_修改Android源码实现连接指定BSSID的热点

    1 概述 需要实现一个需求,Android手机A发射热点,获取BSSID,发送到另一台Android设备,在环境中存在多个同样SSID和密码的情况下,设备只会连接手机A. 1.1 概念 服务集识别码( ...

  7. eclipse java 程序调试_使用 Eclipse 调试 Java 程序的 10 个技巧

    - 友好的可读的对象 变量视图是使用对象的toString方法来现实对应的值.因为这个原因,如果提供友好的toString方法实现,对调试来说会非常有用.在javadoc中关于java.lang.Ob ...

  8. java安卓计时器_如何在android中设置计时器

    通过java.util.Timer和java.util.TimerTask使用计时器的标准Java方法在Android中运行良好,但是你应该知道这个方法创建了一个新线程. 您可以考虑使用非常方便的Ha ...

  9. 安卓java摄像机的_在Android系统中调用系统前置摄像头

    从Android 2.3 Gingerbread开始,原生支持前置摄像头.下面我们看看如何在程序里来调用前置的摄像头. 第一种方式是采用MediaStore,调用系统原生的相机. Intent int ...

  10. java安卓app开发教程,Android app开发入门 —— your 'Hello, World'

    从这篇可以掌握到 Android app开发环境的搭建 开发工具介绍及安装 创建你的"Hello, World" 工程结构的介绍 工程gradle配置 简单布局 代码sample ...

最新文章

  1. R语言ggplot2可视化绘制二维的密度图:在R中建立二维散点数据的连续密度热图、2D密度估计、MASS包中的kde2d函数实现2D密度估计、geom_density2d函数可视化二维密度图
  2. C#关于值类型和引用类型的备忘
  3. Cisco路由器AAA配置
  4. 2018.12.18运算符,分支结构(循环),异常处理,函数
  5. kloxo 一行安装 -cnblogs
  6. Vue首屏性能优化组件
  7. OpenShift 4 之使用持久化存储
  8. Android开发笔记(一百五十九)Android7.0的分屏模式
  9. python用一行代码计算1~100的和(用reduce()和sum()内置函数实现)
  10. 自动驾驶 2-1 第 1 课补充阅读:传感器和计算硬件 -- 下
  11. Android proguard 详解
  12. 局域网带宽控制解决方案-P2P终结者使用详解
  13. MAC 及 Python 快捷键
  14. 如何找到最快的DNS服务器
  15. 简述软件测试自动化的作用,什么是自动化测试?了解一下~
  16. fash 3D 游戏
  17. VI设计中系统视觉基本要素优漫动游
  18. kali linux窗口变大,kali怎么把屏幕放大
  19. 快手火山抖音视频(包含其他视频)跨平台操作搬运,下载,消重,全自动操作解放双手...
  20. php30 罗马仕_再也不信罗马仕移动电源了!真是个大坑。。。

热门文章

  1. pytorch保存模型时报错***object has no attribute 'state_dict'
  2. 利用Excel进行成对(配对)T检验
  3. Dom4j完整教程~XML文档简单操作
  4. Guava入门~MoreObjects
  5. Replace Inheritance with Delegation(以委托取代继承)
  6. uCOS-III应用开发笔记之一:uCOS-III在STM32的移植
  7. 比特币中的密码学知识汇总
  8. Base64编码的原理与常用实现
  9. 消息队列(1):一个消息队列应该有的特点
  10. asp:dropdownlist如何去掉三角箭头_科目二倒库打轮早会压库角,教练9图详解如何快速调车避免压线?...