如何崩溃R?
有一个简单的方法来触发在R的崩溃? 这仅用于testing目的,看看在后台使用R的某个程序如何对崩溃做出反应,并帮助确定是否有一些罕见的问题是由于崩溃造成的。
最简单的方法是调用C
代码。 C
提供了一个标准函数abort()
[1] ,它可以做你想做的事情。 您需要调用: .Call("abort")
。
由于@Phillip指出你可能需要通过以下方式加载libc
:
-
在发出
.Call("abort")
之前,在Linux上,dyn.load("/lib/x86_64-linux-gnu/libc.so.6")
.Call("abort")
。 path可能会因系统而异。 -
在OS X上,
dyn.load("/usr/lib/libc.dylib")
-
在Windows上(我只是在XP上testing,因为我无法获得更新的版本),您将需要安装
Rtools
[2] 。 之后,你应该加载dyn.load("C:/.../Rtools/bin/cygwin1.dll")
。
GitHub上有一个完整的包 :
紧急
R软件包有意使R会话崩溃。 警告:打算进行testing。
其他问题涵盖了如何从github安装软件包 。
我会从@Spacedman窃取一个想法,但是我通过从他的Twitter供稿复制给他完整的概念信用:
Segfault #rstats在一个简单的步骤:
options(device=function(){});plot(1)
报告危险,将崩溃您的R会话。 – Barry Rowlingson(@geospacedman) 2014年7月16日
正如您对问题的评论中所提到的,最简单的方法是对系统函数abort()
的简单调用。 在一条线上做到这一点的一种方法是
R> Rcpp::cppFunction('int crashMe(int ignored) { ::abort(); }'); R> crashMe(123) Aborted (core dumped) $
或者你可以使用内联包:
R> library(inline) R> crashMe <- cfunction(body="::abort();") R> crashMe() Aborted (core dumped) $
你当然也可以在Rcpp或inline之外做这个,但是你需要处理编译,链接和加载的系统相关的方法。
我会用纯C做这个,因为我的C ++ – foo不是Dirkian:
创build一个C文件, segv.c
:
#include <signal.h> void crashme(){raise(SIGSEGV);}
编译它在命令行(Windows用户将不得不自己解决):
R CMD SHLIB segv.c
在R中,加载并运行:
dyn.load("segv.so") # or possibly .dll for Windows users .C("crashme")
产生一个段错误:
> .C("crashme") *** caught segfault *** address 0x1d9e, cause 'unknown' Traceback: 1: .C("crashme") Possible actions: 1: abort (with core dump, if enabled) 2: normal R exit 3: exit R without saving workspace 4: exit R saving workspace Selection: 1 aborting ... Segmentation fault
这与Thomas提到的graphics系统错误报告中的行为是一样的,我已经提交并可能在一天内得到修复。 然而,这两个class轮将始终提高段错误…
也许德克可以一行-Rcpp-ise吗?