如何崩溃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吗?