Can not get stack trace of main thread on Android 7.0?

JalenChen

New member
Apr 11, 2017
1
0
0
Visit site
As a simple test on Android 7.0, the `Thread.getAllStackTraces()` API can not get the stack trace of main thread(which belongs to "main" thread group). But the stack trace of main thread can be got by `Thread.currentThread().getStackTrace()` as below.

Test code:


Set<Thread> threads = Thread.getAllStackTraces().keySet();
Log.d("Test", String.format("Number of threads get by 'Thread.getAllStackTraces()': %d", threads.size()));
for (Thread thread : threads) {
if (thread != null) {
Log.d("Test", String.format("[ID]: %d, [Name]: %s", thread.getId(), thread.getName()));
}
}
Log.d("Test", String.format("Current thread name: %s", Thread.currentThread().getName()));
Log.d("Test", String.format("Current group name: %s", Thread.currentThread().getThreadGroup().getName()));
StackTraceElement[] elements = Thread.currentThread().getStackTrace();
for (int i = 0; i < elements.length; i++) {
Log.d("Test", String.format("main stack element[%d]: %s", i, elements));
}

Result on Android 4.4:

Number of threads get by 'Thread.getAllStackTraces()': 10
[ID]: 1871, [Name]: GCDaemon
[ID]: 1867, [Name]: ReferenceQueueDaemon
[ID]: 1870, [Name]: HeapTrimmerDaemon
[ID]: 1872, [Name]: Binder_1
[ID]: 1866, [Name]: JDWP
[ID]: 1868, [Name]: FinalizerDaemon
[ID]: 1869, [Name]: FinalizerWatchdogDaemon
[ID]: 1, [Name]: main
[ID]: 1873, [Name]: Binder_2
[ID]: 1865, [Name]: Signal Catcher
Current thread name: main
Current group name: main
main stack element[0]: dalvik.system.VMStack.getThreadStackTrace(Native Method)
main stack element[1]: java.lang.Thread.getStackTrace(Thread.java:580)
main stack element[2]: com.test.demo.MainActivity.onCreate(MainActivity.java:169)
main stack element[3]: android.app.Activity.performCreate(Activity.java:6117)
main stack element[4]: android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123)
main stack element[5]: android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2612)
main stack element[6]: android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2728)
main stack element[7]: android.app.ActivityThread.access$800(ActivityThread.java:179)
main stack element[8]: android.app.ActivityThread$H.handleMessage(ActivityThread.java:1579)
main stack element[9]: android.os.Handler.dispatchMessage(Handler.java:111)
main stack element[10]: android.os.Looper.loop(Looper.java:194)
main stack element[11]: android.app.ActivityThread.main(ActivityThread.java:5838)
main stack element[12]: java.lang.reflect.Method.invoke(Native Method)
main stack element[13]: java.lang.reflect.Method.invoke(Method.java:372)
main stack element[14]: com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1009)
main stack element[15]: com.android.internal.os.ZygoteInit.main(ZygoteInit.java:804)

Result on Android 7.0:

Number of threads get by 'Thread.getAllStackTraces()': 4
[ID]: 116, [Name]: FinalizerWatchdogDaemon
[ID]: 114, [Name]: ReferenceQueueDaemon
[ID]: 115, [Name]: FinalizerDaemon
[ID]: 117, [Name]: HeapTaskDaemon
Current thread name: main
Current group name: main
main stack element[0]: dalvik.system.VMStack.getThreadStackTrace(Native Method)
main stack element[1]: java.lang.Thread.getStackTrace(Thread.java:1566)
main stack element[2]: com.test.demo.MainActivity.onCreate(MainActivity.java:169)
main stack element[3]: android.app.Activity.performCreate(Activity.java:6664)
main stack element[4]: android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
main stack element[5]: android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2599)
main stack element[6]: android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)
main stack element[7]: android.app.ActivityThread.-wrap12(ActivityThread.java)
main stack element[8]: android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)
main stack element[9]: android.os.Handler.dispatchMessage(Handler.java:102)
main stack element[10]: android.os.Looper.loop(Looper.java:154)
main stack element[11]: android.app.ActivityThread.main(ActivityThread.java:6077)
main stack element[12]: java.lang.reflect.Method.invoke(Native Method)
main stack element[13]: com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
main stack element[14]: com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)

It seems like something relative with the permission of Android to get thread information. But the Android Device Monitor can get all threads and their detailed information.

So is there any way to get the stack of main thread on >= Android 7.0?

Thanks for any reading and answer.
 

Members online

Trending Posts

Forum statistics

Threads
942,411
Messages
6,913,957
Members
3,158,400
Latest member
m1000