畢業時寫了一段時間的C,那時候調試使用gdb,后來轉了java,當時就想java程序怎么調試,找了一下,果然,那就是jdk自帶的jdb
windows里是這樣的
Linux下是這樣的
一般我在linux下來調試Java程序
好,那么,問題來了,這玩意怎么用?有好幾種玩法
第一種玩法:以經典的HelloWorld為例,先寫一個Java程序,如下:
我們把編譯好的類上傳到linux下,如下所示
務必強調一下:類所在的包名的層次結構也要在linux下體現出來
下面我們來玩起來,在linux下操作如下
程序順利debug,每次都輸出當前的位置,就是line=5 這樣的,也可以使用where來查看當前的線程棧,如下所示
好,到這里,入門完成,讀者可能一臉懵逼,debug過程中沒法看到源碼啊,這是因為我們只有class,沒有java文件
下面我們把java文件上傳上來,可以上傳到任何一個目錄,只要后面正確指定就行了,創建一個文件夾
然后按照層次結構把源碼上傳上來
讓我們重新組織下jdb的命令如下
開心嗎?簡單的debug就可以進行了
有的同學說我有很多jar,不是類,這也是可以的,自己多嘗試一下,沒有問題,碰到問題百度下
上面是通過jdb來啟動一個程序,也有一種情況是程序在linux上跑得好好的,我想去調試的時候去調試,不想調試的時候讓它自己運行不去打擾它
以我最近調試的flink為例,ps -ef一把看一下
程序啟動的命令行里加上這些參數,然后怎么使用呢?在你想要去debug它的時候,使用下面的命令
這個時候,jdb已經跟目標進程建立了關系,因為斷點還沒有觸發,所以我們什么都看不到,我們嘗試來發送一條消息到kafka來觸發這個斷點的hit
順利命中,這里沒有源碼出現,是因為我沒有放源碼,我是在本地eclipse里打開java代碼對比着看,讀者也可以上傳到linux下來玩,方法上面已經說過了
執行一把where看詳細的當前位置
時刻提醒你是誰,你在哪,你在干什么,別迷失了方向,迷茫的時候就執行一把where就會找到新的方向
這種方式不用指定class在哪,因為我們是連接到進程來實現debug,進程都起來了,也不用擔心class的識別了
好,簡單的debug其實已經可以了,下面講一下jdb的命令有哪些
傳送門:https://blog.csdn.net/xiaodejun5241/article/details/8162923
讀者可以在實踐中來掌握這些命令的使用
當你把所有源碼都debug完一遍的時候,相信我,你的巔峰之路就開始了!