java 安卓调试_【转】Android 调试技术
一、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 调试技术相关推荐
- Java.mob.org.cn搜索_探讨Android全文检索技术
原标题:探讨Android全文检索技术 写在前面 客户端本地存储数据一般使用的存储方式是:文件.SharedPreference.数据库(SQLite) 如果我们要做一些查询的操作,对于文件的方式,通 ...
- 性能测试脚本的编写和调试_编写自动调试器以在测试执行期间捕获异常
性能测试脚本的编写和调试 以前,我曾说过, 您总是想保留一些调试器断点作为例外 . 这有助于防止代码在不注意的情况下腐烂掉,有时掩盖了另一个问题. 如果您认真对待这一点,那么最好将此想法扩展到自动化测 ...
- tensorflow 调试_如何开始调试TensorFlow
tensorflow 调试 by Daniel Deutsch 由Daniel Deutsch 如何开始调试TensorFlow (How to get started debugging Tenso ...
- 谷歌java安卓代码检查工具,Android Studio 代码检查工具介绍
前言 利用好相关代码检查工具,是一种自我的CodeReview,可以有效降低Bug率,提升自我的代码优化意识.常用的代码检查工具有AndroidStudio 自带的Lint工具. Alibaba Ja ...
- android 系统gpu 调试_基于Android系统的GPU动态调频方案 | Imagination中文技术社区
针对移动终端上GPU的高功耗问题,提出一种基于Android系统的GPU动态调频方案.方案根据各种应用对GPU的性能需求,引入了GPU的频率一性能模型,包括选择工作频率和测量相对性能的方法.动态调频算 ...
- 安卓java修改热点_修改Android源码实现连接指定BSSID的热点
1 概述 需要实现一个需求,Android手机A发射热点,获取BSSID,发送到另一台Android设备,在环境中存在多个同样SSID和密码的情况下,设备只会连接手机A. 1.1 概念 服务集识别码( ...
- eclipse java 程序调试_使用 Eclipse 调试 Java 程序的 10 个技巧
- 友好的可读的对象 变量视图是使用对象的toString方法来现实对应的值.因为这个原因,如果提供友好的toString方法实现,对调试来说会非常有用.在javadoc中关于java.lang.Ob ...
- java安卓计时器_如何在android中设置计时器
通过java.util.Timer和java.util.TimerTask使用计时器的标准Java方法在Android中运行良好,但是你应该知道这个方法创建了一个新线程. 您可以考虑使用非常方便的Ha ...
- 安卓java摄像机的_在Android系统中调用系统前置摄像头
从Android 2.3 Gingerbread开始,原生支持前置摄像头.下面我们看看如何在程序里来调用前置的摄像头. 第一种方式是采用MediaStore,调用系统原生的相机. Intent int ...
- java安卓app开发教程,Android app开发入门 —— your 'Hello, World'
从这篇可以掌握到 Android app开发环境的搭建 开发工具介绍及安装 创建你的"Hello, World" 工程结构的介绍 工程gradle配置 简单布局 代码sample ...
最新文章
- R语言ggplot2可视化绘制二维的密度图:在R中建立二维散点数据的连续密度热图、2D密度估计、MASS包中的kde2d函数实现2D密度估计、geom_density2d函数可视化二维密度图
- C#关于值类型和引用类型的备忘
- Cisco路由器AAA配置
- 2018.12.18运算符,分支结构(循环),异常处理,函数
- kloxo 一行安装 -cnblogs
- Vue首屏性能优化组件
- OpenShift 4 之使用持久化存储
- Android开发笔记(一百五十九)Android7.0的分屏模式
- python用一行代码计算1~100的和(用reduce()和sum()内置函数实现)
- 自动驾驶 2-1 第 1 课补充阅读:传感器和计算硬件 -- 下
- Android proguard 详解
- 局域网带宽控制解决方案-P2P终结者使用详解
- MAC 及 Python 快捷键
- 如何找到最快的DNS服务器
- 简述软件测试自动化的作用,什么是自动化测试?了解一下~
- fash 3D 游戏
- VI设计中系统视觉基本要素优漫动游
- kali linux窗口变大,kali怎么把屏幕放大
- 快手火山抖音视频(包含其他视频)跨平台操作搬运,下载,消重,全自动操作解放双手...
- php30 罗马仕_再也不信罗马仕移动电源了!真是个大坑。。。
热门文章
- pytorch保存模型时报错***object has no attribute 'state_dict'
- 利用Excel进行成对(配对)T检验
- Dom4j完整教程~XML文档简单操作
- Guava入门~MoreObjects
- Replace Inheritance with Delegation(以委托取代继承)
- uCOS-III应用开发笔记之一:uCOS-III在STM32的移植
- 比特币中的密码学知识汇总
- Base64编码的原理与常用实现
- 消息队列(1):一个消息队列应该有的特点
- asp:dropdownlist如何去掉三角箭头_科目二倒库打轮早会压库角,教练9图详解如何快速调车避免压线?...