使用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相关推荐

  1. Android 系统性能优化(47)---Traceview

    前言 TraceView 是什么 生成 trace 文件 使用代码生成 trace 文件 使用 Android Studio 生成 trace 文件 使用 DDMS 生成 trace 文件 根据 Tr ...

  2. 12C expdp issue

    issue 1: 使用expdp时遭遇ora-31650 D:\oracle\diag\rdbms \trace>expdp \"/ as sysdba\"  schemas ...

  3. Gitlab Issue Tracker and Wiki(一)

    本节内容: 创建第一个问题 创建第一个合并请求 接受合并请求 工作里程碑 在提交中引用问题 创建维基百科页 使用Gollum管理维基百科 一. 创建问题 1. 登陆Gitlab服务器 2. 切换到想要 ...

  4. The Innovation | Volume 3 Issue 1 正式出版

    Volume 3 Issue 1 2022年1月25日 The Innovation 第三卷第一期正式出版 On the Cover: Vivid life is everywhere in this ...

  5. The Innovation | Volume 2 Issue 4 正式出版

    Volume 2 Issue 4 2021年11月28日 The Innovation 第二卷第四期正式出版 On the Cover: Nourished by the gigantic data ...

  6. The Innovation | Volume 2 Issue 2 正式出版

    Volume 2 Issue 2 2021年05月28日 The Innovation 第二卷第二期正式出版 封面解读 Earth, our home, covered by 70% water an ...

  7. traceview android studio,TraceView 的正确打开方式

    引言 TraceView 是 Android SDK 提供的一个性能分析工具官网介绍 ,一般用来检查 UI 卡顿.分析 app 耗时操作.但是对于大多说 Android 开发来说,TraceView ...

  8. 为什么我还没 Fix 你的 Issue

    本文讲的是为什么我还没 Fix 你的 Issue, 原文地址:Why I Haven't Fixed Your Issue Yet 原文作者:Michael Bromley 译文出自:掘金翻译计划 本 ...

  9. /etc/issue、shutdown练习

    1.字符终端登录时,显示当前终端,主机名和当前时间: ①vim /etc/issue ②添加以下三行 the termical is \l the hostname is \n the times i ...

  10. 使用代码将github仓库里某个issue同步到CSDN博客上

    2019独角兽企业重金招聘Python工程师标准>>> 我是一个懒惰的程序员.我在github仓库里用issue的方式写了很多分享文章,想同步到CSDN上.但是我又不想一篇篇手动复制 ...

最新文章

  1. 正则数字和小数点_Python中的正则表达式【不断补充~】
  2. mysql语句大全 新浪博客_MySQL语句入门
  3. rsync 端口更换(默认873)
  4. Python的基础语法(二)
  5. php sqlserver开发实例,Linux_用sql脚本创建sqlserver数据库范例语句,下面是创建一个sqlserver数据库 - phpStudy...
  6. 实现编辑功能有哪几个action_Web 应用的撤销重做实现
  7. 带你深入浅出的分析 HashTable 源码
  8. kex_exchange_identification: Connection closed by remote host Connection closed by 140.82.121.3 port
  9. 【Matlab】离散点拟合曲面
  10. 程序员需要了解依赖冲突的原因以及解决方案
  11. 四 Lync Server 2013 部署指南-前端部署(2)
  12. Vue2.0+组件库总结
  13. 如何处理四级标题、五级标题及其对应的样式?
  14. 使用Python进行网站页面开发——Django快速入门
  15. 计算机的数字符号化是什么,电脑输入数字变成符号怎么办
  16. delphi调试需要管理员权限程序报错“Unable to create process:请求的操作需要提升”
  17. sharelist+RaiDriver将阿里云盘映射到本地磁盘
  18. 高博课程编程作业之计算小萝卜的坐标
  19. 决定重新安装windows2016datacenter 系统。原先的俄罗斯版没虚拟机功能
  20. 微信小程序开发记录2——获取openid失败

热门文章

  1. 论文中的Matlab画图常用技巧
  2. 关于尚硅谷视频p135配置完yarn-site.xml的硬件资源配置后
  3. [华为19实习面试]语言能力优秀的我,是怎么拿下勇敢星实习offer的?华为硬件类面试经历经验分享(大三已拿offer)
  4. 蒙特卡洛模拟方法的matlab实现
  5. MATLAB几何均值滤波
  6. 电赛机器视觉——激光点定位
  7. TMDB 5000电影数据集
  8. 24种设计模式-生成器模式
  9. python生成器详解
  10. log4j配置详解(非常详细)