Est-il un moyen simple de déclencher un accident dans R? C'est pour des fins de test uniquement, pour voir comment un programme qui utilise R dans le fond réagit à un crash et aider à déterminer si les quelques rares problèmes sont dus à des accidents ou pas.
Réponses
Trop de publicités?Le plus simple est d'appeler C
-code. C
fournit une fonction standard abort()
[1] qu'est-ce que vous voulez. Vous devez appeler: .Call("abort")
.
@Philippe souligné vous pourriez avoir besoin de charger libc
via:
sur Linux,
dyn.load("/lib/x86_64-linux-gnu/libc.so.6")
avant de délivrer.Call("abort")
. Le chemin d'accès peut bien sûr varier en fonction de votre système.sur OS X,
dyn.load("/usr/lib/libc.dylib")
sur Windows (je l'ai juste testé sur XP comme je ne pouvais pas obtenir une version plus récente.) vous aurez besoin d'installer
Rtools
[2]. Après cela, vous devriez chargedyn.load("C:/.../Rtools/bin/cygwin1.dll")
.
Il y a tout un paquet sur GitHub dédié à cela:
crash
Package R volontairement plantage d'une de la R de la session. AVERTISSEMENT: pour le test.
Comment faire pour installer un package à partir de github est couvert dans d'autres questions.
Je vais voler une idée de @Spacedman, mais je suis lui donnant plein conceptuel de crédit par la copie de son compte Twitter:
Erreur #rstats en une seule étape facile:
options(device=function(){});plot(1)
signalé le Danger, va se planter votre R session. — Barry Rowlingson (@geospacedman) 16 juillet 2014
Comme mentionné dans un commentaire à votre question, l'approche minimale est un simple appel à la fonction système d' abort()
. Une façon de le faire en une seule ligne est à
R> Rcpp::cppFunction('int crashMe(int ignored) { ::abort(); }');
R> crashMe(123)
Aborted (core dumped)
$
ou vous pouvez utiliser le inline package:
R> library(inline)
R> crashMe <- cfunction(body="::abort();")
R> crashMe()
Aborted (core dumped)
$
Bien sûr, vous pouvez également le faire à l'extérieur du Rcpp ou en ligne, mais vous devez traiter avec le système dépendant des moyens de compilation, de liaison et de chargement.
Je vais le faire dans la plaine, C parce que mon C++-foo n'est pas Dirkian:
Créer un fichier C, segv.c
:
#include <signal.h>
void crashme(){raise(SIGSEGV);}
Compiler en ligne de commande (pour les utilisateurs de windows auront à faire ce travail pour eux-mêmes):
R CMD SHLIB segv.c
Dans R, de charger et d'exécuter:
dyn.load("segv.so") # or possibly .dll for Windows users
.C("crashme")
La production d'une erreur de segmentation:
> .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
C'est le même comportement que celui de Thomas références dans le graphique ci-système de rapport de bug que j'ai déposé et pourrait se fixe un jour. Cependant, ce deux-liner doit toujours faire une erreur de segmentation...
Peut-être que Dirk peut-on-ligne-Rcpp-ise?