什么是Debug實(shí)現(xiàn)原理,針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。
創(chuàng)新互聯(lián)建站是一家專注于網(wǎng)站建設(shè)、網(wǎng)站制作與策劃設(shè)計(jì),尉氏網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)建站做網(wǎng)站,專注于網(wǎng)站建設(shè)10多年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:尉氏等地區(qū)。尉氏做網(wǎng)站價(jià)格咨詢:18982081108
下面將會(huì)講述JPDA的組成,Debugger的實(shí)現(xiàn)原理等。
程序異常了!
返回結(jié)果不對(duì)!
在我這兒正常啊。
每一次遇到這種異常的情況,要處理問(wèn)題時(shí),我們一定會(huì)想到
等我Debug一下,分分鐘解決。
而如果是線上的問(wèn)題,我們一定會(huì)想
如果能debug一下該多好啊
我們?cè)谡f(shuō)起Debug的時(shí)候,一般是在IDE里代碼中加斷點(diǎn),一步步跟蹤。然后觀察變量的值,觀察輸出等等。
這種在Debug工具,許多IDE中都有提供,像Eclipse, IDEA,NetBeans,甚至我們可以直接使用JDK自帶的jdb工具進(jìn)行高度。這些工具都支持本地調(diào)試和遠(yuǎn)程調(diào)試。
那在我們加斷點(diǎn),debug,單步調(diào)試等一系列動(dòng)作背后,是如何實(shí)現(xiàn)的呢?
說(shuō)到這些,就不得不提JPDA(Java Platform Debugger Architecture)。我們每次使用的debug功能,都是靠JPDA的支撐實(shí)現(xiàn)的。
什么是JPDA?
官方文檔里這樣介紹:
The Java Platform Debugger Architecture (JPDA) consists of three interfaces designed for use by debuggers in development environments for desktop systems.
我們看到,JPDA由三部分組成:
JVMTI(Java Virtual Machine Tool Interface)
JDWP(Java Debugger Wire Protocol)
JDI(Java Debug Interface)
熟悉JVM的朋友可能聽(tīng)說(shuō)過(guò)JVMPI和JVMDI,在JDK1.5他們統(tǒng)一被替換為JVMTI。
以前的文章里我們提到過(guò)Class的hotSwap,就是通過(guò)Instrument實(shí)現(xiàn)class的redefine
和retransform
。
而本質(zhì)上JVMTI是一個(gè)programming interface,主要用在開(kāi)發(fā)和監(jiān)控上。而且它提供了接口去觀察(inspect) 應(yīng)用狀態(tài)和控制應(yīng)用的執(zhí)行。工具通過(guò)它提供的接口,可以進(jìn)行如下功能的實(shí)現(xiàn):
profiling
debuging
monitoring
thread analysis
coverage analysis
可以看到,我們使用到的debug,只是JVMTI提供的眾從能力中的一種。
觀察過(guò)Java debug進(jìn)程的同學(xué)也許有印象,以debug方式啟動(dòng)的JVM進(jìn)程,看起來(lái)是這樣的:
-agentlib:jdwp=transport=dt_socket,address=127.0.0.1:63971,server=y,suspend=n
除了進(jìn)程名之外,還在啟動(dòng)參數(shù)里包含agentlib:jdwp
這些。這個(gè)就是現(xiàn)在要介紹的JDWP。
什么是JDWP?
Java Debug Wire Protocol,是debugger和它要debug的JVM之間進(jìn)行通訊的協(xié)議。更多具體協(xié)議的細(xì)節(jié)這里不介紹,感興趣的同學(xué)可以到這兒查看:
http://docs.oracle.com/javase/6/docs/technotes/guides/jpda/jdwp-spec.html
注意,這僅僅是一個(gè)協(xié)議的格式,具體的傳輸實(shí)現(xiàn)不是由JDWP來(lái)實(shí)現(xiàn)的。我們的debugger執(zhí)行的操作發(fā)送到JDWP的實(shí)現(xiàn)上,然后再轉(zhuǎn)給JVMTI來(lái)具體控制。
JDI是三個(gè)模塊中最高層的一個(gè)接口,通過(guò)JDI,debugger可以更方便的編寫(xiě)符合JDWP格式的數(shù)據(jù),用來(lái)進(jìn)行調(diào)試數(shù)據(jù)傳輸。JDI的引入,提高了開(kāi)發(fā)debugger的效率。
所以,從整體上看,我們可以把JPDA看作一個(gè)兩個(gè)互相通訊的程序,所以我們可以在任意地點(diǎn)很方便的調(diào)試另一個(gè)JVM上運(yùn)行的程序。
我們每次在IDE里進(jìn)行代碼調(diào)試時(shí),實(shí)質(zhì)上是通過(guò)IDE里的debugger這個(gè)界面執(zhí)行GUI操作,然后通過(guò)JDI發(fā)送數(shù)據(jù)到JDWP,再經(jīng)過(guò)JVMTI最終實(shí)現(xiàn)程序的高度。
每次我們打開(kāi)IDE調(diào)試一個(gè)Java應(yīng)用的時(shí)候,或者遠(yuǎn)程attach一個(gè)Java進(jìn)程的時(shí)候,別忘了這個(gè)IDE背后的身影---JPDA。
PS:Tomcat啟動(dòng)腳本中也直接包含了debug方式啟動(dòng)的功能,在命令行中輸入
catalina jpda start, Tomcat就以debug方式啟動(dòng)了。
對(duì)于想了解源碼但不想把源碼以項(xiàng)目形式運(yùn)行的同學(xué),可以采用這種方式,然后使用遠(yuǎn)程調(diào)試的方式,把源碼所在項(xiàng)目和這個(gè)attach起來(lái)就可以了。
關(guān)于什么是Debug實(shí)現(xiàn)原理問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。