plugin - Cómo colgar R?
plantillas contact form 7 (5)
¿Hay una manera simple de desencadenar un bloqueo en R? Esto es solo para fines de prueba, para ver cómo un determinado programa que usa R en el fondo reacciona ante un bloqueo y ayuda a determinar si algunos problemas raros se deben a fallas o no.
Como se menciona en un comentario a su pregunta, el enfoque mínimo es una simple llamada a la función del sistema abort()
. Una forma de hacerlo en una línea es
R> Rcpp::cppFunction(''int crashMe(int ignored) { ::abort(); }'');
R> crashMe(123)
Aborted (core dumped)
$
o puede usar el paquete en línea:
R> library(inline)
R> crashMe <- cfunction(body="::abort();")
R> crashMe()
Aborted (core dumped)
$
Por supuesto, también puede hacer esto fuera de Rcpp o en línea, pero luego debe tratar con las formas dependientes del sistema de compilación, vinculación y carga.
Haré esto en C simple porque mi C ++ - foo no es Dirkian:
Cree un archivo C, segv.c
:
#include <signal.h>
void crashme(){raise(SIGSEGV);}
Compilarlo en la línea de comandos (los usuarios de Windows tendrán que resolver esto por sí mismos):
R CMD SHLIB segv.c
En R, carga y ejecuta:
dyn.load("segv.so") # or possibly .dll for Windows users
.C("crashme")
Produciendo un 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
Este es el mismo comportamiento que el que Thomas menciona en el informe de error del sistema de gráficos que he archivado y que podría arreglarse algún día. Sin embargo, este dos líneas siempre planteará un segfault ...
Tal vez Dirk puede una línea-Rcpp-¿cierto?
La forma más fácil es llamar a C
code. C
proporciona una función estándar abort()
[1] que hace lo que quiere. .Call("abort")
llamar: .Call("abort")
.
Como señaló @Phillip, puede que necesite cargar libc
través de:
en Linux,
dyn.load("/lib/x86_64-linux-gnu/libc.so.6")
antes de emitir.Call("abort")
. La ruta puede variar según el sistema.en OS X,
dyn.load("/usr/lib/libc.dylib")
en Windows (lo probé en XP porque no pude obtener una versión más nueva). Necesitará instalar
Rtools
[2] . Después de eso, debe cargardyn.load("C:/.../Rtools/bin/cygwin1.dll")
.
Voy a robarle una idea a @Spacedman, pero le estoy dando crédito conceptual completo al copiar de su cuenta de Twitter:
Segfault #rstats en un simple paso:
options(device=function(){});plot(1)
reportado Danger, bloqueará su sesión R. - Barry Rowlingson (@geospacedman) 16 de julio de 2014