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.pswp.cn/news/388723.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/388723.shtml
英文地址,請注明出處:http://en.pswp.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) …