Android系统中 File.listFiles()导致jni crash

最近换工作接手新项目,着手调查一个jni crash问题。

crash log信息相当明显:

Revision: '0'

ABI: 'arm64'

pid: 5921, tid: 9804, name: Background  >>> com.example.text <<<

signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------

Abort message: 'java_vm_ext.cc:534] JNI DETECTED ERROR IN APPLICATION: input is not valid Modified UTF-8: illegal continuation byte 0xcd'

x0 0000000000000000 x1 000000000000264c x2 0000000000000006 x3 0000000000000008

.....

从这里一看,我们就大概明白和编码有关了 因为出现了关键字 input is not valid Modified UTF-8:

继续查看aplog:

08-31 18:34:27.172 5921 9804 F zygote64: java_vm_ext.cc:534] JNI DETECTED ERROR IN APPLICATION: input is not valid Modified UTF-8: illegal continuation byte 0xcd

08-31 18:34:27.172  5921  9804 F zygote64: java_vm_ext.cc:534]    string: '(3эhi_resource'

08-31 18:34:27.172  5921  9804 F zygote64: java_vm_ext.cc:534]    input: '0x28 0x33 0xd0 <0xcd> 0x68 0x69 0x5f 0x72 0x65 0x73 0x6f 0x75 0x72 0x63 0x65'

08-31 18:34:27.172  5921  9804 F zygote64: java_vm_ext.cc:534]    in call to NewStringUTF

08-31 18:34:27.172  5921  9804 F zygote64: java_vm_ext.cc:534]    from java.lang.String[] java.io.UnixFileSystem.list0(java.io.File)

08-31 18:34:27.172  5921  9804 F zygote64: java_vm_ext.cc:534] "Background" prio=5 tid=29 Runnable

08-31 18:34:27.172  5921  9804 F zygote64: java_vm_ext.cc:534]  | group="main" sCount=0 dsCount=0 flags=0 obj=0x12d0ac40 self=0x70ff676400

08-31 18:34:27.172  5921  9804 F zygote64: java_vm_ext.cc:534]  | sysTid=9804 nice=0 cgrp=default sched=0/0 handle=0x70ff5ff4f0

08-31 18:34:27.172  5921  9804 F zygote64: java_vm_ext.cc:534]  | state=R schedstat=( 63854 0 1 ) utm=0 stm=0 core=6 HZ=100

08-31 18:34:27.172  5921  9804 F zygote64: java_vm_ext.cc:534]  | stack=0x70ff4fd000-0x70ff4ff000 stackSize=1037KB

08-31 18:34:27.172  5921  9804 F zygote64: java_vm_ext.cc:534]  | held mutexes= "mutator lock"(shared held)

08-31 18:34:27.172  5921  9804 F zygote64: java_vm_ext.cc:534]  native: #00 pc 00000000003cad9c  /system/lib64/libart.so (art::DumpNativeStack(std::__1::basic_ostream<char, std::__1::char_traits<char>>&, int, BacktraceMap*, char const*, art::ArtMethod*, void*)+208)

08-31 18:34:27.172  5921  9804 F zygote64: java_vm_ext.cc:534]  native: #01 pc 000000000049b124  /system/lib64/libart.so (art::Thread::DumpStack(std::__1::basic_ostream<char, std::__1::char_traits<char>>&, bool, BacktraceMap*, bool) const+348)

08-31 18:34:27.172  5921  9804 F zygote64: java_vm_ext.cc:534]  native: #02 pc 00000000002fd7dc  /system/lib64/libart.so (art::JavaVMExt::JniAbort(char const*, char const*)+1048)

08-31 18:34:27.172  5921  9804 F zygote64: java_vm_ext.cc:534]  native: #03 pc 00000000002fdbcc  /system/lib64/libart.so (art::JavaVMExt::JniAbortV(char const*, char const*, std::__va_list)+116)

08-31 18:34:27.172  5921  9804 F zygote64: java_vm_ext.cc:534]  native: #04 pc 000000000010e764  /system/lib64/libart.so (art::ScopedCheck::AbortF(char const*, ...)+148)

08-31 18:34:27.172  5921  9804 F zygote64: java_vm_ext.cc:534]  native: #05 pc 000000000010ec3c  /system/lib64/libart.so (art::ScopedCheck::CheckUtfString(char const*, bool)+736)

08-31 18:34:27.172  5921  9804 F zygote64: java_vm_ext.cc:534]  native: #06 pc 000000000010c764  /system/lib64/libart.so (art::ScopedCheck::Check(art::ScopedObjectAccess&, bool, char const*, art::JniValueType*)+644)

