Android 打印堆栈的几种方法

在Android调试过程中经常会出现程序出现的结果不是我们预期的结果,那就需要加Log打印调试,看调用过程是否正确,此时就需要打印程序的调用栈,特别是Android代码相当庞大,打印堆栈更有利于我们分析问题,下面就记录下平时用到不退出程序打印堆栈的方法。

验证的方法相关简单,在Activity的类中创建一个方法ThrowException,在onCreate中调用此方法,看打印出什么

public void ThrowException() {
		// 调试打印堆栈而不退出
		Log.d(TAG, Log.getStackTraceString(new Throwable()));

		// 创建异常打印堆栈
		Exception e = new Exception("this is a log");
		e.printStackTrace();

		// 获取当前线程的堆栈
		for (StackTraceElement i : Thread.currentThread().getStackTrace()) {
			Log.i(TAG, i.toString());
		}

		RuntimeException re = new RuntimeException();
		re.fillInStackTrace();
		Log.i(TAG, "stackTrace", re);

		// 主动抛出异常调试
		try {
			Log.i(TAG,
					"--------------------------------NullPointerException-----------1");
			throw new NullPointerException();
		} catch (NullPointerException e1) {
			// TODO: handle exception
			Log.i(TAG, "--------------------------------NullPointerException");
			Log.e(TAG, Log.getStackTraceString(e1));
			// e1.printStackTrace();
		}
		Log.i(TAG,
				"--------------------------------NullPointerException-----------end");
	}

1、Log.d(TAG, Log.getStackTraceString(new Throwable()));

04-09 14:19:51.764 D/dzt_test(26317): java.lang.Throwable
04-09 14:19:51.764 D/dzt_test(26317): 	at com.dzt.testapp.MainActivity.ThrowException(MainActivity.java:69)
04-09 14:19:51.764 D/dzt_test(26317): 	at com.dzt.testapp.MainActivity.onCreate(MainActivity.java:63)
04-09 14:19:51.764 D/dzt_test(26317): 	at android.app.Activity.performCreate(Activity.java:5343)
04-09 14:19:51.764 D/dzt_test(26317): 	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1088)
04-09 14:19:51.764 D/dzt_test(26317): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2331)
04-09 14:19:51.764 D/dzt_test(26317): 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2429)
04-09 14:19:51.764 D/dzt_test(26317): 	at android.app.ActivityThread.access$800(ActivityThread.java:151)
04-09 14:19:51.764 D/dzt_test(26317): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1342)
04-09 14:19:51.764 D/dzt_test(26317): 	at android.os.Handler.dispatchMessage(Handler.java:110)
04-09 14:19:51.764 D/dzt_test(26317): 	at android.os.Looper.loop(Looper.java:193)
04-09 14:19:51.764 D/dzt_test(26317): 	at android.app.ActivityThread.main(ActivityThread.java:5333)
04-09 14:19:51.764 D/dzt_test(26317): 	at java.lang.reflect.Method.invokeNative(Native Method)
04-09 14:19:51.764 D/dzt_test(26317): 	at java.lang.reflect.Method.invoke(Method.java:515)
04-09 14:19:51.764 D/dzt_test(26317): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:830)
04-09 14:19:51.764 D/dzt_test(26317): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:646)
04-09 14:19:51.764 D/dzt_test(26317): 	at dalvik.system.NativeStart.main(Native Method)

2、

Exception e = new Exception("this is a log");

e.printStackTrace();

