web-dev-qa-db-ja.com

Rをクラッシュさせる方法は?

Rでクラッシュをトリガーする簡単な方法はありますか?これはテスト目的のみであり、バックグラウンドでRを使用する特定のプログラムがクラッシュにどのように反応するかを確認し、まれな問題がクラッシュによるものかどうかを判断するのに役立ちます。

66
Szabolcs

最も簡単な方法は、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")をロードする必要があります。

48
lord.garbage

これに専用の完全な GitHub上のパッケージ があります。

クラッシュ

意図的にRセッションをクラッシュさせるRパッケージ。警告:テスト用です。

githubからパッケージをインストールする方法 については、他の質問で説明しています。

47

@Spacedmanからアイデアを盗むつもりですが、彼のTwitterフィードからコピーすることで、彼に完全な概念的クレジットを与えます。

Segfault #rstatsを1つの簡単なステップで:options(device=function(){});plot(1)は危険を報告し、Rセッションをクラッシュさせます。 —バリー・ローリングソン(@geospacedman) 2014年7月16日

15
Thomas

あなたの質問へのコメントで述べたように、最小限のアプローチはシステム関数abort()への単純な呼び出しです。これを1行で行う1つの方法は、

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外またはインラインで行うこともできますが、その場合は、システムに依存するコンパイル、リンク、およびロードの方法を処理する必要があります。

14

私のC++-fooはDirkianではないので、私はこれをプレーンCで行います:

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

Segfaultの作成:

> .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が参照しているものと同じ動作であり、1日で修正される可能性があります。ただし、この2ライナーは常にsegfaultを発生させます...

多分Dirkはそれを1行Rcpp-iseできますか?

6
Spacedman

Rをクラッシュさせたい場合は、これを試してください

lapply("", function(x) eval(sys.call(1)))

(すぐに「Rセッションが中止されます」になるため、実行する前にすべてを保存してください)

編集:これはWindows 10で動作します。

0
machine