08-31 18:34:27.172  5921  9804 F zygote64: java_vm_ext.cc:534]  native: #07 pc 0000000000102ec4  /system/lib64/libart.so (art::CheckJNI::NewStringUTF(_JNIEnv*, char const*)+636)

08-31 18:34:27.172  5921  9804 F zygote64: java_vm_ext.cc:534]  native: #08 pc 0000000000020c90  /system/lib64/libopenjdk.so (Java_java_io_UnixFileSystem_list0+456)

08-31 18:34:27.172  5921  9804 F zygote64: java_vm_ext.cc:534]  native: #09 pc 000000000006f958  /system/framework/arm64/boot-core-oj.oat (Java_java_io_UnixFileSystem_list0__Ljava_io_File_2+152)

08-31 18:34:27.172  5921  9804 F zygote64: java_vm_ext.cc:534]  at java.io.UnixFileSystem.list0(Native method)

08-31 18:34:27.172  5921  9804 F zygote64: java_vm_ext.cc:534]  at java.io.UnixFileSystem.list(UnixFileSystem.java:313)

08-31 18:34:27.172  5921  9804 F zygote64: java_vm_ext.cc:534]  at java.io.File.list(File.java:1122)

08-31 18:34:27.172  5921  9804 F zygote64: java_vm_ext.cc:534]  at java.io.File.listFiles(File.java:1248)


我们发现log 中还是给出了足够的信息

我们代码在调用NewStringUTF()的时候发生了crash,原因是utf-8编码有问题,继续查看 log:

08-31 18:34:27.172  5921  9804 F zygote64: java_vm_ext.cc:534]    string: '(????hi_resource'

这里是关键。明显看的出这里有问题。

继续查看log 发现 有File相关信息出现。发现是有File调用下去的

继续在我们的业务代码中查找与File相关的代码。发现listFile().

从代码业务分析,我们的代码关键地方是File.listFile().

public void FileTest(){

FilenameFilter filter =new FilenameFilter() {

@Override

        public boolean accept(File dir, String name) {

         return name.endsWith(".txt");

        }

  };

     File file =new File("xx");

     file.listFiles(filter);

}

至此怀疑到问题发生点,我们验证一下。

既然crash发生是与utf-8编码有关,那我们就制造一个非utf-8命名的文件,制造方法非常简单,直接新建一个txt文件,然后另存为其他文件,保存时候为中文名字,非utf-8编码,然后push到手机,在adb下查看该文件,发现文件名已经有问题

然后跑业务代码, crash概率100%。

然后我们继续正向分析file.listfiles().

调查过程非常简单 

file.listfiles() -> list() ->    UnixFileSystem.list() -> list0() -> UnixFileSystem_md.c.Java_java_io_UnixFileSystem_list0() ->jni_util.c.JNU_NewStringPlatform() ->jni_util_md.c.nativeNewStringPlatform() -> NewStringUTF().

继续利用addr2line反编译libart.so  


查看Android源代码:check_jni.cc 2251


check_jni.cc 1276 行


ok,找到关键文件,正是这里抛出jni异常。AbortF().

至此我们断定crash 从这里抛出。

问题发生原因:

调用file标准接口的时候,有listFliles()发现目录下有非utf-8编码的文件名,导致jni crash。

修改方案:在AndroidManifest.xml 中添加 android:debbuggabel="false"

修改原因:这里我也不知道了, Stackoverflow 中查到的,别问我为什么,我也不知道

 猜测是Android设置了debbuggabel后,应该在调用newStringUTF()的时候清楚了异常,所以没有这个crash上报了。


更多关于android utf-8知识看这篇blog,写的还是相当不错的

https://blog.csdn.net/self_study/article/details/78886686

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容

  • 之前大家一直有推荐简书,说这个软件不错。但是由于时间精力的有限一直没有开始使用。今天在开192期20组小组会议的时...
    八阿哥STAR阅读 142评论 0 0
  • 蓝天白云地, 黄土生红粉。 风吹柳荡起, 桑上又新虫。 看一个地,有人以“三月”为题,作诗赛稿,看不顺眼,便自己来...
    远晓阅读 322评论 7 3
  • 绿杨烟里的旧梦 在小河里流淌 青荇柔软的双手于水底招摇 游鱼在人群的目光中机警潜逃 金黄的油菜花田 笑着你最纯真的...
    大疯收阅读 115评论 0 1