2010-09-10 26 views
4

我已經使用了許多年的jad,其中大部分都使用Jadclipse插件進行日食,這使得它非常實用。特別是使用「調試代碼對齊」,可以讓您查看堆棧跟蹤中任何行的反編譯代碼。非常好。什麼是一個更準確的反編譯器比jad的Eclipse來擺脫<-MISALIGNED->?

不幸的是,我越來越多地看到< - MISALIGNED - >註釋,這很可能是因爲jad期望classfile的順序很明顯,對於Java 6運行時庫來說顯然不是這樣。因此,在寫入文件時,如果指令中顯示「這是第100行」,則會寫入99行空行,如果接下來的指令說「這是第10行」,則jad不能倒帶以將輸出放到那裏,而只是打印發表評論說這是錯誤的地方。

下面是HttpURLConnection的一個例子:

  protected HttpURLConnection(URL url, Proxy proxy, Handler handler1) 
      { 
/* <-MISALIGNED-> */ /* 603*/  super(url); 
/* <-MISALIGNED-> */ /* 192*/  ps = null; 
/* <-MISALIGNED-> */ /* 196*/  errorStream = null; 
/* <-MISALIGNED-> */ /* 199*/  setUserCookies = true; 
/* <-MISALIGNED-> */ /* 200*/  userCookies = null; 
/* <-MISALIGNED-> */ /* 220*/  currentProxyCredentials = null; 
/* <-MISALIGNED-> */ /* 221*/  currentServerCredentials = null; 
/* <-MISALIGNED-> */ /* 222*/  needToCheck = true; 
/* <-MISALIGNED-> */ /* 223*/  doingNTLM2ndStage = false; 
/* <-MISALIGNED-> */ /* 224*/  doingNTLMp2ndStage = false; 
/* <-MISALIGNED-> */ /* 226*/  tryTransparentNTLMServer = NTLMAuthentication.supportsTransparentAuth(); 
/* <-MISALIGNED-> */ /* 227*/  tryTransparentNTLMProxy = NTLMAuthentication.supportsTransparentAuth(); 
/

現在的問題是,如果有產生更精確的輸出面向行的另一個的反編譯。實際的反編譯並不需要非常好,但我真的很喜歡它是Java Stack Trace視圖期望的地方。如果它適合Jadclipse,那更好。

+1

我不是一個反編譯器或字節碼專家,但我敢肯定,有一個反編譯器可以反編譯來匹配行號是非常困難的。我使用Java Decompiler(名稱中包含的內容),它只是在實際行之前將行號放在註釋中。通常情況下,沒有任何對齊方式,但我只是用它來查看一些東西,而不是做任何實際的調試 - 不是我的代碼,也可能是封閉源代碼,而不是我的工作。 – fwielstra 2010-09-10 13:58:32

回答

2

調試格式化的問題來自jadclipse而不是jadjad沒有這種能力。

jadclipse插件具有在一個類名稱DebugAlignWriter其中執行此一點代碼段:}

if((align = getAlignTarget(aLine)) != -1) 
{ 
    if(align < curLine) 
    { 
     if(curLine != 0) 
     { 
      out.write(10); 
     } 
     out.write("/* <-MISALIGNED-> */ "); 
     out.write(aLine); 
     curLine++; 
    } 
    else if(align == curLine) 
    { 
     out.write(aLine); 
    } 
    else 
    { 
     for(; align > curLine; curLine++) 
     { 
      out.write(10); 
     } 
     out.write(aLine); 
    } 

基本上它試圖從jad對齊輸出。

因此,根本原因是jad產生的輸出不一定按照讀取順序。不幸的是,我無法說明爲什麼jad這樣做。根據jad的幫助,沒有辦法控制訂單。

jadclipse注意到,如果你設置JadClipse-> Formatting->左括號之前,不要插入新行 - 這將減少由於它是如何工作的性質/* <-MISALIGNED-> */段數。

此外,如果您在方法選項之前檢查了輸出字段,它可以增加/* <-MISALIGNED-> */段的數量,所以請避免它。

0

我使用jad儘可能少的格式,然後使用eclipse的格式命令,因爲我可以使它與首選項的首選樣式相匹配。

+0

在完成Eclipse格式化程序之後,是否不打破堆棧跟蹤中的行號與行號之間的關聯? – 2010-09-10 12:30:57

1

JD-Eclipse是一個很好的反編譯器,它也處理java 7的功能。

它沒有「調試對齊代碼」功能,但我自己添加了一個。去年我一直在使用它。

我還處理線路必須移回時的情況;我仍然將其標記爲MISALIGNED,以表示特殊情況,但至少將其置於正確的路線上。

如果有人想試試它可以從here下載。 README.txt裏面的更多細節