1、问题描述
android8.1 cts测试 CtsJvmtiTagging case概率failed,如图
2、分析过程
log如下:
4003 4021 E zygote : No implementation found forvoid art.Main.setTag(java.lang.Object, long) (tried Java_art_Main_setTag andJava_art_Main_setTag__Ljava_lang_Object_2J) 4003 4021 I TestRunner: failed:testTagging(android.jvmti.cts.JvmtiTaggingTest) 4003 4021 I TestRunner: ----- begin exception----- 4003 4021 I TestRunner: java.lang.UnsatisfiedLinkError: No implementation foundfor void art.Main.setTag(java.lang.Object, long) (tried Java_art_Main_setTagand Java_art_Main_setTag__Ljava_lang_Object_2J) 4003 4021 I TestRunner: at art.Main.setTag(Native Method) 4003 4021 I TestRunner: atandroid.jvmti.cts.JvmtiTaggingTest.test(JvmtiTaggingTest.java:36) 4003 4021 I TestRunner: atandroid.jvmti.cts.JvmtiTaggingTest.testTagging(JvmtiTaggingTest.java:65) 4003 4021 I TestRunner: at java.lang.reflect.Method.invoke(Native Method) 4003 4021 I TestRunner: atorg.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) 4003 4021 I TestRunner: atorg.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 4003 4021 I TestRunner: atorg.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) 4003 4021 I TestRunner: atorg.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) 4003 4021 I TestRunner: at android.support.test.internal.runner.junit4.statement.RunBefores.evaluate(RunBefores.java:80) 4003 4021 I TestRunner: at org.junit.rules.RunRules.evaluate(RunRules.java:20) …… 4003 4021 I TestRunner: ----- end exception ----- 4003 4021 I TestRunner: finished:testTagging(android.jvmti.cts.JvmtiTaggingTest) |
从上面log可知UnsatisfiedLinkError错误是在查找art.Main.setTag JNI函数时没有找到发生crash。
这里连接问题机器,对应进程有mmap libctsjvmtiagent.so库到内存,从对应库中是可以找到setTag
函数符号,同时从代码看没有看出明显异常,这里查找setTag函数是通过dlopen打开
libctsjvmtiagent.so库,通过dlsym查找符号,但是dlopen是成功的,dlsym这里返回的是NULL,
才会出现上面的错误。
搭建cts环境,做单包测试,会概率复现问题。在调用dlsym代码添加log,抓取log如下:
4003 4021 ITestRunner: run started: 3 tests 4003 4021 ITestRunner: started: testTagging(android.jvmti.cts.JvmtiTaggingTest) 4003 4003 Ezygote : [pxy]DoDlOpenhandle = 0xc63afa9d path= /data/data/android.jvmti.cts.tagging/libctsjvmtiagent.so 4003 4003 Ezygote : [pxy]FindSymbol func =0x94f89471 sym_name =Agent_OnLoad handle =0xc63afa9d 4003 4003 Ezygote : [pxy]FindSymbol func =0x94f8967d sym_name =Agent_OnAttach handle =0xc63afa9d 4003 4003 Ezygote : [pxy]FindSymbol func = 0x0 sym_name = Agent_OnUnload handle =0xc63afa9d 4003 4021 Ezygote :[pxy][---1---FindCodeForNativeMethod GetState= Runnable"] native_method = 0x0 4003 4021 Ezygote : [pxy][---2--FindCodeForNativeMethodGetState= Runnable"] native_method= 0x0 4003 4021 Ezygote : [pxy]--agent--FindCodeForNativeMethodInAgents agent = NULL!!!!!! 4003 4021 Ezygote :[pxy]--agent--FindCodeForNativeMethodInAgents agent1 = Agent { name="", args="", handle=0xb0723180} agent2 = Agent { name="", args="", handle=0xb0723180 }agent_size = 0 4003 4021 Ezygote :[pxy][---3---FindCodeForNativeMethod GetState= Runnable"] native_method = 0x0 4003 4021 Ezygote :[pxy][---4---FindCodeForNativeMethod GetState= Runnable"] native_method = 0x0 4003 4021 Ezygote : [pxy]No implementation found for voidart.Main.setTag(java.lang.Object, long) (tried Java_art_Main_setTag andJava_art_Main_setTag__Ljava_lang_Object_2J) 4003 4021 ITestRunner: failed: testTagging(android.jvmti.cts.JvmtiTaggingTest) |
从上面复测结果可以看出,dlopen有正常打开返回libctsjvmtiagent.so地址,但是在调用FindCodeForNativeMethodInAgents 函数时发现没有调用FindSymbol函数查找art.Main.setTag函数,原因是agent list为空。所以找不到对应的lib和handle信息,直接返回空。同时发现这里查找Agent_OnAttach符号和查找art.Main.setTag不是同一个线程执行。这里有多线程的问题么?继续分析,代码如下:
这里是Runtime::Current()->GetAgents()为空即agents |