【问题标题】:Windows Binary working on CMD but not (always) with ProcessBuilderWindows Binary 在 CMD 上工作,但不是(总是)使用 ProcessBuilder
【发布时间】:2019-01-25 17:41:41
【问题描述】:

我开发了一个C++ 应用程序,我想从我的Java 应用程序中调用它。为此,我使用ProcessBuilder

ProcessBuilder processBuilder = new ProcessBuilder(command);
processBuilder.redirectErrorStream(true);
Process process = processBuilder.start();
String processOutput = readFromProcess(process);

val exitCode = process.waitFor();
if (exitCode != 0)
{
    // Exception
}

return processOutput;

这是我读取进程输出的方式:

public static String readFromProcess(Process process) throws IOException
{
    StringBuilder stringBuilder;
    String lineSeparator = lineSeparator();
    try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream())))
    {
        stringBuilder = new StringBuilder();
        String line;
        while ((line = bufferedReader.readLine()) != null)
        {
            stringBuilder.append(line);
            stringBuilder.append(lineSeparator);
        }
    }

    return stringBuilder.toString().trim();
}

我明白了:

exit code -1073741819 (0xC0000005)

这似乎意味着The application was unable to start correctly,我什至没有得到EXE代码开头的初始版权控制台打印。

如果我在CMD 上运行EXE,即使我传递了完全相同的参数,它也会成功运行。为什么会这样?我为LinuxMac OS X 编译了代码,但它们都通过JavaTerminal 在各自的操作系统上运行良好。提到的退出代码0xC0000005 仅出现在Windows 上,而不仅仅出现在我的PC 上。其他 2 位用户也观察到了这个问题。有时Windows EXE 仍然会从Java 运行,尽管这更奇怪。

我使用的C++ 编译标志是:

# /MD Causes the application to use the multithread-specific and DLL-specific version of the run-time library:
# https://docs.microsoft.com/en-us/previous-versions/2kzt1wy3(v=vs.140)
# /Ox (Full Optimization): https://docs.microsoft.com/en-us/previous-versions/59a3b321(v=vs.140)
# /GL (Whole Program Optimization): https://docs.microsoft.com/en-us/previous-versions/0zza0de8(v=vs.140)
# /cgthreads (Code Generation Threads): https://docs.microsoft.com/en-us/previous-versions/dn631956(v=vs.140)
# /MP (Build with Multiple Processes): https://docs.microsoft.com/en-us/previous-versions/bb385193(v=vs.140)
# /fp (Specify Floating-Point Behavior): https://docs.microsoft.com/en-us/previous-versions/e7s85ffb(v=vs.140)
# /Gw (Optimize Global Data): https://docs.microsoft.com/en-us/previous-versions/dn305952(v=vs.140)
# /GS (Buffer Security Check): https://docs.microsoft.com/en-us/previous-versions/8dbf701c(v=vs.140)
# /favor (Optimize for Architecture Specifics): https://docs.microsoft.com/en-us/previous-versions/ms173505(v=vs.140)
# /Qpar (Auto-Parallelizer): https://docs.microsoft.com/en-us/previous-versions/hh923900(v=vs.140)
# /EH (Exception Handling Model): https://docs.microsoft.com/en-us/previous-versions/1deeycx5(v=vs.140)
# DNDEBUG: Disable assert macro evaluation
set(OPTIMIZATIONS "/MD /Ox /GL /cgthreads8 /MP8 /fp:fast /Gw /GS- /favor:INTEL64 /Qpar /EHs /EHc- /DNDEBUG")
set(CMAKE_CXX_FLAGS_RELEASE "${OPTIMIZATIONS}")

【问题讨论】:

  • NT 状态 0xC0000005 (-1073741819) Windows 错误 0x3E6 (998) NT 状态消息:0x 处的指令%p 在 0x%p 处引用了内存。内存不能是 %s。 Windows 错误消息:对内存位置的访问无效。
  • 您的程序中存在错误。您正在使用已被释放的内存(即通过超出范围的对象/字符串/值)或某些内容为 null(并且不应该)并且您正在尝试使用它。

标签: java windows visual-c++ cmd processbuilder


【解决方案1】:

事实证明传递的参数不一样,因为Java 将空字符串解释为Windows 上没有参数。因此,它对参数数组进行了索引,并且仍然拒绝打印内存错误之前的任何内容,这是不直观的。

【讨论】:

    猜你喜欢
    • 2022-01-20
    • 2021-01-26
    • 1970-01-01
    • 2022-07-05
    • 2015-09-22
    • 2016-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多