Program Tip

R을 충돌시키는 방법?

programtip 2020. 11. 20. 09:27
반응형

R을 충돌시키는 방법?


R에서 충돌을 트리거하는 간단한 방법이 있습니까? 이것은 테스트 목적으로 만 사용되며 백그라운드에서 R을 사용하는 특정 프로그램이 충돌에 어떻게 반응하는지 확인하고 일부 드문 문제가 충돌로 인한 것인지 여부를 확인하는 데 도움이됩니다.


가장 쉬운 방법은 C-code 를 호출하는 것 입니다. 원하는 것을 수행 C하는 표준 기능 abort()[1]제공합니다 . 으로 전화해야합니다 .Call("abort").

@Phillip이 지적했듯이 다음을 libc통해 로드해야 할 수도 있습니다 .

  • 리눅스에, 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").


GitHub 에는 다음과 같은 전용 패키지가 있습니다 .

크래시

의도적으로 R 세션을 중단시키는 R 패키지. 경고 : 테스트 용입니다.

github에서 패키지설치하는 방법 은 다른 질문에서 다룹니다.


@Spacedman에서 아이디어를 훔칠 것입니다.하지만 그의 Twitter 피드에서 복사하여 그에게 완전한 개념적 크레딧을 제공합니다.

Segfault #rstats를 한 번의 쉬운 단계로 options(device=function(){});plot(1)보고 : 위험을보고하면 R 세션이 중단됩니다. — Barry Rowlingson (@geospacedman) 2014 년 7 월 16 일


귀하의 질문에 대한 의견에서 언급했듯이 최소한의 접근 방식은 시스템 함수에 대한 간단한 호출 abort()입니다. 한 줄로이 작업을 수행하는 한 가지 방법은

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 또는 인라인 외부에서도이 작업을 수행 할 수 있지만 시스템에 따라 컴파일, 링크 및로드하는 방법을 처리해야합니다.


내 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가 언급 한 것과 동일한 동작이며 언젠가 수정 될 수 있습니다. 그러나이 2 개의 라이너는 항상 세그 폴트를 올릴 것입니다 ...

Dirk가 한 줄로 Rcpp-ise를 할 수 있을까요?

참고 URL : https://stackoverflow.com/questions/25139247/how-to-crash-r

반응형