Android 打印java堆栈的几种方法

本文介绍了一种在Android应用程序中进行调试的技巧,通过多种方式打印调用堆栈来帮助开发者更好地定位问题所在。这些方法包括使用Log类、创建并打印异常、获取当前线程的堆栈等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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()));

 

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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();

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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、

 

 

?
1
2
3
4
// 获取当前线程的堆栈
         for (StackTraceElement i : Thread.currentThread().getStackTrace()) {
             Log.i(TAG, i.toString());
         }
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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、

 

 

?
1
2
3
RuntimeException re = new RuntimeException();
         re.fillInStackTrace();
         Log.i(TAG, "stackTrace" , re);

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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、

 

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
// 主动抛出异常调试
         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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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

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

转载于:https://www.cnblogs.com/myPersonalTailor/p/4901504.html

<think>我们正在讨论的是如何在AndroidJava打印堆栈跟踪。根据引用内容,主要有两种场景:1.在捕获异常时打印异常堆栈(使用Throwable的printStackTrace方法)2.不需要异常发生,主动打印当前调用堆栈(通过创建Throwable对象或使用Thread.currentThread().getStackTrace())引用[1]提到:Java代码打印堆栈比较简单,堆栈信息获取和输出,都可以通过Throwable类的方法实现。通常的做法是在出现异常时打印堆栈,然后决定退出或挽救,使用exception的printStackTrace()方法。引用[2]和[3]则提供了更多方法,包括在非异常情况下打印堆栈。因此,我们可以分为两种情况来回答:打印异常堆栈打印当前堆栈(无异常时)。具体方法如下:###方法1:打印异常堆栈当捕获到异常时,可以直接调用异常的`printStackTrace()`方法,该方法打印异常的堆栈信息到标准错误流(System.err)。也可以使用Log类将堆栈信息输出到Logcat。示例代码:```javatry{//可能抛出异常的代码intresult=10/0;}catch(Exceptione){//打印到控制台(通常用于命令行程序,在Android中可能看不到)e.printStackTrace();//或者使用Log打印到Logcat(推荐)Log.e("TAG","Exceptionoccurred:",e);}```###方法2:主动打印当前堆栈(无异常发生时)有时我们想在没有异常发生时打印当前的调用堆栈,以了解代码的执行路径。可以通过创建一个Throwable对象(但不抛出)或获取当前线程的堆栈跟踪。####方法2.1:使用Throwable```java//创建一个Throwable对象,其堆栈跟踪会包含当前线程的调用堆栈Throwablestack=newThrowable("Currentstacktrace");//打印到控制台stack.printStackTrace();//或者使用Log打印Log.d("TAG","Currentstacktrace:",stack);```####方法2.2:使用Thread.currentThread().getStackTrace()```java//获取当前线程的堆栈跟踪元素数组StackTraceElement[]stackTraceElements=Thread.currentThread().getStackTrace();//然后可以遍历数组并打印for(StackTraceElementelement:stackTraceElements){Log.d("TAG",element.toString());}```或者,为了方便,也可以封装成一个方法:```javapublicstaticvoidprintCurrentStackTrace(Stringtag){StackTraceElement[]stackTrace=Thread.currentThread().getStackTrace();//注意:从下标2开始,因为0是getStackTrace,1是这个方法本身for(inti=2;i<stackTrace.length;i++){Log.d(tag,stackTrace[i].toString());}}//调用printCurrentStackTrace("TAG");```###注意事项-在Android开发中,推荐使用`Log`类输出堆栈信息,因为`printStackTrace()`的输出可能不会在Logcat中显示(或者显示在System.err中,但可能被忽略)。-使用`Log`的方法(如`Log.e`,`Log.d`)时,可以直接传入Throwable对象,这样Log类会自动打印堆栈信息。###总结-**有异常时**:使用`e.printStackTrace()`或`Log.e("TAG","message",e)`。-**无异常时**:使用`newThrowable().printStackTrace()`或`Log.d("TAG","message",newThrowable())`,或者通过`Thread.currentThread().getStackTrace()`获取并遍历打印。引用[1][2][3]中提到的都是这些方法,可以根据具体场景选择。§§相关问题§§1.如何在Android中捕获全局未处理异常并打印堆栈?2.AndroidLogcat中如何过滤堆栈信息?3.如何将Android堆栈信息保存到文件中?</think>在 Android Java 开发中,打印堆栈跟踪是调试的重要手段。以下是几种常用方法及代码示例: ### 一、捕获异常时打印堆栈 ```java try { // 可能抛出异常的代码 int result = 10 / 0; } catch (Exception e) { // 方法1:直接打印到控制台 e.printStackTrace(); // 输出到System.err[^1] // 方法2:输出到Logcat(推荐) Log.e("TAG", "Exception occurred: ", e); // 包含完整堆栈[^2] // 方法3:获取堆栈字符串 StringWriter sw = new StringWriter(); e.printStackTrace(new PrintWriter(sw)); String stackTrace = sw.toString(); Log.e("TAG", "Stack trace:\n" + stackTrace); } ``` ### 二、无异常时打印当前堆栈 ```java // 方法1:创建Throwable对象获取堆栈 Throwable stack = new Throwable("Current stack trace"); Log.d("DEBUG", "Current call stack:", stack); // 直接传入Throwable[^3] // 方法2:通过线程获取堆栈 StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); StringBuilder sb = new StringBuilder(); for (StackTraceElement element : stackTrace) { sb.append(element.toString()).append("\n"); } Log.d("DEBUG", "Stack trace:\n" + sb.toString()); ``` ### 三、关键说明 1. **Logcat 输出优势**: - 使用 `Log.e(tag, msg, throwable)` 可保留堆栈格式 - 支持按 TAG 过滤日志 - 不会导致应用崩溃 2. **堆栈内容解析**: ```plaintext java.lang.ArithmeticException: divide by zero at com.example.MyActivity.onCreate(MyActivity.java:25) // 最顶层是最近调用 at android.app.Activity.performCreate(Activity.java:7800) ... // 底层是最早调用 ``` 3. **最佳实践**: - 调试时使用 `Log.d()` 配合 Throwable - 生产环境捕获全局异常: ```java Thread.setDefaultUncaughtExceptionHandler((thread, ex) -> { Log.e("CRASH", "Uncaught exception", ex); // 可选:将堆栈写入文件 }); ``` ### 四、输出示例 在 Logcat 中会显示: ```log E/TAG: Exception occurred: java.lang.ArithmeticException: divide by zero at com.example.MainActivity.calculate(MainActivity.java:42) at com.example.MainActivity.onCreate(MainActivity.java:30) ... ``` > **注意**:频繁打印堆栈会影响性能,调试完成后应移除或使用`BuildConfig.DEBUG`条件控制[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值