利用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)
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,779評論 18 399
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,993評論 19 139
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結起來就是把...
    Dove_iOS閱讀 27,217評論 30 472
  • 2月30日星期一晴 今天一天都沒有出太陽,真不好,爸爸買回兩條金魚,養在水缸淹死一條,我很傷心。 老師評語:我也很...
    EricChan閱讀 295評論 0 2
  • 從小愛餃子這口兒。兒時對餃子癡念再多也是只有過年時解解饞。那時候緊忙活兒著幫忙,搟皮兒,拌餡兒,等不及第二天吃,父...
    歲月奈我何閱讀 946評論 0 0