android 调试技巧

1.查看当前堆栈

Call tree

new Exception(“print trace”).printStackTrace();

在logcat中打印当前函数调用关

2.MethodTracing

性能分析与优(

函数占用CPU时间,

调用次数,

函数调用关系)

a) 在程序代码中加入追踪开关

import android.os.Debug;

android.os.Debug.startMethodTracing(“/data/tmp/test”);//先建/data/tmp目录

…//被追踪程序段

android.os.Debug.stopMethodTracing();

b)编译,运行后,设备端生成/data/tmp/test.trace文件

c)把trace文件复制到PC端

$adb pull /data/tmp/test.trace/

d)使用android自带工具分析trace文件

$$ANDROID_SRC/out/host/linux-x86/bin/traceview test.trace

此时可看到各个函数被调用的次数CPU占用率等信息

e)使用android自带工具分析生成调用关系类图

$apt-get install graphviz #安装图片相关软件

$ANDROID_SRC/out/host/linux-x86/bin/dmtracedump –g test.png test.trace

此时目录下生成类图test.png

注意:trace文件生成与libdvm模块DEBUG版本相冲突,所以此方法只适用于对非DEBUG版本模拟器的调试,否则在分析trace文件时会报错

3.HProf

(Heap Profile)

(内存占用,

及泄漏分析)

a) 在代码中加入dump动作

import android.os.Debug;

import java.io.IOException;

……

try{

android.os.Debug.dumpHprofData(“/data/tmp/input.hprof”);//预先建立/data/tmp

}catch(IOException ioe){

}

b) 把hprof文件复制到PC端

$adb pull /data/tmp/input.hprof ./

c)使用命令hprof-conv把hprof转成MAT识别的标准的hprof

$$ANDROID_SRC/out/host/linux-x86/bin/hprof-conv input.hprof output.hprof

d) 使用MAT工具看hprof信息

下载MAT工具:http://www.eclipse.org/mat/downloads.php

用工具打开output.hprof

注意:此工具只显示java层面而不能显示C层内存占用信息

4.SamplingProfile

(要求android 2.0+)

每隔N毫秒对当前正在

运行的函数取样,

并输出到log中

在代码中加入取样设定

import dalvik.system.SamplingProfiler

SamplingProfile sp=SamplingProfiler.getInstance();

sp.start(n);//n为设定每秒采样次数

sp.logSnapshot(sp.snapshot());

sp.shutDown();

(自动启动一个线程监测,在logcat中打印信息)

5.通过发送系统信号

获取Call tree与

内存信息

1) 原理dalvik虚拟机对SIGQUIT和SIGUSR1信号进行处理

(dalvik/vm/SignalCatcher.c),分别完成取当前堆栈和取当前内存情况的功能

2)用法

a) $ chmod 777 /data/anr -R # 把anr目录权限设为可写

$ rm /data/anr/traces.txt # 删除之前的trace信息

$ ps # 找到进程号

$ kill -3 进程号 # 发送SIGQUIT信号给该进程,此时生成trace信息

$ cat /data/anr/traces.txt

功能实现:遍历thread list(dalvik/vm/Thread.c:dvmDumpAllThreadEx()),并打印当前函数调用关系(dalvik/vm/interp/Stack.c:dumpFrames())

b) $ chmod 777 /data/misc –R

$ ps # 找到进程号

$ kill -10 进程号 # 发送SIGQUIT信事信号给该进程,此时生成hprof信息

