Knight-ZXW / Sliver

字节跳动sliver 采集Java函数栈实现
Apache License 2.0
91 stars 22 forks source link

你好,在Android13,小米手机上,运行demod的release版本,函数的指针地址有重复导致获取到重复的方法信息(问题必现),debug的apk正常 #2

Closed 18243013969 closed 1 year ago

18243013969 commented 1 year ago

首次安装启动是正常的,第二次启动就会出现重复的方法 首次启动的 stack_methods 数组和 2023-06-14 14:43:14.627 26901-26901 sliver pid-26901 E 在当前线程获取调用栈 2023-06-14 14:43:14.627 26901-26901 sliver pid-26901 E stack_methods[0] = 513826097944 2023-06-14 14:43:14.627 26901-26901 sliver pid-26901 E stack_methods[1] = 513826090584 2023-06-14 14:43:14.627 26901-26901 sliver pid-26901 E stack_methods[2] = 513826090584 2023-06-14 14:43:14.627 26901-26901 sliver pid-26901 E stack_methods[3] = 513825995272 2023-06-14 14:43:14.627 26901-26901 sliver pid-26901 E stack_methods[4] = 1907603128 2023-06-14 14:43:14.627 26901-26901 sliver pid-26901 E stack_methods[5] = 1904142192 2023-06-14 14:43:14.627 26901-26901 sliver pid-26901 E stack_methods[6] = 1904142192 2023-06-14 14:43:14.627 26901-26901 sliver pid-26901 E stack_methods[7] = 1907484096 2023-06-14 14:43:14.627 26901-26901 sliver pid-26901 E stack_methods[8] = 1907486528 2023-06-14 14:43:14.627 26901-26901 sliver pid-26901 E stack_methods[9] = 1904979144 2023-06-14 14:43:14.627 26901-26901 sliver pid-26901 E stack_methods[10] = 1904181072 2023-06-14 14:43:14.627 26901-26901 sliver pid-26901 E stack_methods[11] = 1904181040 2023-06-14 14:43:14.627 26901-26901 sliver pid-26901 E stack_methods[12] = 1904352864 2023-06-14 14:43:14.627 26901-26901 sliver pid-26901 E stack_methods[13] = 1905622032 2023-06-14 14:43:14.627 26901-26901 sliver pid-26901 E stack_methods[14] = 1905626352 2023-06-14 14:43:14.627 26901-26901 sliver pid-26901 E stack_methods[15] = 1905626320 2023-06-14 14:43:14.627 26901-26901 sliver pid-26901 E stack_methods[16] = 1907483904 2023-06-14 14:43:14.627 26901-26901 sliver pid-26901 E stack_methods[17] = 1891454744 2023-06-14 14:43:14.627 26901-26901 sliver pid-26901 E stack_methods[18] = 1906723528 2023-06-14 14:43:14.627 26901-26901 sliver pid-26901 E stack_methods[19] = 1908015624 2023-06-14 14:43:14.627 26901-26901 sliver pid-26901 I
long[] com.zongheng.sliver.Sliver.nativeGetMethodStackTrace(java.lang.Thread, long) 2023-06-14 14:43:14.627 26901-26901 sliver pid-26901 I
void v1.d.b() 2023-06-14 14:43:14.627 26901-26901 sliver pid-26901 I void v1.d.b() 2023-06-14 14:43:14.627 26901-26901 sliver pid-26901 I void com.knightboost.sliver.demo.MainActivity.onCreate(android.os.Bundle) 2023-06-14 14:43:14.627 26901-26901 sliver pid-26901 I
void android.app.Activity.performCreate(android.os.Bundle, android.os.PersistableBundle) 2023-06-14 14:43:14.627 26901-26901 sliver pid-26901 I
void android.app.Instrumentation.callActivityOnCreate(android.app.Activity, android.os.Bundle) 2023-06-14 14:43:14.627 26901-26901 sliver pid-26901 I
void android.app.Instrumentation.callActivityOnCreate(android.app.Activity, android.os.Bundle) 2023-06-14 14:43:14.627 26901-26901 sliver pid-26901 I
android.app.Activity android.app.ActivityThread.performLaunchActivity(android.app.ActivityThread$ActivityClientRecord, android.content.Intent) 2023-06-14 14:43:14.627 26901-26901 sliver pid-26901 I
android.app.Activity android.app.ActivityThread.handleLaunchActivity(android.app.ActivityThread$ActivityClientRecord, android.app.servertransaction.PendingTransactionActions, android.content.Intent) 2023-06-14 14:43:14.627 26901-26901 sliver pid-26901 I
void android.app.servertransaction.LaunchActivityItem.execute(android.app.ClientTransactionHandler, android.os.IBinder, android.app.servertransaction.PendingTransactionActions) 2023-06-14 14:43:14.627 26901-26901 sliver pid-26901 I
void android.app.servertransaction.TransactionExecutor.executeCallbacks(android.app.servertransaction.ClientTransaction) 2023-06-14 14:43:14.627 26901-26901 sliver pid-26901 I
void android.app.servertransaction.TransactionExecutor.execute(android.app.servertransaction.ClientTransaction) 2023-06-14 14:43:14.627 26901-26901 sliver pid-26901 I
void android.app.ActivityThread$H.handleMessage(android.os.Message) 2023-06-14 14:43:14.627 26901-26901 sliver pid-26901 I
void android.os.Handler.dispatchMessage(android.os.Message) 2023-06-14 14:43:14.627 26901-26901 sliver pid-26901 I
boolean android.os.Looper.loopOnce(android.os.Looper, long, int) 2023-06-14 14:43:14.627 26901-26901 sliver pid-26901 I void android.os.Looper.loop() 2023-06-14 14:43:14.627 26901-26901 sliver pid-26901 I
void android.app.ActivityThread.main(java.lang.String[]) 2023-06-14 14:43:14.627 26901-26901 sliver pid-26901 I
java.lang.Object java.lang.reflect.Method.invoke(java.lang.Object, java.lang.Object[]) 2023-06-14 14:43:14.627 26901-26901 sliver pid-26901 I
void com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run() 2023-06-14 14:43:14.627 26901-26901 sliver pid-26901 I
void com.android.internal.os.ZygoteInit.main(java.lang.String[])

