python - OCaml Sys.command 函数抛出的 "No child processes"错误

标签 python c linux ocaml frama-c

我正在尝试通过 python 应用程序使用 Frama-c。这个 python 应用程序设置了一些环境变量和系统路径。在这个应用程序中,我将 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

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

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

有没有一种方法可以从 Frama-c 生成更多错误日志来帮助我找出问题?

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

感谢任何帮助。谢谢!!

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

Fatal error: exception 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': No child processes")

Raised by primitive operation at file "src/kernel_services/ast_queries/file.ml", line 472, characters 9-32

Called from file "src/kernel_services/ast_queries/file.ml", line 517, characters 14-26

Called from file "src/kernel_services/ast_queries/file.ml", line 703, characters 46-59

Called from file "list.ml", line 84, characters 24-34

Called from file "src/kernel_services/ast_queries/file.ml", line 703, characters 17-76

Called from file "src/kernel_services/ast_queries/file.ml", line 1587, characters 24-47

Called from file "src/kernel_services/ast_queries/file.ml", line 1667, characters 4-27

Called from file "src/kernel_services/ast_data/ast.ml", line 108, characters 2-28

Called from file "src/kernel_services/ast_data/ast.ml", line 116, characters 53-71

Called from file "src/kernel_internals/runtime/boot.ml", line 29, characters 6-20

Called from file "src/kernel_services/cmdline_parameters/cmdline.ml", line 787, characters 2-9

Called from file "src/kernel_services/cmdline_parameters/cmdline.ml", line 817, characters 18-64

Called from file "src/kernel_services/cmdline_parameters/cmdline.ml", line 228, characters 4-8

Re-raised at file "src/kernel_services/cmdline_parameters/cmdline.ml", line 244, characters 12-15

Called from file "src/kernel_internals/runtime/boot.ml", line 72, characters 2-127

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

我不确定为什么在尝试执行 execute gcc 时抛出“No Child Processes”错误。

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

最佳答案

我对 Frama-C 一无所知。但是,错误消息来自某人(OCaml 的?Python 的?)运行时,表明系统调用因 ECHILD 错误而失败。 system() 进行的两个系统调用是fork()waitpid()。可以返回 ECHILD 的是后一个系统调用。这意味着没有要等待的子进程。一个很好的可能性是 fork() 失败了。 fork() 在系统充满进程(不太可能)或达到每个用户的进程限制时失败。您可以检查自己是否遇到了此类限制。

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

关于python - OCaml Sys.command 函数抛出的 "No child processes"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42460103/

相关文章:

将 Urllib2 与 virtualenv 一起使用的 Python Anywhere 问题

C 将字符串/字符输入转换为 float

linux - 在bash shell中,如何对()、(())、[]、[[]]和{}的用法进行分类?

python - OpenCV-Python : Issue with getting frame rate of video

Vim 的 Python 和 Django 插件

c - 我应该如何使用 libpng 库将 RGBA 位图转换为 PNG 并将 PNG 转换回 RGBA 位图

linux - 在不挂载的情况下读取 cgroups 数据

linux - 在 Debian 上链接依赖于位置的程序集

Python tkinter列表框获取索引

c - 点在直线上特定距离 C