$ ls /data/misc/*.hprof

此时生成hprf文件,如何查看此文件,见第2部分(HProf)

注意:hprof文件很大,注意用完删除,以免占满存储器
6.logcat

1) android.util.Log利用println的标准java输出词句,并加前缀I/V/D….

2) dalvik利用管道加线程方式,先利用dup2把stdout和stderr重定向到管理中(vm/StdioConverter.c:dvmstdioConverterStartup),然后再启动一个线程从管道另一端读出内容

(dalvik/vm/StdioConverter.c:stdioconverterThreadStart()),使用LOG公共工具(system/core/liblog/logd_write.c: __android_log_print())输出到/dev/log/*中

3)logcat通过加不同参数看/dev/log/下的不同输入信息

#logcat –b main显示主缓冲区中的信息

#logcat –b radio 显示无线缓冲区中的信息

#logcat –b events显示事件缓冲区中的信息

7.jdwp(java debug

wire protocol)及原理

1) 虚拟机(设备端)在启动时加载了Agent JDWP 从而具备了调试功能。在调试器端(PC端)通过JDWP协议与设备连接,通过发送命令来获取的状态和控制Java程序的执行。JDWP 是通过命令(command)和回复(reply)进行通信的。

2) JDK 中调试工具 jdb 就是一个调试器,DDMS也提供调试器与设备相连。

3) dalvik为JDWP提供了两种连接方式:tcp方式和adb方式,tcp方式可以手工指定端口,adb方式自动设定为8700端口,通常使用DDMS调试就是通过adb方式
8.monkey压力测试

android自带的命令行工具。它向系统发送伪随机的用户事件流,实现对正在开发的应用程序进行压力测试。

在设备端打开setting界面

$ adb shell

#monkey –p com.android.settings -v 500

此时可以看到界面不断被切换

9.查看Android源码

Eclipse插件

sqlitemanager插件,实时查看写入db数据的改变

sqllitemanger插件的用法:

Using SQLite in ANDROID

You can see the sqlite database in eclipse by opening File Explorer .Then

/data/data/package_name/databases

But here we cannot see the tables and table data.
For viewing the table details Eclipse has a plugin. You can download the jar from below.

sqlitemanager下载.

注意:如果是写入至系统临时目录db,则需root)

10.SQLiteManager

plugin for eclipse

sqlitemanager插件,实时查看写入db数据的改变

sqllitemanger插件的用法:

Using SQLite in ANDROID

You can see the sqlite database in eclipse by opening File Explorer .Then

/data/data/package_name/databases

But here we cannot see the tables and table data.
For viewing the table details Eclipse has a plugin. You can download the jar from below.

sqlitemanager下载.

注意:(如果是写入系统临时目录db,则需root)
11.自定义内存日志通过独立的界面显示
12.try catch的快捷键快捷键ctrl + alt + t

转载于:https://www.cnblogs.com/reboost/p/9540513.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/388723.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Xml序列化

xml序列化 实现思路 通过程序生成一个xml文件来备份手机短信. 先获取手机短信的内容 —>通过xml备份.StringBuffer 代码如下public void click(View view) {StringBuffer sb new StringBuffer();sb.append("<?xml version\"1.0\" encoding\"UTF-8\…

java 添加用户 数据库,跟屌丝学DB2 第二课 建立数据库以及添加用户

在安装DB2 之后&#xff0c;就可以在 DB2 环境中创建自己的数据库。首先考虑数据库应该使用哪个实例。实例(instance) 提供一个由数据库管理配置(DBM CFG)文件控制的逻辑层&#xff0c;可以在这里将多个数据库分组在一起。DBM CFG 文件包含一组 DBM CFG 参数&#xff0c;可以使…

iphone视频教程

公开课介绍 本课程共28集 翻译至第15集 网易正在翻译16-28集 敬请关注 返回公开课首页 一键分享&#xff1a;  网易微博开心网豆瓣网新浪微博搜狐微博腾讯微博邮件 讲师介绍 名称&#xff1a;Alan Cannistraro 课程介绍 如果你对iPhone Development有兴趣&#xff0c;以下是入…

在Python中有效使用JSON的4个技巧

Python has two data types that, together, form the perfect tool for working with JSON: dictionaries and lists. Lets explore how to:Python有两种数据类型&#xff0c;它们一起构成了使用JSON的理想工具&#xff1a; 字典和列表 。 让我们探索如何&#xff1a; load a…

Vlan中Trunk接口配置

Vlan中Trunk接口配置 参考文献&#xff1a;HCNA网络技术实验指南 模拟器&#xff1a;eNSP 实验环境&#xff1a; 实验目的&#xff1a;掌握Trunk端口配置 掌握Trunk端口允许所有Vlan配置方法 掌握Trunk端口允许特定Vlan配置方法 实验拓扑&#xff1a; 实验IP地址 &#xff1a;…

django中的admin组件

Admin简介&#xff1a; Admin:是django的后台 管理的wed版本 我们现在models.py文件里面建几张表&#xff1a; class Author(models.Model):nid models.AutoField(primary_keyTrue)namemodels.CharField( max_length32)agemodels.IntegerField()# 与AuthorDetail建立一对一的关…

虚拟主机创建虚拟lan_创建虚拟背景应用

虚拟主机创建虚拟lanThis is the Part 2 of the MediaPipe Series I am writing.这是我正在编写的MediaPipe系列的第2部分。 Previously, we saw how to get started with MediaPipe and use it with your own tflite model. If you haven’t read it yet, check it out here.…

.net程序员安全注意代码及服务器配置

概述 本人.net架构师&#xff0c;软件行业为金融资讯以及股票交易类的软件产品设计开发。由于长时间被黑客攻击以及骚扰。从事高量客户访问的服务器解决架构设计以及程序员编写指导工作。特此总结一些.net程序员在代码编写安全以及服务器设置安全常用到的知识。希望能给对大家…

文件的读写及其相关

将软件布置在第三方电脑上会出现无法提前指定绝对路径的情况&#xff0c;这回影响到后续的文件读写&#xff1b;json文件是数据交换的一种基本方法&#xff0c;为了减少重复造轮子&#xff0c;经行标准化代码。关于路径&#xff1a; import os workspaceos.getcwd() pathos.pat…

接口测试框架2

现在市面上做接口测试的工具很多&#xff0c;比如Postman&#xff0c;soapUI, JMeter, Python unittest等等&#xff0c;各种不同的测试工具拥有不同的特色。但市面上的接口测试工具都存在一个问题就是无法完全吻合的去适用没一个项目&#xff0c;比如数据的处理&#xff0c;加…

python 传不定量参数_Python中的定量金融

python 传不定量参数The first quantitative class for vanilla finance and quantitative finance majors alike has to do with the time value of money. Essentially, it’s a semester-long course driving notions like $100 today is worth more than $100 a year from …

axis为amchart左右轴的参数

<axis>left</axis> <!-- [left] (left/ right) indicates which y axis should be used --> <title>流通股</title> <!-- [] (graph title) --> <…

雷军宣布红米 Redmi 品牌独立,这对小米意味着什么?

雷锋网消息&#xff0c;1 月 3 日&#xff0c;小米公司宣布&#xff0c;将在 1 月 10 日召开全新独立品牌红米 Redmi 发布会。从小米公布的海报来看&#xff0c;Redmi 品牌标识出现的倒影中&#xff0c;有 4800 的字样&#xff0c;这很容易让人联想起此前小米总裁林斌所宣布的 …

JAVA的rotate怎么用,java如何利用rotate旋转图片_如何在Java中旋转图形

I have drawn some Graphics in a JPanel, like circles, rectangles, etc.But I want to draw some Graphics rotated a specific degree amount, like a rotated ellipse. What should I do?解决方案If you are using plain Graphics, cast to Graphics2D first:Graphics2D …

贝叶斯 朴素贝叶斯_手动执行贝叶斯分析

贝叶斯 朴素贝叶斯介绍 (Introduction) Bayesian analysis offers the possibility to get more insights from your data compared to the pure frequentist approach. In this post, I will walk you through a real life example of how a Bayesian analysis can be perform…

vs2005 vc++ 生成非托管的 不需要.net运行环境的exe程序方法

在VS2005里开发的VC程序在编译的时候&#xff0c;微软默认会加入自己的 .Net Framework &#xff08;方便推广自家产品&#xff09;&#xff0c;让你的VC程序依赖它&#xff0c;这就导致程序编译后&#xff0c;无法跟往常一样直接打包&#xff0c;在别的机器就能正常运行。如果…

西工大java实验报告给,西工大数字集成电路实验 实验课6 加法器的设计

西工大数字集成电路实验练习六 加法器的设计一、使用与非门(NAND)、或非门(NOR)、非门(INV)等布尔逻辑器件实现下面的设计。1、仿照下图的全加器&#xff0c;实现一个N位的减法器。要求仿照图1画出N位减法器的结构。ABABABAB0123图1 四位逐位进位加法器的结构2、根据自己构造的…

DS二叉树--二叉树之数组存储

二叉树可以采用数组的方法进行存储&#xff0c;把数组中的数据依次自上而下,自左至右存储到二叉树结点中&#xff0c;一般二叉树与完全二叉树对比&#xff0c;比完全二叉树缺少的结点就在数组中用0来表示。&#xff0c;如下图所示 从上图可以看出&#xff0c;右边的是一颗普通的…

VS IIS Express 支持局域网访问

使用Visual Studio开发Web网页的时候有这样的情况&#xff1a;想要在调试模式下让局域网的其他设备进行访问&#xff0c;以便进行测试。虽然可以部署到服务器中&#xff0c;但是却无法进行调试&#xff0c;就算是注入进程进行调试也是无法达到自己的需求&#xff1b;所以只能在…

前复权后复权程序C# .net

if (win32apitest.MDIMain.SFSDA.FuQuan "前复权") { if (mytime DateTime.Parse("2009-04-29")) { //if (svalue 34.89) …