04-09 14:19:51.764 W/System.err(26317): java.lang.Exception: this is a log
04-09 14:19:51.765 W/System.err(26317): 	at com.dzt.testapp.MainActivity.ThrowException(MainActivity.java:72)
04-09 14:19:51.765 W/System.err(26317): 	at com.dzt.testapp.MainActivity.onCreate(MainActivity.java:63)
04-09 14:19:51.765 W/System.err(26317): 	at android.app.Activity.performCreate(Activity.java:5343)
04-09 14:19:51.765 W/System.err(26317): 	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1088)
04-09 14:19:51.765 W/System.err(26317): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2331)
04-09 14:19:51.766 W/System.err(26317): 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2429)
04-09 14:19:51.766 W/System.err(26317): 	at android.app.ActivityThread.access$800(ActivityThread.java:151)
04-09 14:19:51.766 W/System.err(26317): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1342)
04-09 14:19:51.766 W/System.err(26317): 	at android.os.Handler.dispatchMessage(Handler.java:110)
04-09 14:19:51.766 W/System.err(26317): 	at android.os.Looper.loop(Looper.java:193)
04-09 14:19:51.766 W/System.err(26317): 	at android.app.ActivityThread.main(ActivityThread.java:5333)
04-09 14:19:51.766 W/System.err(26317): 	at java.lang.reflect.Method.invokeNative(Native Method)
04-09 14:19:51.766 W/System.err(26317): 	at java.lang.reflect.Method.invoke(Method.java:515)
04-09 14:19:51.766 W/System.err(26317): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:830)
04-09 14:19:51.766 W/System.err(26317): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:646)
04-09 14:19:51.767 W/System.err(26317): 	at dalvik.system.NativeStart.main(Native Method)

3、

// 获取当前线程的堆栈
		for (StackTraceElement i : Thread.currentThread().getStackTrace()) {
			Log.i(TAG, i.toString());
		}
04-09 14:19:51.767 I/dzt_test(26317): dalvik.system.VMStack.getThreadStackTrace(Native Method)
04-09 14:19:51.768 I/dzt_test(26317): java.lang.Thread.getStackTrace(Thread.java:579)
04-09 14:19:51.768 I/dzt_test(26317): com.dzt.testapp.MainActivity.ThrowException(MainActivity.java:76)
04-09 14:19:51.768 I/dzt_test(26317): com.dzt.testapp.MainActivity.onCreate(MainActivity.java:63)
04-09 14:19:51.768 I/dzt_test(26317): android.app.Activity.performCreate(Activity.java:5343)
04-09 14:19:51.769 I/dzt_test(26317): android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1088)
04-09 14:19:51.769 I/dzt_test(26317): android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2331)
04-09 14:19:51.769 I/dzt_test(26317): android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2429)
04-09 14:19:51.769 I/dzt_test(26317): android.app.ActivityThread.access$800(ActivityThread.java:151)
04-09 14:19:51.770 I/dzt_test(26317): android.app.ActivityThread$H.handleMessage(ActivityThread.java:1342)
04-09 14:19:51.770 I/dzt_test(26317): android.os.Handler.dispatchMessage(Handler.java:110)
04-09 14:19:51.770 I/dzt_test(26317): android.os.Looper.loop(Looper.java:193)
04-09 14:19:51.770 I/dzt_test(26317): android.app.ActivityThread.main(ActivityThread.java:5333)
04-09 14:19:51.771 I/dzt_test(26317): java.lang.reflect.Method.invokeNative(Native Method)
04-09 14:19:51.771 I/dzt_test(26317): java.lang.reflect.Method.invoke(Method.java:515)
04-09 14:19:51.771 I/dzt_test(26317): com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:830)
04-09 14:19:51.771 I/dzt_test(26317): com.android.internal.os.ZygoteInit.main(ZygoteInit.java:646)
04-09 14:19:51.771 I/dzt_test(26317): dalvik.system.NativeStart.main(Native Method)

4、

RuntimeException re = new RuntimeException();
		re.fillInStackTrace();
		Log.i(TAG, "stackTrace", re);
