我正在尝试诊断(并修复)位于多个组件边界的问题;任何关于如何获得更多信息或彻底解决问题的见解都非常感激。
我有一个应用程序,它作为一个C程序启动,可以启动一个Java程序,然后可以以递归的方式启动相同的C程序。 它一直在Linux和Cygwin上工作。在Java中的程序启动范例中发现了一些错误,它从更简单的运行时策略更新到(1.5中的新增功能)ProcessBuilder策略。出于各种不完整的原因,它会使用-c选项启动bash,然后启动需要调用的。它适用于Linux,但是当移植到Cygwin时,它会失败,如下所述。不幸的是,我不小心删除了正在运行的Cygwin实例,因此我无法轻易辨别出问题是仅仅是配置问题还是更深层次的问题。
为了记录,我认为Cygwin没有任何问题,但我不确定,因为我同时愚蠢地更新了Cygwin。 (是我在想什么?!)
当Java尝试启动C程序时出现错误。它总是完全相同的错误:
加载共享库时出现错误:?:无法打开共享对象 file:没有这样的文件或目录
在cygwin中对这个错误的研究几乎没有产生任何结果,只有这一点:
http://cygwin.com/ml/cygwin/2012-03/msg00396.html
值得注意的是,运行作为标准Cygwin发行版的一部分的图像的测试运行并且运行正常。相反,程序bs.exe在Cygwin环境中编译和链接。
我正在考虑的一些事情是,如果可能有环境变量我没有包含在环境中,但它应该继承调用者的环境,我没有看到我曾经使用过任何类型的LD_LIBRARY_PATH过去的cygwin环境并未注意到文献中的任何类似参考文献。然后,有Java策略,但是之前没有任何改变,当我将cygwin添加到文件中时,它没有帮助。
......我的想法已经用完了......任何人?
更新:这是Java中ProcessBuilder代码的代码摘录:
public results ExecuteProgram(String program, String log)
{
results r = new results();
boolean returnString = false;
if (Empty(log)) { log = getTempFile(); }
File lf = null;
ProcessBuilder pb;
r.OK = true;
r.err = "Unable to Run program: ";
int status = 0; //Note that 0 = success!
// Before we get here, we know the first space delimited substring
// of the program string already has the full path to the program. The
// rest (if any) are arguments.
try
{
// Shell contains something like /bin/bash, depending on the system
//
pb = new ProcessBuilder(Shell, "-c", program);
// Map<String, String> env = pb.environment();
// env.remove("PATH");
// env.put("PATH", Path);
// env.remove("CLASSPATH");
// env.put("CLASSPATH", CLASSPATH);
// env.remove("LD_LIBRARY_PATH");
// env.put("LD_LIBRARY_PATH", LD_LIBRARY_PATH);
// ALSO DO:
// LD_LIBRARY_PATH
pb.directory(new File(wd));
pb.redirectErrorStream(true);
lf = new File(log);
pb.redirectOutput(Redirect.appendTo(lf));
Process p = pb.start();
assert p.getInputStream().read() == -1;
if (!returnString)
{
assert pb.redirectInput() == Redirect.PIPE;
assert pb.redirectOutput().file() == lf;
}
r.err = "OS Process started.";
r.OK = true;
try
{
r.Status = p.exitValue();
r.err = "OS Process completed.";
}
catch (IllegalThreadStateException e)
{
}
}
catch (IOException e)
{
r.err += "\nIOException while accessing IO stream: "+
e.toString();
r.OK = false;
}
if ((r.Status == 0) && (r.OK))
{
r.err = "Success";
} else {
if (r.Status != 0)
{
r.err += "Process exit status: "+r.Status;
}
System.out.print(r.err);
}
return r;
}
哦,是的,按照惯例,cygcheck -s信息如下,剪了一下。更多的要求,因为整个数据集是巨大的,可能无趣。
Cygwin配置诊断当前系统时间:2005年12月1日 04:08:40 2013 Windows 7 Professional N Ver 6.1 Build 7600
在AMD64 Path:W:64下运行:C:\ Program 文件\的Java \ jdk1.7.0 \ BIN C:\选择\ BIN C:\ Cygwin的的\ usr \本地\ BIN C:\ cygwin的\斌 C:\ Program Files(x86)\ Android \ android-sdk \ platform-tools C:\ Program Files \ PostgreSQL \ 9.3 \ bin C:\ Program Files \ Java \ jdk1.7.0 \ bin C:\ Program Files(x87)\ PC连接解决方案 C:\ WINDOWS \ SYSTEM32 C:\ WINDOWS C:\ WINDOWS \ SYSTEM32 \ WBEM C:\ WINDOWS \ SYSTEM32 \ WindowsPowerShell \ V1.0 C:\ Program Files(x86)\ Microsoft SQL Server \ 90 \ Tools \ binn C:\ Program Files(x86)\ Toshiba \ Bluetooth Toshiba Stack \ sys C:\ Program Files(x86)\ Toshiba \ Bluetooth Toshiba Stack \ sys \ x64 C:\ Program Files \ Intel \ WiFi \ bin C:\ Program Files \ Common Files \ Intel \ WirelessCommon C:\ cygwin的\斌 C:\ Program Files \ PostgreSQL \ 9.3 \ bin C:\ cygwin的\ LIB \ LAPACKCygwin DLL version info: DLL version: 1.8.4 DLL epoch: 19 DLL old termios: 5 DLL malloc env: 28 Cygwin conv: 181 API major: 0 API minor: 262 Shared data: 5 DLL identifier: cygwin1 Mount registry: 3 Cygwin registry name: Cygwin Program options name: Program Options Installations name: Installations Cygdrive default prefix: Build date: Shared id: cygwin1S5 <snip>