怎么撞R?

Sza*_*lcs 64 crash r

有没有一种简单的方法来触发R中的崩溃?这仅用于测试目的,以查看在后台使用R的某个程序如何对崩溃做出反应并帮助确定是否有一些罕见的问题是由于崩溃造成的.

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").

  • Windows怎么样? (9认同)
  • `crash`包也调用`abort`.至少就我所见,但我并不像你那么有经验! (3认同)
  • 你可能意味着Rtools包作为R从未在Cygwin上得到支持.约书亚过于礼貌而无法直接提及的是,你的答案并非完全便携.但是,`abort()`是关键. (3认同)
  • 你必须先加载libc:`dyn.load("/ lib/x86_64-linux-gnu/libc.so.6")`.路径可能因系统而异,请使用`locate libc.so.6`来查找它. (2认同)

Dir*_*tel 47

GitHub上一整套专用于此的软件包:

紧急

R包故意崩溃R会话.警告:用于测试.

如何从github安装包也包含在其他问题中.

  • 它叫做"abort",很好. (21认同)
  • 假设您已安装所需的工具([*nix](http://cran.r-project.org/doc/manuals/R-admin.html#Essential-and-useful-other-programs-under-a-Unix_002dalike ),[Windows](http://cran.r-project.org/doc/manuals/R-admin.html#The-Windows-toolset)),从github安装这个包的一种方法是:`library(devtools) ); install_github( 'jdanielnd /崩溃')`.然后你可以用`library(crash)崩溃你的R会话; 崩溃()` (8认同)

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或内联之外执行此操作,但是您需要处理与系统相关的编译,链接和加载方式.


Spa*_*man 6

我将在普通的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吗?

  • `spacedman < - inline :: cfunction(body ="raise(SIGSEGV);",include ="#include <signal.h>")` - 并且没有C++受到伤害^在这个答案中使用了. (3认同)