04-09 14:19:51.773 I/dzt_test(26317): stackTrace
04-09 14:19:51.773 I/dzt_test(26317): java.lang.RuntimeException
04-09 14:19:51.773 I/dzt_test(26317): 	at com.dzt.testapp.MainActivity.ThrowException(MainActivity.java:81)
04-09 14:19:51.773 I/dzt_test(26317): 	at com.dzt.testapp.MainActivity.onCreate(MainActivity.java:63)
04-09 14:19:51.773 I/dzt_test(26317): 	at android.app.Activity.performCreate(Activity.java:5343)
04-09 14:19:51.773 I/dzt_test(26317): 	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1088)
04-09 14:19:51.773 I/dzt_test(26317): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2331)
04-09 14:19:51.773 I/dzt_test(26317): 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2429)
04-09 14:19:51.773 I/dzt_test(26317): 	at android.app.ActivityThread.access$800(ActivityThread.java:151)
04-09 14:19:51.773 I/dzt_test(26317): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1342)
04-09 14:19:51.773 I/dzt_test(26317): 	at android.os.Handler.dispatchMessage(Handler.java:110)
04-09 14:19:51.773 I/dzt_test(26317): 	at android.os.Looper.loop(Looper.java:193)
04-09 14:19:51.773 I/dzt_test(26317): 	at android.app.ActivityThread.main(ActivityThread.java:5333)
04-09 14:19:51.773 I/dzt_test(26317): 	at java.lang.reflect.Method.invokeNative(Native Method)
04-09 14:19:51.773 I/dzt_test(26317): 	at java.lang.reflect.Method.invoke(Method.java:515)
04-09 14:19:51.773 I/dzt_test(26317): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:830)
04-09 14:19:51.773 I/dzt_test(26317): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:646)
04-09 14:19:51.773 I/dzt_test(26317): 	at dalvik.system.NativeStart.main(Native Method)

5、

// 主动抛出异常调试
		try {
			Log.i(TAG,
					"--------------------------------NullPointerException-----------1");
			throw new NullPointerException();
		} catch (NullPointerException e1) {
			// TODO: handle exception
			Log.i(TAG, "--------------------------------NullPointerException");
			Log.e(TAG, Log.getStackTraceString(e1));
			// e1.printStackTrace();
		}
		Log.i(TAG,
				"--------------------------------NullPointerException-----------end");
04-09 14:19:51.773 I/dzt_test(26317): --------------------------------NullPointerException-----------1
04-09 14:19:51.773 I/dzt_test(26317): --------------------------------NullPointerException
04-09 14:19:51.774 E/dzt_test(26317): java.lang.NullPointerException
04-09 14:19:51.774 E/dzt_test(26317): 	at com.dzt.testapp.MainActivity.ThrowException(MainActivity.java:88)
04-09 14:19:51.774 E/dzt_test(26317): 	at com.dzt.testapp.MainActivity.onCreate(MainActivity.java:63)
04-09 14:19:51.774 E/dzt_test(26317): 	at android.app.Activity.performCreate(Activity.java:5343)
04-09 14:19:51.774 E/dzt_test(26317): 	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1088)
04-09 14:19:51.774 E/dzt_test(26317): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2331)
04-09 14:19:51.774 E/dzt_test(26317): 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2429)
04-09 14:19:51.774 E/dzt_test(26317): 	at android.app.ActivityThread.access$800(ActivityThread.java:151)
04-09 14:19:51.774 E/dzt_test(26317): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1342)
04-09 14:19:51.774 E/dzt_test(26317): 	at android.os.Handler.dispatchMessage(Handler.java:110)
04-09 14:19:51.774 E/dzt_test(26317): 	at android.os.Looper.loop(Looper.java:193)
04-09 14:19:51.774 E/dzt_test(26317): 	at android.app.ActivityThread.main(ActivityThread.java:5333)
04-09 14:19:51.774 E/dzt_test(26317): 	at java.lang.reflect.Method.invokeNative(Native Method)
04-09 14:19:51.774 E/dzt_test(26317): 	at java.lang.reflect.Method.invoke(Method.java:515)
04-09 14:19:51.774 E/dzt_test(26317): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:830)
04-09 14:19:51.774 E/dzt_test(26317): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:646)
04-09 14:19:51.774 E/dzt_test(26317): 	at dalvik.system.NativeStart.main(Native Method)
04-09 14:19:51.775 I/dzt_test(26317): --------------------------------NullPointerException-----------end

虽然以上方法不尽一样,但打印出来的堆栈是一样的。

