"没有子流程" OCaml Sys.command函数抛出的错误

时间:2017-02-25 18:40:54

标签: python c linux ocaml frama-c

我试图通过python应用程序使用Frama-c。这个python应用程序设置了一些env变量和系统路径。从这个应用程序,我将Frama-c称为python进程如下:

cmd = ['/usr/local/bin/frama-c', '-wp', '-wp-print', '-wp-out', '/home/user/temp','/home/user/project/test.c']
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=False)

当从Python应用程序执行此代码时,我收到以下错误:

[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing)
[kernel] warning: your preprocessor is not known to handle option ` -nostdinc'. If pre-processing fails because of it, please add -no-cpp-gnu-like option to Frama-C's command-line. If you do not want to see this warning again, use explicitely -cpp-gnu-like option.
[kernel] warning: your preprocessor is not known to handle option `-dD'. If pre-processing fails because of it, please add -no-cpp-gnu-like option to Frama-C's command-line. If you do not want to see this warning again, use explicitely -cpp-gnu-like option.
[kernel] Parsing 2675891095.c (with preprocessing)
[kernel] System error: /usr/bin/gcc -c -C -E -I.  -dD -nostdinc -D__FC_MACHDEP_X86_32 -I/usr/local/share/frama-c/libc -o '/tmp/2675891095.cc8bf16.i' '/home/user/project/test.c': No child processes

我发现很难调试导致错误的原因:

  

系统错误:/ usr / bin / gcc -c -C -E -I。 -dD -nostdinc -D__FC_MACHDEP_X86_32 -I / usr / local / share / frama -c / libc -o' /tmp/2675891095.cc8bf16.i' ' /home/user/project/test.c':没有孩子   过程

有没有办法从Frama-c生成更多错误日志,这可能有助于我找出问题?

请注意这个错误只发生在我从我的应用程序启动进程(执行Frama-c)时,而不是从python控制台启动它。它只发生在 Linux机器而不是Windows机器上。

感谢任何帮助。谢谢!!

更新 我意识到通过使用-kernel-debug标志我可以获得堆栈跟踪。所以我尝试了该选项并获得以下信息:

  

致命错误:异常Sys_error(" gcc -E -C -I。-dD -D__FRAMAC__   -nostdinc -D__FC_MACHDEP_X86_32 -I / usr / local / share / frama -c / libc -o' /tmp/2884428408.c2da79b.i'   ' /home/usr/project/test.c':没有   子进程")

     

由文件的原始操作引发   " src / kernel_services / ast_queries / file.ml",第472行,字符9-32

     

从文件" src / kernel_services / ast_queries / file.ml",第517行调用,   人物14-26

     

从文件" src / kernel_services / ast_queries / file.ml",第703行调用,   人物46-59

     

来自档案" list.ml",第84行,字符24-34

     

从文件" src / kernel_services / ast_queries / file.ml",第703行调用,   人物17-76

     

从文件" src / kernel_services / ast_queries / file.ml",第1587行调用,   人物24-47

     

从文件" src / kernel_services / ast_queries / file.ml",第1667行调用,   人物4-27

     

从文件" src / kernel_services / ast_data / ast.ml",第108行调用,   人物2-28

     

从文件" src / kernel_services / ast_data / ast.ml",第116行调用,   人物53-71

     

从文件" src / kernel_internals / runtime / boot.ml",第29行调用,   人物6-20

     

从文件" src / kernel_services / cmdline_parameters / cmdline.ml"调用,   第787行,字符2-9

     

从文件" src / kernel_services / cmdline_parameters / cmdline.ml"调用,   第817行,第18-64号字符

     

从文件" src / kernel_services / cmdline_parameters / cmdline.ml"调用,   第228行,字符4-8

     

在文件" src / kernel_services / cmdline_parameters / cmdline.ml"上重新引发,   第244行,字符12-15

     

从文件" src / kernel_internals / runtime / boot.ml",第72行调用,   人物2-127

我查看了文件"src/kernel_services/ast_queries/file.ml", line 472,执行的代码是Sys.command cpp_command

我不确定为什么"没有孩子处理"尝试执行执行gcc时抛出错误。

更新:我有Ocaml版本:4.02.3,Python版本:2.7.8和Frama-C版本:Silicon-20161101

1 个答案:

答案 0 :(得分:0)

我对Frama-C一无所知。但是,错误消息来自某人(OCaml' Python')运行时,表明系统调用失败并出现ECHILD错误。 system()生成的两个系统调用是fork()waitpid()。它是可以返回ECHILD的后一个系统调用。这意味着没有儿童过程等待。一个很好的可能性是fork()失败了。当系统充满进程(不太可能)或达到每用户进程限制时,fork()会失败。您可以检查自己是否遇到了这种限制。

我遇到的另一种可能性是代码的其他部分已经使用信号处理(SIGCHLD)处理子进程。因此,没有子进程等待的原因是它已经在其他地方处理过了。这很复杂,所以我希望这不是问题所在。