簡體   English   中英

遠程調試如何工作? 是否需要在本地機器上編譯代碼?

[英]How does remote debugging work? Does code need to be compiled on the local box?

我在遠程服務器上部署了Java Web應用程序。 我想從Eclipse在本地計算機上進行遠程調試。 它們是相同的版本。 是否需要代碼由本地機器編譯才能進行遠程調試,還是不是必須的? 我的理解是代碼應該由我的本地工具編譯。

我相信遠程調試的工作原理如下。 如果我錯了,請糾正我。

當我將調試器放在Eclipse中第250行的某個源文件上時,它將在類文件中查找相應的字節碼並注意這一點(例如,類文件中的第200行,因為它刪除了所有注釋和無效代碼) 。 同樣,它將在遠程服務器上的類文件中的第200行放置一個斷點。 當執行到第200行時,調試器將停止,但是在Eclipse中,為了方便開發人員,它將在源代碼的第250行中停止。 (它必須進行內部計算以確定源代碼中與字節碼相對應的確切行。)

Eclipse調試從所謂的代理開始

運行已編譯的.class源代碼的JVM具有一項功能,該功能允許在運行時將外部庫(用Java或C ++編寫)注入到JVM中。 這些外部庫稱為代理 ,它們具有修改已運行的.class文件的內容的能力。 這些代理商有機會獲得JVM的功能,是不是從JVM和他們的內部運行的常規Java代碼中訪問可以用來做一些有趣的東西,如注射和修改正在運行的源代碼,分析等(如JRebel的工具利用來實現他們的魔力。)

要將Agent Lib傳遞給JVM,您可以使用

 agentlib:libname[=options] format.

我們實際上是將名為jdwp的代理庫傳遞給運行Tomcat的JVM。 jdwpJVM專用的JDWP(Java調試線協議)的可選實現,用於定義調試器和正在運行的JVM之間的通信。 它的實現(如果存在)以JVM的本機庫形式jdwp.sojdwp.dll

那怎么辦呢?
簡單來說,我們傳遞的jdwp代理基本上是充當運行應用程序的JVM實例與調試器(可以位於遠程或本地)之間的鏈接的功能。 由於它是一個代理庫,它確實具有攔截正在運行的代碼,在JVM和調試器之間建立橋梁以及將調試器的功能應用於JVM的能力。
由於在JVM體系結構中,調試功能不在JVM本身中而是將其抽象為外部工具(適當地稱為調試器),因此這些工具可以駐留在運行要調試的JVM的本地計算機上,也可以運行從外部機器。 正是這種分離的模塊化架構,使我們能夠使JVM在遠程計算機上運行並使用JDWP,並使遠程調試器能夠與其通信

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM