2013-1-10 14:25:42

 


2013-1-10 14:25:42

调用栈的问题

 at android.os.Handler.dispatchMessage(Handler.java:99)
 at android.os.Looper.loop(Looper.java:137)
 at android.app.ActivityThread.main(ActivityThread.java:4427)
 at java.lang.reflect.Method.invokeNative(Native Method)
 at java.lang.reflect.Method.invoke(Method.java:511)
 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:825)
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:592)
 at dalvik.system.NativeStart.main(Native Method)
 
 
 第一个栈
dalvik.system.NativeStart.main(Native Method)

这是一个伪造的native栈

其他线程的这些也属于伪造。
at dalvik.system.NativeStart.run(Native Method)

然后走ZygoteInit

异常捕获

字节码这一级是如何处理的?

 

    public static void test2(String[] sa) {
        // In this test, the code being try-caught doesn't contain any
        // constant pool references.
        try {
            int x = sa.length;
        } catch (RuntimeException ex) {
            caught();
        }
    }
   
   
Blort.test2:([Ljava/lang/String;)V:
regs: 0004; ins: 0001; outs: 0000
  0000: move-object v0, v3
  0001: move-object v2, v0
  0002: array-length v2, v2
  0003: move v1, v2
  0004: return-void
  0005: move-exception v2
  0006: move-object v1, v2
  0007: invoke-static {}, Blort.caught:()V
  000a: goto 0004 // -0006
  catches
    tries:
      try 0002..0003
      catch java.lang.RuntimeException -> 0005
     
     
     
      是interpreter 的抛异常
     
1 首先检查suspend 状态

dvmCheckSuspendPending
检查一下当前线程是否有没有来得及处理的suspend 请求,

如果本线程确实需要suspend 就再事件上等待。

取Thread 中的exception对象

为了保证该对象不会被GC 掉

将其加入线程相关的内部使用的本地引用表

当期的子模式是什么


在方法内部查找捕获块

dvmComputeExactFrameDepth

将栈的深度都计算出来了,break frame 不计算在内

在DexCode 后面有 DexTry

dvmFindCatchBlock

找到以后返回的是相对PC

在处理函数中实际上就是创建一个异常对象

所以异常捕获 也就是用一个单独的结构用来描述try catch 信息,

当指令抛了异常之后用DexTry来进行匹配.

你可能感兴趣的:(2013-1-10 14:25:42)