利用new Exception().getStackTrace()查看谁调用了方法

过时的方法
使用 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)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 33,775评论 18 399
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,282评论 19 139
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,492评论 30 472
  • 2月30日星期一晴 今天一天都没有出太阳,真不好,爸爸买回两条金鱼,养在水缸淹死一条,我很伤心。 老师评语:我也很...
    EricChan阅读 2,241评论 0 2
  • 从小爱饺子这口儿。儿时对饺子痴念再多也是只有过年时解解馋。那时候紧忙活儿着帮忙,擀皮儿,拌馅儿,等不及第二天吃,父...
    岁月奈我何阅读 4,533评论 0 0

友情链接更多精彩内容