线程 堆栈跟踪信息 StackTraceElement
2018-01-04 10:41
465 查看
方法一:通过 StackTraceElement
方法:public static void printCallStatck() { StackTraceElement[] stackElements = Thread.currentThread().getStackTrace(); //StackTraceElement[] stackElements = new Throwable().getStackTrace(); if (stackElements != null) { for (StackTraceElement stackTraceElement : stackElements) { System.out.println("ClassName:" + stackTraceElement.getClassName()); System.out.println("FileName:" + stackTraceElement.getFileName()); System.out.println("LineNumber:" + stackTraceElement.getLineNumber()); System.out.println("MethodName:" + stackTraceElement.getMethodName()); System.out.println("isNativeMethod:" + stackTraceElement.isNativeMethod()); System.out.println("信息:" + stackTraceElement.toString()); System.out.println("-----------------------------------"); } } }//StackTraceElement[] stackElements = new Throwable().getStackTrace();
x1
public static void printCallStatck() {2
StackTraceElement[] stackElements = Thread.currentThread().getStackTrace();3
//StackTraceElement[] stackElements = new Throwable().getStackTrace();4
if (stackElements != null) {5
for (StackTraceElement stackTraceElement : stackElements) {6
System.out.println("ClassName:" + stackTraceElement.getClassName());7
System.out.println("FileName:" + stackTraceElement.getFileName());8
System.out.println("LineNumber:" + stackTraceElement.getLineNumber());9
System.out.println("MethodName:" + stackTraceElement.getMethodName());10
System.out.println("isNativeMethod:" + stackTraceElement.isNativeMethod());11
System.out.println("信息:" + stackTraceElement.toString());12
System.out.println("-----------------------------------");13
}14
}15
}结果:
ClassName:java.lang.Thread FileName:Thread.java LineNumber:1552 MethodName:getStackTrace isNativeMethod:false 信息:java.lang.Thread.getStackTrace(Thread.java:1552) ----------------------------------- ClassName:Test FileName:Test.java LineNumber:7 MethodName:printCallStatck isNativeMethod:false 信息:Test.printCallStatck(Test.java:7) ----------------------------------- ClassName:Test FileName:Test.java LineNumber:3 MethodName:main isNativeMethod:false 信息:Test.main(Test.java:3) -----------------------------------
x1
ClassName:java.lang.Thread2
FileName:Thread.java3
LineNumber:15524
MethodName:getStackTrace5
isNativeMethod:false6
信息:java.lang.Thread.getStackTrace(Thread.java:1552)7
-----------------------------------8
ClassName:Test9
FileName:Test.java10
LineNumber:711
MethodName:printCallStatck12
isNativeMethod:false13
信息:Test.printCallStatck(Test.java:7)14
-----------------------------------15
ClassName:Test16
FileName:Test.java17
LineNumber:318
MethodName:main19
isNativeMethod:false20
信息:Test.main(Test.java:3)21
-----------------------------------注意:1、数组中元素的个数是不确定个的,这完全取决于打印堆栈信息时经过了几步的调用。2、并非最后一个元素的就一定是我们最想要的信息,因为在框架中,后续可能还会有很多层的调用,比如在Android中打印日志的一个案例:
dalvik.system.VMStack:getThreadStackTrace:-2 java.lang.Thread:getStackTrace:1566 com.yibasan.lizhifm.ad.Lg:log:58 com.yibasan.lizhifm.ad.Lg:i:34//这里调用了Log.i com.yibasan.lizhifm.ad.SplashAdManager:canShowAd:66//我们是在这里调用了封装好的Lg类中的Lg.i方法,所以这里的元素是我们最想要的 com.yibasan.lizhifm.activities.BaseActivity:onResume:518 com.yibasan.lizhifm.activities.fm.NavBarActivity:onResume:375 android.app.Instrumentation:callActivityOnResume:1276 android.app.Activity:performResume:6937 android.app.ActivityThread:performResumeActivity:3468 android.app.ActivityThread:handleResumeActivity:3531 android.app.ActivityThread$H:handleMessage:1569 android.os.Handler:dispatchMessage:102 android.os.Looper:loop:154 android.app.ActivityThread:main:6209 java.lang.reflect.Method:invoke:-2 com.android.internal.os.ZygoteInit$MethodAndArgsCaller:run:900 com.android.internal.os.ZygoteInit:main:790
x1
dalvik.system.VMStack:getThreadStackTrace:-22
java.lang.Thread:getStackTrace:15663
com.yibasan.lizhifm.ad.Lg:log:584
com.yibasan.lizhifm.ad.Lg:i:34//这里调用了Log.i5
com.yibasan.lizhifm.ad.SplashAdManager:canShowAd:66//我们是在这里调用了封装好的Lg类中的Lg.i方法,所以这里的元素是我们最想要的6
com.yibasan.lizhifm.activities.BaseActivity:onResume:5187
com.yibasan.lizhifm.activities.fm.NavBarActivity:onResume:3758
android.app.Instrumentation:callActivityOnResume:12769
android.app.Activity:performResume:693710
android.app.ActivityThread:performResumeActivity:346811
android.app.ActivityThread:handleResumeActivity:353112
android.app.ActivityThread$H:handleMessage:156913
android.os.Handler:dispatchMessage:10214
android.os.Looper:loop:15415
android.app.ActivityThread:main:620916
java.lang.reflect.Method:invoke:-217
com.android.internal.os.ZygoteInit$MethodAndArgsCaller:run:90018
com.android.internal.os.ZygoteInit:main:790
方法二:通过 Exception
new Exception("this is a log").printStackTrace(); System.out.println("这里会继续执行");
x1
new Exception("this is a log").printStackTrace();2
System.out.println("这里会继续执行");结果
java.lang.Exception: this is a log at Test.main(Test.java:3) 这里会继续执行1
java.lang.Exception: this is a log2
at Test.main(Test.java:3)3
这里会继续执行
StackTraceElement 类简介
此类在 java.lang 包下public final class StackTraceElement extends Object implements Serializable
x8 1
public final class StackTraceElement extends Object implements Serializable堆栈跟踪元素,它由 Throwable.getStackTrace() 返回。每个元素表示单独的一个【堆栈帧】。所有的堆栈帧(堆栈顶部的那个堆栈帧除外)都表示一个【方法调用】。堆栈顶部的帧表示【生成堆栈跟踪的执行点】。通常,这是创建对应于堆栈跟踪的 throwable 的点。
构造方法
public StackTraceElement(String declaringClass, String methodName, String fileName, int lineNumber)1
public StackTraceElement(String declaringClass, String methodName, String fileName, int lineNumber)创建表示指定【执行点】的【堆栈跟踪元素】。
参数:
declaringClass - 类的完全限定名,该类包含由堆栈跟踪元素所表示的执行点
methodName - 方法名,该方法包含由堆栈跟踪元素所表示的执行点
fileName - 文件名,该文件包含由堆栈跟踪元素所表示的执行点;如果该信息不可用,则该参数为 null
lineNumber - 源代码行的行号,该代码行包含由堆栈跟踪元素所表示的执行点;如果此信息不可用,则该参数为负数。值 -2 表示包含执行点的方法是一个本机方法
抛出:
NullPointerException - 如果 declaringClass 或 methodName 为 null
普通方法
String getClassName() 返回类的完全限定名,该类包含由该堆栈跟踪元素所表示的执行点。String getFileName() 返回源文件名,该文件包含由该堆栈跟踪元素所表示的执行点。
int getLineNumber() 返回源行的行号,该行包含由该堆栈该跟踪元素所表示的执行点。
String getMethodName() 返回方法名,此方法包含由该堆栈跟踪元素所表示的执行点。
boolean isNativeMethod() 如果包含由该堆栈跟踪元素所表示的执行点的方法是一个本机方法,则返回 true。
重写的Object的方法boolean equals(Object obj) 如果指定的对象是另一个 StackTraceElement 实例,并且该对象表示的【执行点】与该实例的相同,则返回 ture。
int hashCode() 返回此堆栈跟踪元素的哈希码值。
String toString() 返回表示该堆栈跟踪元素的字符串。
该字符串的格式取决于实现,但是可将以下示例格式视为典型的格式: "MyClass.mash(MyClass.java:9)" - 其中,"MyClass" 是类的完全限定名,该类包含由该堆栈跟踪元素所表示的执行点;"mash" 是包含执行点的方法的名字;"MyClass.java" 是包含执行点的源文件;"9" 是包含执行点的源行的行号。 "MyClass.mash(MyClass.java)" - 同上,但是行号不可用。 "MyClass.mash(Unknown Source)" - 同上,但是文件名和行号都不可用。 "MyClass.mash(Native Method)" - 同上,但是文件名和行号都不可用,并且已知包含执行点的方法是本机方法。1
该字符串的格式取决于实现,但是可将以下示例格式视为典型的格式:2
"MyClass.mash(MyClass.java:9)" - 其中,"MyClass" 是类的完全限定名,该类包含由该堆栈跟踪元素所表示的执行点;"mash" 是包含执行点的方法的名字;"MyClass.java" 是包含执行点的源文件;"9" 是包含执行点的源行的行号。3
"MyClass.mash(MyClass.java)" - 同上,但是行号不可用。4
"MyClass.mash(Unknown Source)" - 同上,但是文件名和行号都不可用。5
"MyClass.mash(Native Method)" - 同上,但是文件名和行号都不可用,并且已知包含执行点的方法是本机方法。2018-1-3
相关文章推荐
- Thread类的getAllStackTraces()方法获取虚拟机中所有线程的StackTraceElement对象,可以查看堆栈
- StackTraceElement获取方法调用栈的信息
- 通过StackTraceElement获取方法调用者的具体信息
- android ndk调用Log.getStackTraceString(new Throwable())输出堆栈信息
- Java 输出 printStackTrace 堆栈信息
- 使用log4j的时候如何输出printStackTrace()的堆栈信息
- 把e.printStackTrace的堆栈信息打印在log.error()中
- StackTraceElement获取方法调用栈信息实例详解
- 通过StackTraceElement获取方法调用者的具体信息
- 把e.printStackTrace的堆栈信息打印在log.error()中
- 使用日志框架如何输出printStackTrace()的堆栈信息
- 使用log4j的时候如何输出printStackTrace()的堆栈信息
- 解码混淆过的堆栈跟踪信息(Decoding Obfuscated Stack Traces)
- 使用log4j的时候如何输出printStackTrace()的堆栈信息
- Java高级--Java线程运行栈信息的获取 getStackTrace()
- 把e.printStackTrace的堆栈信息打印在log.error()中
- 把e.printStackTrace的堆栈信息打印在log.error()中
- 把e.printStackTrace的堆栈信息打印在log.error()中
- 利用MSCRM4.0 Trace功能跟踪详细错误信息
- 得到java异常printStackTrace的详细信息