過時的方法
使用 AS debug模式可以很輕易的獲得調用棧
最近項目中遇到一個Bug
海雪,在某次進行數(shù)據(jù)持久化的時候趟咆,對于同一個key
的數(shù)據(jù)存儲。
在某次執(zhí)行持久化時鹅髓,將一個value
為null
的值覆蓋上去了拗慨,但是項目中有非常多的地方對這個key
進行了持久化存儲廓八。
才開始以為是異步的問題,所以先將存儲方式改為同步后發(fā)現(xiàn)錯誤依然存在胆描。
如果要一個一個排查的話那么將會花費大量的精力瘫想。
那么能不能在數(shù)據(jù)持久化的入口中查看到底是哪個方法調用的時候覆蓋了不正確的值呢?
這時想起來KLog
等log
工具類實現(xiàn)自動添加類名昌讲,方法名的一個挺巧妙的辦法。
通過new Exception().getStackTrace();
可以獲得方法的調用棧的數(shù)組减噪,那么就可以在持久化的入口處獲得傳入不正確值的方法調用棧了短绸。
//代碼大致如下
StackTraceElement[] stackTrace = new Exception().getStackTrace();
for (int i = 0; i < stackTrace.length; i++) {
System.out.println("key = " + stackTrace[i]);
}
當然代碼中的層級數(shù)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)