时间: 2024-10-09 19:55:08

Android 打印堆栈的几种方法的相关文章

Java 打印堆栈的几种方法

转自:http://www.cnblogs.com/AloneSword/p/3857423.html java 中可以通过 eclipse 等工具直接打印堆栈,但是对于某些环境中无法使用 eclipse 工具时,需要知道堆栈,如何处理呢? 介绍3种方法供选择: 方法一: package name.xu; public class CallStack { public static void printCallStatck() { Throwable ex = new Throwable();

Java 打印堆栈的几种方法 Exception

Exception e = new Exception("this is a log"); e.printStackTrace(); //延迟才可以看出效果 Thread.currentThread().sleep(1000); System.out.println("-------------以上是异常详细信息----------------"); System.out.println("打印异常1:"+e.toString()); Strin

Android 创建单例模式的几种方法

java模式之单例模式:单例模式确保一个类只有一个实例,自行提供这个实例并向整个系统提供这个实例.特点:1,一个类只能有一个实例2,自己创建这个实例3,整个系统都要使用这个实例 Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在.在很多操作中,比如建立目录 数据库连接都需要这样的单线程操作.一些资源管理器常常设计成单例模式.外部资源:譬如每台计算机可以有若干个打印机,但只能有一个Printer Spooler,以避免两个打印作业同时输出到打印机中.每台计算

android 定位一般有四种方法

android 定位一般有四种方法,这四种方式分别是:GPS定位,WIFI定准,基站定位,AGPS定位,                             (1)Android GPS:需要GPS硬件支持,直接和卫星交互来获取当前经纬度,这种方式需要手机支持GPS模块(现在大部分的智能机应该都有了).通过GPS方式准确度是最高的,但是它的缺点也非常明显:1,比较耗电:2,绝大部分用户默认不开启GPS模块:3,从GPS模块启动到获取第一次定位数据,可能需要比较长的时间:4,室内几乎无法使用.

Android 更新UI的两种方法——handler和runOnUiThread() - $firecat的代码足迹$ - 博客频道 - CSDN.NET

文章来源:http://www.2cto.com/kf/201302/190591.html Android 更新UI的两种方法——handler和runOnUiThread() 在Android开发过程中,常需要更新界面的UI.而更新UI是要主线程来更新的,即UI线程更新.如果在主线线程之外的线程中直接更新页面显示常会报错.抛出异常:android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread th

Android 更新UI的两种方法——handler和runOnUiThread(

Android 更新UI的两种方法——handler和runOnUiThread() 在Android开发过程中,常需要更新界面的UI.而更新UI是要主线程来更新的,即UI线程更新.如果在主线线程之外的线程中直接更新页面显示常会报错.抛出异常:android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views

探讨android更新UI的几种方法

作为IT新手,总以为只要有时间,有精力,什么东西都能做出来.这种念头我也有过,但很快就熄灭了,因为现实是残酷的,就算一开始的时间和精力非常充足,也会随着项目的推进而逐步消磨殆尽.我们会发现,自己越来越消极怠工,只是在无意义的敲代码,敲的还是网上抄来的代码,如果不行,继续找. 这就是项目进度没有规划好而导致的. 最近在做有关蓝牙的项目,一开始的进度都安排得很顺利,但是因为测试需要两部手机,而且还要是android手机,暑假已经开始了,同学们都回家了,加上我手机的蓝牙坏了,导致我的进度严重被打乱!而

android 实现分享功能两种方法

当我想做一个智能的记事本的时候,我就在尝试自己写一组分享功能.后来才知道,原来每个社交软件中都有自己的分享接口. 这就大大减少了我们的代码量了. 第一种方法:特点--简单 package com.example.share; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.Menu; import android.view.MenuI

[Android] Android 定时任务实现的三种方法(以SeekBar的进度自动实现为例)

一.采用Handler与线程的sleep(long)方法 二.采用Handler与timer及TimerTask结合的方法 三.采用Handler的postDelayed(Runnable, long)方法  布局文件: activity_main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.c