lor*_*age 49
最简单的方法是调用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").
Dir*_*tel 47
紧急
R包故意崩溃R会话.警告:用于测试.
如何从github安装包也包含在其他问题中.
Tho*_*mas 15
我要从@Spacedman那里窃取一个想法,但是我通过复制他的Twitter提要给了他完整的概念信用:
Segfault #rstats只需一个简单的步骤:
options(device=function(){});plot(1)报告危险,将导致您的R会话崩溃.- Barry Rowlingson(@geospacedman)2014年7月16日
Dir*_*tel 15
正如您对问题的评论中所提到的,最小方法是对系统函数的简单调用abort().在一行中执行此操作的一种方法是
R> Rcpp::cppFunction('int crashMe(int ignored) { ::abort(); }');
R> crashMe(123)
Aborted (core dumped)
$
Run Code Online (Sandbox Code Playgroud)
或者您可以使用内联包:
R> library(inline)
R> crashMe <- cfunction(body="::abort();")
R> crashMe()
Aborted (core dumped)
$
Run Code Online (Sandbox Code Playgroud)
您当然也可以在Rcpp或内联之外执行此操作,但是您需要处理与系统相关的编译,链接和加载方式.
我将在普通的C中这样做,因为我的C++ - foo不是Dirkian:
创建一个C文件,segv.c:
#include <signal.h>
void crashme(){raise(SIGSEGV);}
Run Code Online (Sandbox Code Playgroud)
在命令行编译它(Windows用户必须自己解决这个问题):
R CMD SHLIB segv.c
Run Code Online (Sandbox Code Playgroud)
在R中,加载并运行:
dyn.load("segv.so") # or possibly .dll for Windows users
.C("crashme")
Run Code Online (Sandbox Code Playgroud)
制作段错误:
> .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
Run Code Online (Sandbox Code Playgroud)
这与托马斯在我提交的图形系统错误报告中引用的行为相同,可能会在某一天得到修复.然而,这个双线程将永远引发一个段错误......
也许Dirk可以单行Rcpp-ise吗?