在線應用雲調試係統--Zdebugger
該文章來自於阿裏巴巴技術協會(ATA)精選文章。
緣起
早在今年(2014)的JavaOne大會上來自google的speaker---Ludovic Champenois提到了他們的一個新產品cloud debugger,主要是用來調試部署在他們雲端的應用的,但是會上並沒有透露太多的細節。當我們第一次聽說這種調試係統居然是一個web實現時還是覺得挺不可思議的,說到調試我們一般想到的是Eclipse,Idea等IDE,但是仔細想想隨著現在雲概念的不斷普及應用,出現這類係統也是一種必然。即使我們拋開雲概念不說,就我們現實中的情況來看,當我們線上的係統出現一些問題的時候,又擔心重啟之後問題無法重現,作為程序員的你或許並沒有第一時間想到進行線程dump,內存dump,然後使用我們的性能分析工具zprofiler進行分析,而是想要是可以使用eclipse直接連上去調試下就好了,哪怕隻要能看看某個屬性或者變量的值也好,可事實是我們的線上和線下環境是隔離的,根本無法從線下連到線上去。基於這些情況,我們覺得設計實現類似的產品也是很有必要的,於是有了本文要介紹的主角---Zdebugger。
之於Eclipse
Eclipse或許是我們最常用的Java IDE,它的debug模塊也基本能滿足我們的日常需求,但是不知道你有沒有想過類似的問題:
- 為什麼不能調線上應用呢?或許這不是Eclipse的錯,不過事實就是這樣
- 遠程調試應用為什麼一定要目標jvm啟動的時候就開啟調試端口呢?
- 遠程調試時隻能一個用戶連上去?想幾個人一起通過debug查下問題都不行
- 斷點設置在一個通用的地方,因為請求量大,線程瞬間都阻塞了?
- Eclipse忘帶了?哈哈,當然這個不太會發生
Zdebugger的設計我們主要針對上麵的場景分別提供了一些解決方案:
- 部署一套到線上,就可以解決因為環境問題而導致的不可能,線上應用也可以調起來
- 我們提供late attach的機製,能在目標jvm中將JDWP(Java Debug Wire Protocol) agent在運行期動態加載起來,而不需要在應用啟動的時候就加上jdwp agent,目前我們正在進行測試
- 提供了watch point的調試模式,對於同一個應用大家都可以上去設置斷點,然後經過斷點的時候Zdebugger會將一些變量信息,線程信息推給你,斷點是分用戶的噢
- 一個斷點隻斷住一個線程就可以解決斷點在通用位置導致線程都阻塞而手忙腳亂的問題了
- eclipse不在身邊,有瀏覽器就行,Zdebugger設計成了一個web係統,無需安裝,想什麼時候用就什麼時候用
Zdebugger調試模式
Single Step調試模式
這種模式是我們大家都熟悉的使用最廣的調試模式,也就是代碼一行行一步步地調試,最常用的幾種操作:
- step into(F5):進入到方法裏
- step over(F6):轉到當前方法的下一行,如果當前方法結束了相當於下麵的step out
- step out(F7):跳出當前方法,進入到調用者的方法裏
- continue(F8):跳過當前斷點,執行完後麵的邏輯
當然還有目標進程連接/斷連接,設置/清除斷點,查看表達式/變量/屬性等操作
總的來說這種模式當斷點到了的時候是至少需要suspend一個線程的,通過設置還可以suspend整個vm,將所有線程都suspend,直到你執行了continue。
『一人調試,多人圍觀』
這是在single step調試模式下提供的一個有意思的功能,當某個人通過single step模式對某個係統進行調試的時候,另外的人雖然不能幹預他的調試過程,但是可以觀察他的調試過程,當然不是大家圍觀在調試者的旁邊看著他操作,而是在自己的電腦上通過Zdebugger的首頁選中正在被調試的使用single step模式調試的機器進行接入,這個時候調試者的任何一個操作結果,比如文件跳轉,線程堆棧變化等都將在您的頁麵裏進行展示。
Watch Point調試模式
對於這種模式或許你很陌生,之前可能完全沒有聽說過,其實google的cloud debugger就是使用的這種模式,在某些情況下上麵的Single Step調試模式根本不可行,比如我們線上的係統,如果讓你一步步調試, 線程阻塞了,對係統的處理能力也下降了,係統資源更是一個浪費,因此我們需要另外一種模式,也就是這裏要說的Watch Point調試模式,這種模式之於Single Step調試模式最大的區別是不需要人工進行上麵的一係列單步操作,當然設置斷點這些還是需要的,線程也不會一直suspend,而且支持多人同時設置斷點進行調試。
具體過程是當斷點到了的時候,Zdebugger會將線程堆棧,局部變量等值都取出來,然後反饋到關注該斷點的用戶,不過由於jdwp協議的緣故,目前還不能做到變量一層層遞歸找出所有值,隻遞歸取了四層的數據,不過我們現在正在考慮通過jvmti接口來解決這種缺陷,從google的cloud debugger來看好像解決了這個問題,不知道他們是從jvm上解決的,還是和我們目前這樣解決的,因為隻能看到他們的截圖,無法體驗他們的產品,所以也不知道他們究竟是如何的。
當數據反饋到前端之後,該斷點會自動clear,除非您重新開啟該斷點,開啟操作隻需要在斷點列表裏的斷點前的checkbox裏勾上就可以了。
『多人同時在線調試』
這是watch point模式下特有的一個功能,在這種模式下由於不能單步調試應用,那麼我們可以支持多人同時設置斷點了。原理其實很簡單,zdebugger可以根據斷點進行分類,哪些人關注哪些斷點,然後當某個斷點到了的時候將經過此斷點時的線程堆棧,局部變量等推給對應的用戶,當然同一個斷點可以有不同的人關注。
Zdebugger其他特性
- 支持支付寶環境的svn和gitlab source自動下載
- 支持Maven項目展示
- 支持文件搜索
- 支持特定文件在source tree裏的樹狀定位展示
- 支持每個線程棧每一幀的局部變量獲取展示
- 支持臨時表達式
- 支持斷點表達式
- 支持三方包+jdk+svn source的文件間的跳轉
- 支持內部類和同文件裏多類的斷點設置
個人公眾號:
最後更新:2017-04-01 13:37:07