過時的方法
使用 AS debug模式可以很輕易的獲得調用棧
最近項目中遇到一個Bug
,在某次進行數據持久化的時候,對于同一個key
的數據存儲。
在某次執行持久化時,將一個value
為null
的值覆蓋上去了,但是項目中有非常多的地方對這個key
進行了持久化存儲。
才開始以為是異步的問題,所以先將存儲方式改為同步后發現錯誤依然存在。
如果要一個一個排查的話那么將會花費大量的精力。
那么能不能在數據持久化的入口中查看到底是哪個方法調用的時候覆蓋了不正確的值呢?
這時想起來KLog
等log
工具類實現自動添加類名,方法名的一個挺巧妙的辦法。
通過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)