我试图通过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
答案 0 :(得分:0)
我对Frama-C一无所知。但是,错误消息来自某人(OCaml' Python')运行时,表明系统调用失败并出现ECHILD
错误。 system()
生成的两个系统调用是fork()
和waitpid()
。它是可以返回ECHILD
的后一个系统调用。这意味着没有儿童过程等待。一个很好的可能性是fork()
失败了。当系统充满进程(不太可能)或达到每用户进程限制时,fork()
会失败。您可以检查自己是否遇到了这种限制。
我遇到的另一种可能性是代码的其他部分已经使用信号处理(SIGCHLD
)处理子进程。因此,没有子进程等待的原因是它已经在其他地方处理过了。这很复杂,所以我希望这不是问题所在。