有没有简单的方法来触发R崩溃?这仅出于测试目的,目的是查看在后台使用R的某个程序对崩溃的反应,并帮助确定某些罕见问题是否由崩溃引起。
quit
使用非零状态吗?
有没有简单的方法来触发R崩溃?这仅出于测试目的,目的是查看在后台使用R的某个程序对崩溃的反应,并帮助确定某些罕见问题是否由崩溃引起。
quit
使用非零状态吗?
Answers:
最简单的方法是调用C
-code。C
提供了您想要的功能的标准功能abort()
[1]。您需要致电:.Call("abort")
。
正如@Phillip指出的那样,您可能需要libc
通过以下方式加载:
在Linux上dyn.load("/lib/x86_64-linux-gnu/libc.so.6")
发行.Call("abort")
。当然,该路径可能会因您的系统而异。
在OS X上, dyn.load("/usr/lib/libc.dylib")
在Windows上(我刚刚在XP上进行了测试,因为我无法获得较新的版本。)您将需要安装Rtools
[2]。之后,您应该加载dyn.load("C:/.../Rtools/bin/cygwin1.dll")
。
Error in .Call("abort") : C symbol name "abort" not in load table
。使用RStudio时会崩溃。
dyn.load("/lib/x86_64-linux-gnu/libc.so.6")
。该路径在您的系统上可能会有所不同,请使用locate libc.so.6
它来查找。
crash
包装要求abort
也是如此。至少据我所知,但我的经验远不如您!
abort()
是的。
abort
,很好。
library(devtools); install_github('jdanielnd/crash')
。然后,您可以与library(crash); crash()
我打算从@Spacedman窃取一个想法,但是我要通过从他的Twitter feed中复制来给予他全部概念上的信任:
一步即可完成Segfault #rstats:
options(device=function(){});plot(1)
报告为Danger,将使您的R会话崩溃。— Barry Rowlingson(@geospacedman)2014年7月16日
如您对问题的评论中所述,最小方法是对system函数的简单调用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或内联之外执行此操作,但是随后您需要处理依赖于系统的编译,链接和加载方式。
abort()
ed。
我将在纯C语言中执行此操作,因为我的C ++-foo不是Dirkian:
创建一个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所引用的行为相同,并且可能有一天会得到修复。但是,这种两层线总是会引起段错误。
也许Dirk可以单行Rcpp-ise吗?
cfunction()
在C模式下使用i。您可以在此处执行相同的操作,以使您的答案更容易/更简洁/与操作系统无关。Rcpp的用途仅仅是部署更简单的构建机制,本身不存在C ++。
spacedman <- inline::cfunction(body="raise(SIGSEGV);", include="#include <signal.h>")
-并且没有C ++受到伤害^使用了这个答案。
spacedman <- Rcpp::cppFunction("void crashme() { ::raise(SIGSEGV); }", includes="#include <signal.h>")
-在那里。
options(expressions=300000)
运行无限递归,但R写得足够好,不会崩溃:)