利用new Exception().getStackTrace(

作者: pdog18 | 来源:发表于2017-08-09 17:58 被阅读44次

    过时的方法
    使用 AS debug模式可以很轻易的获得调用栈

    最近项目中遇到一个Bug ,在某次进行数据持久化的时候,对于同一个key的数据存储。
    在某次执行持久化时,将一个valuenull的值覆盖上去了,但是项目中有非常多的地方对这个key进行了持久化存储。
    才开始以为是异步的问题,所以先将存储方式改为同步后发现错误依然存在。
    如果要一个一个排查的话那么将会花费大量的精力。
    那么能不能在数据持久化的入口中查看到底是哪个方法调用的时候覆盖了不正确的值呢?

    这时想起来KLoglog工具类实现自动添加类名,方法名的一个挺巧妙的办法。

    通过new Exception().getStackTrace();可以获得方法的调用栈的数组,那么就可以在持久化的入口处获得传入不正确值的方法调用栈了。

    //代码大致如下
    StackTraceElement[] stackTrace = new Exception().getStackTrace();
            for (int i = 0; i < stackTrace.length; i++) {
                System.out.println("key = " + stackTrace[i]);
            }
    

    当然代码中的层级数i < stackTrace.length 你可以同时再加个判断i < stackTrace.length && i <5 ,不然的话日志就会一直打印到Android进程的入口即ZygoteInit.main()
    就像这样

    
    //...上层代码忽略
    android.os.Handler.handleCallback(Handler.java:815)
    android.os.Handler.dispatchMessage(Handler.java:104)
    android.os.Looper.loop(Looper.java:207)
    android.app.ActivityThread.main(ActivityThread.java:5896)
    java.lang.reflect.Method.invoke(Native Method)
    com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:948)
    com.android.internal.os.ZygoteInit.main(ZygoteInit.java:809)
    

    相关文章

      网友评论

        本文标题:利用new Exception().getStackTrace(

        本文链接:https://www.haomeiwen.com/subject/dbjqrxtx.html