69 votes

Comment crash R?

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.

52voto

brauner Points 1399

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 charge dyn.load("C:/.../Rtools/bin/cygwin1.dll").

49voto

Dirk Eddelbuettel Points 134700

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.

17voto

Thomas Points 14021

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

15voto

Dirk Eddelbuettel Points 134700

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.

6voto

Spacedman Points 33792

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?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X