雖然我們不喜歡bug,但是bug永遠都存在。
雖然我們牛逼,但是仍然有不知道的東西,解決不了的問題。
so,還得借助工具,讓咱效率提起來扛扛的。
解決的問題如是:由於某種原因,其他系統發送的mq,我這邊說沒收到,他那邊說發了。然后,一愁不展,咋辦呢?好吧,肯定是抓包確認問題咯。嘿,這不是本文的重點,請自行腦補抓包。

從對方系統的mq記錄里,取出消息體,放到mq后台,直接發送到消費服務器。模擬發送情況,然后就遇到報錯了,苦思不得結果后,只能使用終級絕招,就用本機來代替debug吧。
本地服務起來之后,同樣,mq后台發送消息。不出意外地,和測試服務器上報了不一樣的錯。這就尷尬了。和測試環境不一樣,咋整呢?
不怕,咱一步步來。按照堆棧指示的代碼行,很快定位了有問題的代碼。原因為某個jar包中的值報了空指針異常。咋整呢,咱們的本機環境不像測試環境呢。
解決辦法1:將本機模擬成測試環境一樣的情況,太難,至少linux和windows環境就是不一樣的。
方法2:想辦法讓這個變量的變得和測試環境一樣。也許可行。
方法3:想辦法跳過報錯的代碼,使其繼續后面的程序,存在2個問題,1是程序做不到跳過不執行功能,2是跳過執行后后續可能使用這里的值,會導致其他錯誤。故此,只有改變變量值一法了。
案例1:改變一個基本類型變量的值
直接setvalue即可。
public static void main(String[] args) { String var1 = "var1"; int i = 1; System.out.println("var1:" + var1); // 輸出 var1:changed }


案例2:改變一個hashmap變量的值
hashmap是個復雜類型,不能直接設置值。需要使用 add to watches功能。
public static void main(String[] args) { Map<String, Object> map = new HashMap<>(); int i = 2; System.out.println("map:" + map); // 輸出 map:{name:hello} }



案例3:改變一個實體對象值
可以使用set value 方式直接改變值,也可以使用add to watches操作代碼來設置 。 總之你想要都能給你變出來。
public static void main(String[] args) { UserInfo info = new UserInfo(); int i = 3; System.out.println("info:" + info); //輸出info:UserInfo{id='123', name='null', sex='null', age=null, address='golden street'} }


報的錯是找不到某個處理方法,但是實際上我自認為已經寫了某個方法。那么到底怎么回事呢。
第一次跟蹤,到某一行后,退出了程序。debug往下調整。進入方法再進行單步調試。再次發現某一次代碼退出。最后定位到反射調用的這一行。原因是之時的入參類型,與現有入參類型不一致。再往前分析,是因為在調用轉換器的時候,並沒有進行相應的轉換,而是以原來的二進制格式返回了。分析程序,知道里面某參數需要包含某值,轉換器才會起作用。對症下葯,給他這個參數,果然進入到了轉換流程。然而,進入后又轉換成另一個不可預料的參數了,沒辦法,getmapper方法不好模擬出來,還是算了,直接模擬轉換結果吧,add to watch,改變值。這下,終於進入方法了,代碼不再報錯。測試通過了。
弄清原理之后,解決就簡單了!如果對方沒有設置某屬性值,讓其設置就ok了。如果一定要以某結構參數進行接收處理,那變寫一個對應的處理方法即可。小case。
debug,單步調試,進入,退出,計算變量值,推測執行是debug基礎,必備。
debug, 讓問題變得簡單!
