Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中运行可执行文件时访问源代码变量_Java_Netbeans - Fatal编程技术网

在java中运行可执行文件时访问源代码变量

在java中运行可执行文件时访问源代码变量,java,netbeans,Java,Netbeans,我正在使用process builder从java代码中运行一个名为“fio”的工具。该工具的源代码是C。当我在java代码中运行该工具时,我需要从“fio”的源代码中获取一些变量的值。我试图搜索解决方案,但找不到任何解决方案。 我该怎么做?processbuilder的“环境变量”可以帮助我吗? 这是我正在使用的代码 String line=null; ProcessBuilder pb=new ProcessBuilder("fio","inp.fio");

我正在使用process builder从java代码中运行一个名为“fio”的工具。该工具的源代码是C。当我在java代码中运行该工具时,我需要从“fio”的源代码中获取一些变量的值。我试图搜索解决方案,但找不到任何解决方案。 我该怎么做?processbuilder的“环境变量”可以帮助我吗? 这是我正在使用的代码

        String line=null;
        ProcessBuilder pb=new ProcessBuilder("fio","inp.fio");
        File f=new File("/home/nikhil/Nikhil");
        pb.directory(f);

        Process p=pb.start();
        InputStream i=p.getInputStream();
        InputStreamReader ir=new InputStreamReader(i);
        BufferedReader bf=new BufferedReader(ir);

        InputStream err=p.getErrorStream();
        InputStreamReader rerr=new InputStreamReader(err);
        BufferedReader bferr=new BufferedReader(rerr);

我假设您有权访问fio的代码并可以重建它。您可以使用的一种机制是让fio将您感兴趣的局部变量状态输出到您正在处理的一个输出流(stdout或stderr),并在其发生变化时将其值解析为消息,fio输出更新的值。这使得通信相当简单

如果您有很多复杂的数据,您可能需要考虑为共享状态创建单独的通信信道(例如共享内存,或命名管道或基于套接字的连接)。如果您只是对一些廉价的调试感兴趣,我会使用第一种方法,输出如下内容

DBG{var1}=


只要感兴趣的值发生变化,就可以使用stderr,并让Java中的stderr流处理程序记录状态,以便在需要时使用。

我可以使用“共享内存”与我编写的另一个新C程序共享变量值,现在我可以从这个新C程序调用一个函数,该函数将返回“共享”变量的值在我使用JNI的java代码中。

您可能需要使用
gdb
或其他东西来连接到正在运行的进程。我怀疑Java调试器是否能让您了解该流程的变量。另外,
fio
应用程序应该使用可用的调试符号进行编译。你能详细说明gdb的使用吗?是的,我可以访问fio源代码,你的意思是我输出我感兴趣的变量的值,比如stdout,然后在java代码中从inputstream复制该值吗?是的,对于快速而肮脏的调试解决方案来说,这可能是最简单的。Java和C进程空间是相当独立的,在C端使用一点printf和在Java端进行解析可能是更仔细地了解调试的最便宜/最快捷的方法。如果有很多变量,等等,你可以考虑尝试同时在调试器中运行这两个变量,并浏览代码,但这很快就会变得毛茸茸的。好吧,调试器对于一些问题来说是很好的,但它可能是在使用slegdehammer来解决问题,这取决于你试图调查的范围。这是判断,没问题!如果答案有帮助,你可以“接受”。