【多线程问题】android8.1 cts测试原生bug多线程导致CtsJvmtiRedefineClassesHostTestCases中,testJvmti Fail

本文详细介绍了在Android 8.1版本中,CTS测试CtsJvmtiRedefineClassesHostTestCases时遇到的一个多线程问题,导致testJvmti失败。问题根源在于dlsym查找setTag函数时返回NULL,由于多线程环境下,主线程与子线程间的同步问题,导致在agents_未被正确赋值时,子线程尝试访问,从而引发崩溃。通过日志分析,定位到问题在于DoLoadHelper函数执行不完整,且线程调度导致的并发问题。解决方案是引入同步保护措施,并已向Google报告该问题。
摘要由CSDN通过智能技术生成

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值