2012-04-13 44 views
2

我有一個嵌入式Linux(BusyBox v1.12.4)上運行的Java應用程序。我使用的是CDC 1.1,VM(cvm)的版本是CDC HI phoneme_advanced-Core-1.1.2-b111。嵌入式Java應用程序崩潰,沒有例外,沒有明顯的原因

應用程序的主要目的是收集一些數據,並通過GPRS發送(使用Apache公共圖書館的FTPClient)

應用程序運行良好,然後最近我加入之前壓縮文件的能力發送它。下面是一個壓縮文件中的代碼:

public static boolean compressFile(String file, String fileCompressed) 
{ 
    boolean result = false; 

    try 
    { 
     Process process = Runtime.getRuntime().exec("tar -czvf " + fileCompressed + " " + file); 
     System.err.println("Compression in progress"); 
     int returnValue = process.waitFor(); 
     System.err.println("Finished compression"); 
     BufferedReader stderror = new BufferedReader(new InputStreamReader(process.getErrorStream())); 

     String s; 

     s = stderror.readLine(); 
     if (s == null) 
     { 
      result = true; 
     } else 
     { 
      result = false; 
     System.err.println(s); 
     } 
    } catch (IOException e) 
    { 
      result = false; 
      Log.getInstance().newMessage(e.getMessage(), Log.ERROR); 

    } catch (InterruptedException e) 
    { 
      result = false; 
      Log.getInstance().newMessage(e.getMessage(), Log.ERROR); 
    } 

    return result; 
} 

添加此功能後,啓動應用程序崩潰!該日誌沒有包含任何內存錯誤或異常,它運行的系統缺少正確的配置,所以系統日誌也沒有顯示任何內容(設備製造商告訴我,它將在即將發佈的版本中提供)。我甚至無法在調試模式下啓動虛擬機!

我必須補充說,在壓縮過程中應用程序不會崩潰,它在執行過程中會隨機崩潰。問題是隻有啓用壓縮時纔會崩潰!

以前有人看過這個嗎?有沒有人有關於如何調試/解決這個問題的想法?

+0

您可能已通過添加該方法在應用程序內的其他位置更改了某些未初始化的值。通常,當「未使用的方法或函數或變量導致程序行爲改變」是問題時,根本原因是未初始化的變量。原因在於你之前很幸運,而且這個未初始化的變量有一個爲你工作的值。 – 2012-05-19 11:55:42

回答

0

我懷疑的第一件事將是一個徹頭徹尾的內存不足的情況,造成gzip壓縮引擎的執行。嘗試在shell中調用dmesg以查看kernel OOM killer是否犧牲了任何進程。

一些其他的東西來嘗試:

  • 刪除的tarv標誌:你似乎並不需要額外的輸出,並將其可能造成某種問題的道路,這取決於你確切的環境。

  • 使用tar沒有z選項:如果崩潰消失禁用壓縮,那麼這可能是一個內存問題。

  • 嘗試cat,您可以開始的最簡單的外部過程之一,而不是tar,看看會發生什麼。

  • 壓力測試您的硬件:使用壓縮可能只是暴露通常不可見的潛在過熱或數據損壞問題。

0

我通過觀察JVM的退出代碼開始 - 這會告訴你,如果它從信號死了,如果是這樣,這。

相關問題