2

我有一个在嵌入式 linux (BusyBox v1.12.4) 上运行的 Java 应用程序。我使用的是 CDC 1.1,VM (cvm) 的版本是 CDC HI phoneme_advanced-Core-1.1.2-b111。

该应用程序的主要目的是收集一些数据并通过 GPRS 发送(使用 Apache commons library 的 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;
}

添加此功能后,应用程序开始崩溃!该日志不包含任何内存错误或异常,并且它运行的系统缺少正确的配置,因此系统日志也没有显示任何内容(设备制造商告诉我它将在即将发布的版本中提供)。我什至无法在调试模式下启动 VM!

我必须补充一点,应用程序在压缩过程中不会崩溃,它只是在执行过程中随机崩溃。问题是它只有在启用压缩时才会崩溃!

有人见过这个吗?有人知道如何调试/解决这个问题吗?

4

2 回答 2

0

我将从查看 JVM 的退出代码开始——它会告诉你它是否死于信号,如果是,是哪个。

于 2012-04-15T01:57:33.297 回答
0

gzip我怀疑的第一件事是由压缩引擎的执行引起的内存不足的情况。尝试在 shell 中调用dmesg以查看内核 OOM 杀手是否牺牲了任何进程。

其他一些可以尝试的事情:

  • 删除: 您似乎不需要额外的输出的v标志,它可能会在未来导致某种问题,具体取决于您的确切环境。tar

  • tar不带选项使用z:如果崩溃在禁用压缩的情况下消失,则可能是内存问题。

  • 尝试cat,您可以启动的最简单的外部进程之一,而不是tar看看会发生什么。

  • 对您的硬件进行压力测试:使用压缩可能只是暴露了通常不可见的潜在过热或数据损坏问题。

于 2012-04-13T17:07:02.770 回答