第二次启动数据输出 2023-06-14 14:46:31.292 27568-27568 sliver pid-27568 E 在当前线程获取调用栈 2023-06-14 14:46:31.292 27568-27568 sliver pid-27568 E stack_methods[0] = 2663898288 2023-06-14 14:46:31.292 27568-27568 sliver pid-27568 E stack_methods[1] = 2663871912 2023-06-14 14:46:31.292 27568-27568 sliver pid-27568 E stack_methods[2] = 2663871912 2023-06-14 14:46:31.292 27568-27568 sliver pid-27568 E stack_methods[3] = 2663895072 2023-06-14 14:46:31.292 27568-27568 sliver pid-27568 E stack_methods[4] = 1907603128 2023-06-14 14:46:31.292 27568-27568 sliver pid-27568 E stack_methods[5] = 1904142192 2023-06-14 14:46:31.292 27568-27568 sliver pid-27568 E stack_methods[6] = 1904142192 2023-06-14 14:46:31.292 27568-27568 sliver pid-27568 E stack_methods[7] = 1907484096 2023-06-14 14:46:31.292 27568-27568 sliver pid-27568 E stack_methods[8] = 1907486528 2023-06-14 14:46:31.292 27568-27568 sliver pid-27568 E stack_methods[9] = 1904979144 2023-06-14 14:46:31.292 27568-27568 sliver pid-27568 E stack_methods[10] = 1904181072 2023-06-14 14:46:31.292 27568-27568 sliver pid-27568 E stack_methods[11] = 1904181040 2023-06-14 14:46:31.292 27568-27568 sliver pid-27568 E stack_methods[12] = 1904352864 2023-06-14 14:46:31.292 27568-27568 sliver pid-27568 E stack_methods[13] = 1905622032 2023-06-14 14:46:31.292 27568-27568 sliver pid-27568 E stack_methods[14] = 1905626352 2023-06-14 14:46:31.292 27568-27568 sliver pid-27568 E stack_methods[15] = 1905626320 2023-06-14 14:46:31.292 27568-27568 sliver pid-27568 E stack_methods[16] = 1907483904 2023-06-14 14:46:31.292 27568-27568 sliver pid-27568 E stack_methods[17] = 1891454744 2023-06-14 14:46:31.292 27568-27568 sliver pid-27568 E stack_methods[18] = 1906723528 2023-06-14 14:46:31.292 27568-27568 sliver pid-27568 E stack_methods[19] = 1908015624 2023-06-14 14:46:31.292 27568-27568 sliver pid-27568 I
long[] com.zongheng.sliver.Sliver.nativeGetMethodStackTrace(java.lang.Thread, long) 2023-06-14 14:46:31.292 27568-27568 sliver pid-27568 I
void v1.d.b() 2023-06-14 14:46:31.292 27568-27568 sliver pid-27568 I
void v1.d.b() 2023-06-14 14:46:31.292 27568-27568 sliver pid-27568 I
void com.knightboost.sliver.demo.MainActivity.onCreate(android.os.Bundle) 2023-06-14 14:46:31.292 27568-27568 sliver pid-27568 I
void android.app.Activity.performCreate(android.os.Bundle, android.os.PersistableBundle) 2023-06-14 14:46:31.292 27568-27568 sliver pid-27568 I
void android.app.Instrumentation.callActivityOnCreate(android.app.Activity, android.os.Bundle) 2023-06-14 14:46:31.292 27568-27568 sliver pid-27568 I void android.app.Instrumentation.callActivityOnCreate(android.app.Activity, android.os.Bundle) 2023-06-14 14:46:31.292 27568-27568 sliver pid-27568 I
android.app.Activity android.app.ActivityThread.performLaunchActivity(android.app.ActivityThread$ActivityClientRecord, android.content.Intent) 2023-06-14 14:46:31.292 27568-27568 sliver pid-27568 I
android.app.Activity android.app.ActivityThread.handleLaunchActivity(android.app.ActivityThread$ActivityClientRecord, android.app.servertransaction.PendingTransactionActions, android.content.Intent) 2023-06-14 14:46:31.292 27568-27568 sliver pid-27568 I void android.app.servertransaction.LaunchActivityItem.execute(android.app.ClientTransactionHandler, android.os.IBinder, android.app.servertransaction.PendingTransactionActions) 2023-06-14 14:46:31.292 27568-27568 sliver pid-27568 I void android.app.servertransaction.TransactionExecutor.executeCallbacks(android.app.servertransaction.ClientTransaction) 2023-06-14 14:46:31.292 27568-27568 sliver pid-27568 I
void android.app.servertransaction.TransactionExecutor.execute(android.app.servertransaction.ClientTransaction) 2023-06-14 14:46:31.292 27568-27568 sliver pid-27568 I
void android.app.ActivityThread$H.handleMessage(android.os.Message) 2023-06-14 14:46:31.292 27568-27568 sliver pid-27568 I void android.os.Handler.dispatchMessage(android.os.Message) 2023-06-14 14:46:31.292 27568-27568 sliver pid-27568 I
boolean android.os.Looper.loopOnce(android.os.Looper, long, int) 2023-06-14 14:46:31.292 27568-27568 sliver pid-27568 I
void android.os.Looper.loop() 2023-06-14 14:46:31.292 27568-27568 sliver pid-27568 I
void android.app.ActivityThread.main(java.lang.String[]) 2023-06-14 14:46:31.292 27568-27568 sliver pid-27568 I
java.lang.Object java.lang.reflect.Method.invoke(java.lang.Object, java.lang.Object[]) 2023-06-14 14:46:31.292 27568-27568 sliver pid-27568 I
void com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run() 2023-06-14 14:46:31.292 27568-27568 sliver pid-27568 I
void com.android.internal.os.ZygoteInit.main(java.lang.String[]) 2023-06-14 14:46:31.365 27568-27597 ost.sliver.demo pid-27568 D MiuiProcessManagerServiceStub setSchedFifo 2023-06-14 14:46:39.227 27568-27595 ost.sliver.demo com.knightboost.sliver.demo

1 可以看出 2023-06-14 14:46:31.292 27568-27568 sliver pid-27568 E stack_methods[1] = 2663871912 2023-06-14 14:46:31.292 27568-27568 sliver pid-27568 E stack_methods[2] = 2663871912 这获取到的函数的指针地址有重复的,但是我并没有同一个方法调用两次

2 通过第一次函数的指针地址数组上看,自己写的类返回函数的指针的长度是12位,比如513826097944;但是非首次启动就获取不到长度为12位的函数指针;

Knight-ZXW commented 1 year ago

2023-06-14 14:43:14.627 26901-26901 sliver pid-26901 E 在当前线程获取调用栈 2023-06-14 14:43:14.627 26901-26901 sliver pid-26901 E stack_methods[0] = 513826097944 2023-06-14 14:43:14.627 26901-26901 sliver pid-26901 E stack_methods[1] = 513826090584 2023-06-14 14:43:14.627 26901-26901 sliver pid-26901 E stack_methods[2] = 513826090584

你给的日志第一次也是重复的, 我本地复现了

Knight-ZXW commented 1 year ago

问题已修复, 原因是release包 进行的函数内联优化导致的。

Knight-ZXW commented 1 year ago

先关闭了,有问题的话 可以再开Issue