2011-09-19 71 views
-2

我希望能夠在運行Java代碼時識別異常,而無需附加調試器。舉個簡單的例子,如果我有以下代碼:在沒有調試器的情況下調試/識別Java問題

int i = 0; 
    Random rand = new Random(); 
    while (true) 
    { 
     i++; 
     int number = rand.nextInt(1000); 
     if (number == 20) 
      throw new Exception("Error!!!"); 
    } 

我怎麼能知道的值「i」在異常時拋出? (不附加任何調試器或添加日誌/打印條目)。

我的動機是,我希望能夠識別客戶現場的問題,而無需將任何調試器附加到生產現場。

如果有人用問同樣的問題.NET或C++,我能得到「我」使用的WinDbg值和相關PDBS

謝謝!

+5

我有一臺電視機,我想看一系列而不打開它。祝我好運! –

+3

嗯,沒有調試器,沒有你說的日誌。祝好運在RAM中找到'i'的值:P – pablochan

+2

'i'可能是0.只是說''。 –

回答

3

將相關信息添加到Exception對象。

if (number == 20) 
    throw new Exception("Error!!! i = " + i); 

可以檢索的icatch塊的值,使用Exception.getMessage()(和一些字符串解析,在這種情況下;或者,只是throw new Exception("" + i))。

+0

+1,但我不確定這是否違反了給定的限制(無記錄)。 – pablochan

+0

我也不確定,希望Omri會澄清這一點。 –

+0

這也不能回答我的問題。我的動機是,我希望能夠在客戶現場識別問題,而無需將任何調試器附加到生產現場。 – Omri

1

你的問題不清楚。

如果你實際上在問如何找到關於程序執行狀態的信息,而沒有附加調試器或者修改程序來添加日誌記錄/跟蹤/不管那些會給你那些信息......那麼答案是「你做不到」。

在這種情況下,您唯一的選擇是嘗試推理程序的行爲。


在你的榜樣,隨機數生成器返回的是(對所有實際目的)不可預測的數字,因此不適合推理。而那通常會是的結束。

但是,@Thomas Jungblut的評論指出這是無關緊要的,答案是零......因爲程序中沒有任何內容在初始化後改變了i的值。

但這確實沒有改變「一般」的回答:

  • 如果您不能跟蹤它/調試它,你必須來思考它。
  • 如果你不能推理它,你會被卡住。
相關問題