我有一个在嵌入式Linux上运行的Java应用程序(BusyBox v1.12.4)。我使用的是CDC 1.1,而VM(cvm)的版本是CDC HI phoneme_advanced-Core-1.1.2-b111。
应用程序的主要目的是收集一些数据并通过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;
}
添加此功能后,应用程序开始崩溃!日志没有包含任何内存错误或异常,并且它运行的系统缺少正确的配置,因此系统日志也没有显示任何内容(设备制造商告诉我它将可用)在即将推出的版本中)。我甚至无法在调试模式下启动VM!
我必须补充说,应用程序在压缩过程中不会崩溃,它只会在执行过程中随机崩溃。问题是它只在启用压缩时崩溃!
以前有人见过这个吗?有没有人知道如何调试/解决这个问题?
答案 0 :(得分:0)
我怀疑的第一件事是由gzip
压缩引擎的执行引起的内存不足情况。尝试在shell中调用dmesg
以查看kernel OOM killer是否牺牲了任何进程。
其他一些尝试:
删除v
的{{1}}标记:您似乎不需要额外的输出,可能会导致某种问题,具体取决于在你确切的环境。
在没有tar
选项的情况下使用tar
:如果在禁用压缩的情况下崩溃消失,则可能是内存问题。
尝试z
,这是您可以开始的最简单的外部流程之一,而不是cat
,看看会发生什么。
对硬件进行压力测试:使用压缩可能只会暴露通常不可见的潜在过热或数据损坏问题。
答案 1 :(得分:0)
我首先看看JVM的退出代码 - 它会告诉你它是否死于信号,如果是,那么。