TraceView issue
使用traceview时,遇到一个这样的问题:
Exception in thread "main" java.lang.RuntimeException: Method exit (android/widget/AbsListView.startScrollIfNeeded (I)Z) does not match current method (java/lang/Math.abs (I)I)
这个是google自己bug,貌似出现在android4.0-4.2之间,主要是在mips架构里面发现的,不过现在的最新版本已修复此bug。
如果不幸拿到的android源码还存在这个bug,需要自己修复。
traceiew的工作原理是跟踪函数的调用路径,然后计算整条调用路径或者单个函数的执行时间,进而测试系统或者应用程序的性能。实际上,traceiew只是在pc端运行的一个工具,它用来解析目标设备上生成的.trace文件。所以,traceview本身没有问题,只是目标设备上生成的.trace文件有问题。目标设备上是使用profile生成.trace文件的。profile把函数的进入(entry)和退出(exit)都记录在.trace文件中,记录的存储方式是按照栈(stack)的方式,所以traceiew解析.trace文件时也需要用栈的方式。
现在出现错误的原因是函数的进入(entry)和退出(exit)不配对,也就是说有些函数的进入或者退出没有被记录下来。这就需要跟踪.trace文件是如何生成的。
详细的过程就不螯述了,这里只说一下跟踪的路径吧,有兴趣的朋友可以看下。经过的文件有:
frameworks/base/cmds/am/src/com/android/commands/am/Am.java
frameworks/base/services/java/com/android/server/am/ActivityManagerService.java
frameworks/base/core/java/android/app/ActivityThread.java
frameworks/base/core/java/android/os/Debug.java
libcore/dalvik/src/main/java/dalvik/system/VMDebug.java
dalvik/vm/native/dalvik_system_VMDebug.cpp
dalvik/vm/Profile.cpp
.trace最主要的生成过程是在dalvik/vm/Profile.cpp中,后来发现最可能出错的地方是,其中只有一个记录函数进入的地方,然而却有两个记录退出的地方。所以有可能是退出时使用了错误的函数。
记录进入的函数:
dvmFastMethodTraceEnter
记录退出的两个函数:
dvmFastNativeMethodTraceExit
dvmFastMethodTraceExit
这些函数是在汇编代码里边调用的,涉及到汇编代码就是架构相关了。android支持的架构有ARM,MIPS和X86。既然是在MIPS发现了这个问题,所以就看MIPS架构相关的代码,后来发现在:
dalvik/vm/mterp/mips/OP_EXECUTE_INLINE.S
dalvik/vm/mterp/mips/OP_EXECUTE_INLINE_RANGE.S
dalvik/vm/mterp/out/InterpAsm-mips.S
这三个文件里面都调用了上面的函数。第三个文件是由很多.S文件(包括第一和第二个文件)生成的,可以忽视。所以调查前两个文件。
OP_EXECUTE_INLINE.S里调用的代码片段:
.L${opcode}_debugmode:move a0, rBIXJAL(dvmResolveInlineNative)beqz v0, .L${opcode}_resume # did it resolve? no, just move onmove rOBJ, v0 # remember methodmove a0, v0move a1, rSELFJAL(dvmFastMethodTraceEnter) # (method, self)addu a1, rSELF, offThread_retval # a1<- &self->retvalGET_OPB(a0) # a0 <- B# Stack should have 16/20 availablesw a1, 16(sp) # push &self->retvalBAL(.L${opcode}_continue) # make call; will return afterlw gp, STACK_OFFSET_GP(sp) # restore gpmove rINST, v0 # save result of inlinemove a0, rOBJ # a0<- methodmove a1, rSELF # a1<- selfJAL(dvmFastMethodTraceExit) # (method, self)beqz v0, common_exceptionThrown # returned false, handle exceptionFETCH_ADVANCE_INST(3) # advance rPC, load rINSTGET_INST_OPCODE(t0) # extract opcode from rINSTGOTO_OPCODE(t0) # jump to next instruction
OP_EXECUTE_INLINE_RANGE.S里面的调用片段:
/** We're debugging or profiling.* rBIX: opIndex*/
.L${opcode}_debugmode:move a0, rBIXJAL(dvmResolveInlineNative)beqz v0, .L${opcode}_resume # did it resolve? no, just move onmove rOBJ, v0 # remember methodmove a0, v0move a1, rSELFJAL(dvmFastMethodTraceEnter) # (method, self)addu a1, rSELF, offThread_retval # a1<- &self->retvalGET_OPA(a0) # a0 <- A# Stack should have 16/20 availablesw a1, 16(sp) # push &self->retvalmove rINST, rOBJ # rINST<- methodBAL(.L${opcode}_continue) # make call; will return afterlw gp, STACK_OFFSET_GP(sp) # restore gpmove rOBJ, v0 # save result of inlinemove a0, rINST # a0<- methodmove a1, rSELF # a1<- selfJAL(dvmFastNativeMethodTraceExit) # (method, self)beqz rOBJ, common_exceptionThrown # returned false, handle exceptionFETCH_ADVANCE_INST(3) # advance rPC, load rINSTGET_INST_OPCODE(t0) # extract opcode from rINSTGOTO_OPCODE(t0) # jump to next instruction
其中,OP_EXECUTE_INLINE.S调用的组合是:
dvmFastMethodTraceEnter
dvmFastMethodTraceExit
OP_EXECUTE_INLINE_RANGE.S调用的组合是:
dvmFastMethodTraceEnter
dvmFastNativeMethodTraceExit
但是,我发现OP_EXECUTE_INLINE.S里面的调用是不符合逻辑的。
请看:
move a0, rOBJ # a0<- methodmove a1, rSELF # a1<- selfJAL(dvmFastMethodTraceExit) # (method, self)
这段代码,程序准备了a0 和a1两个参数,但是回头看看dvmFastMethodTraceExit和dvmFastNativeMethodTraceExit的函数原型:
void dvmFastMethodTraceExit(Thread* self)
void dvmFastNativeMethodTraceExit(const Method* method, Thread* self)
很明显,dvmFastMethodTraceExit只有一个参数,所以没必要准备两个参数。所以,这段代码的编写者原意应该是想要调用dvmFastNativeMethodTraceExit的。把OP_EXECUTE_INLINE.S里面的dvmFastMethodTraceExit换成dvmFastNativeMethodTraceExit,执行dalvik/vm/mterp/rebuild.sh重新生成dalvik/vm/mterp/out/InterpAsm-mips.S,然后重编dalvik,启动运行,生成.trace文件,traceiew解析,成功了!
TraceView issue相关推荐
- Android 系统性能优化(47)---Traceview
前言 TraceView 是什么 生成 trace 文件 使用代码生成 trace 文件 使用 Android Studio 生成 trace 文件 使用 DDMS 生成 trace 文件 根据 Tr ...
- 12C expdp issue
issue 1: 使用expdp时遭遇ora-31650 D:\oracle\diag\rdbms \trace>expdp \"/ as sysdba\" schemas ...
- Gitlab Issue Tracker and Wiki(一)
本节内容: 创建第一个问题 创建第一个合并请求 接受合并请求 工作里程碑 在提交中引用问题 创建维基百科页 使用Gollum管理维基百科 一. 创建问题 1. 登陆Gitlab服务器 2. 切换到想要 ...
- The Innovation | Volume 3 Issue 1 正式出版
Volume 3 Issue 1 2022年1月25日 The Innovation 第三卷第一期正式出版 On the Cover: Vivid life is everywhere in this ...
- The Innovation | Volume 2 Issue 4 正式出版
Volume 2 Issue 4 2021年11月28日 The Innovation 第二卷第四期正式出版 On the Cover: Nourished by the gigantic data ...
- The Innovation | Volume 2 Issue 2 正式出版
Volume 2 Issue 2 2021年05月28日 The Innovation 第二卷第二期正式出版 封面解读 Earth, our home, covered by 70% water an ...
- traceview android studio,TraceView 的正确打开方式
引言 TraceView 是 Android SDK 提供的一个性能分析工具官网介绍 ,一般用来检查 UI 卡顿.分析 app 耗时操作.但是对于大多说 Android 开发来说,TraceView ...
- 为什么我还没 Fix 你的 Issue
本文讲的是为什么我还没 Fix 你的 Issue, 原文地址:Why I Haven't Fixed Your Issue Yet 原文作者:Michael Bromley 译文出自:掘金翻译计划 本 ...
- /etc/issue、shutdown练习
1.字符终端登录时,显示当前终端,主机名和当前时间: ①vim /etc/issue ②添加以下三行 the termical is \l the hostname is \n the times i ...
- 使用代码将github仓库里某个issue同步到CSDN博客上
2019独角兽企业重金招聘Python工程师标准>>> 我是一个懒惰的程序员.我在github仓库里用issue的方式写了很多分享文章,想同步到CSDN上.但是我又不想一篇篇手动复制 ...
最新文章
- 正则数字和小数点_Python中的正则表达式【不断补充~】
- mysql语句大全 新浪博客_MySQL语句入门
- rsync 端口更换(默认873)
- Python的基础语法(二)
- php sqlserver开发实例,Linux_用sql脚本创建sqlserver数据库范例语句,下面是创建一个sqlserver数据库 - phpStudy...
- 实现编辑功能有哪几个action_Web 应用的撤销重做实现
- 带你深入浅出的分析 HashTable 源码
- kex_exchange_identification: Connection closed by remote host Connection closed by 140.82.121.3 port
- 【Matlab】离散点拟合曲面
- 程序员需要了解依赖冲突的原因以及解决方案
- 四 Lync Server 2013 部署指南-前端部署(2)
- Vue2.0+组件库总结
- 如何处理四级标题、五级标题及其对应的样式?
- 使用Python进行网站页面开发——Django快速入门
- 计算机的数字符号化是什么,电脑输入数字变成符号怎么办
- delphi调试需要管理员权限程序报错“Unable to create process:请求的操作需要提升”
- sharelist+RaiDriver将阿里云盘映射到本地磁盘
- 高博课程编程作业之计算小萝卜的坐标
- 决定重新安装windows2016datacenter 系统。原先的俄罗斯版没虚拟机功能
- 微信小程序开发记录2——获取openid失败