2017-12-14 6 views
0

clion에서 디버깅하는 동안 실행중인 프로그램을 중지시키는 "중지"버튼 (빨간색 사각형)이 있습니다. 현재 테스트를 작성하고 디버깅하려고합니다. 내 테스트 케이스는 나중에 정리해야하는 임시 디렉토리와 파일을 만들지 만 버튼을 누르면 소멸자 나 신호 처리기가 호출되지 않습니다. "stop"버튼을 누르면 번들로 묶인 GDB에서 방출되는 신호를 잡는 방법은 무엇입니까?

(나는 실제로 GDB에 의해 사용되는 모르겠어요 때문에, 그들 중 많은) 내가 신호를 처리하는 방법입니다 :

DLOG_S(INFO) << "Registering signal handlers for test files cleanup"; 
if (signal(SIGABRT, TemporaryDirectory::handle_cleanup) == SIG_ERR) 
    DLOG_S(INFO) << "Registering SIGABRT failed"; 
if (signal(SIGTERM, TemporaryDirectory::handle_cleanup) == SIG_ERR) 
    DLOG_S(INFO) << "Registering SIGTERM failed"; 
if (signal(SIGINT, TemporaryDirectory::handle_cleanup) == SIG_ERR) 
    DLOG_S(INFO) << "Registering SIGINT failed"; 
if (signal(SIGALRM, TemporaryDirectory::handle_cleanup) == SIG_ERR) 
    DLOG_S(INFO) << "Registering SIGALRM failed"; 

그리고 이것은 (정적) 내 처리기 방법 :

void test_utils::TemporaryDirectory::handle_cleanup(int signo) { 
    DLOG_S(INFO) << "Received signal " << signo; 
    if (signo == SIGABRT || signo == SIGTERM || signo == SIGINT || signo == SIGALRM) { 
     DLOG_S(INFO) << "Cleaning up test files"; 
     TemporaryDirectory::test_files_root().cleanup(); 
    } 
} 

로그에 등록 실패 메시지가 없지만 실제로 처리되는 신호가 표시되지 않습니다.

또한 GDB 콘솔에서 handle all nostop을 입력하여 구성을 변경하려고 시도했지만 그 후에도 응용 프로그램이 종료됩니다.

clion의 번들 된 GDB가 중지 된 후 치료할 방법이 있습니까?

+0

[신호가 중지 버튼에서 전송되었습니다] (https://intellij-support.jetbrains.com/hc/en-us/community/posts/203374490-Signal -sent-by-stopping-button) –

+0

@MarkPlotnick 예, 신호를 보내는 GDB라는 것을 알고 있습니다. 그러나 당신이 clion의 버튼을 누를 때 보내는 신호는 나에게 수수께끼입니다. 또한, 묶음 GDB가 있기 때문에 태그에 clion을 추가했습니다. 독립 실행 형 GDB와는 다르게 작동 할 수도 있습니다. – Jezor

+0

또한 위와 같이 볼 수 있듯이 이미'SIGTERM'을 처리하지 않으려 고 시도했습니다. – Jezor

답변

1

는 지금까지 내가 말할 수있는, CLion는 : 대상이 이미 중지되지

  • 경우, 대상 프로세스에 SIGINT 신호를 보내 다음
  • -gdb-exit 명령을 전송 catch 할 수없는, 무시할 SIGKILL 신호 타겟 죽이고 GDB 될 것이다
  • 는 GDB에 kill 명령을 전송 한 신호를 수신 한 타겟에 대해 GDB로부터 응답을, 만약 있다면, 판독 gdb에, gdb가 종료됩니다.

SIGINT가 전송되고 프로그램에 SIGINT 처리기가 있고 예를 들어 gdb가 대상에 신호를 전달하도록 구성한 경우. handle SIGINT pass nostop noprint이면 대상은 SIGINT 처리기를 실행하지만 kill 명령으로 1 초 후에 사망합니다.

define kill 
    signal SIGTERM 
    shell sleep 5 
end 

(OP : 당신이 당신의 프로그램에게 신호 처리기를 호출하여 정리 할 수있는 기회를 부여하려면

, 당신은 signal 명령을 사용하여, 원하는 신호를 보내도록 GDB의 kill 명령을 다시 정의 할 수 있습니다 shell sleep 5을 사용하지 않고도 원하는대로 작동한다고했습니다.

0

gdb에서 신호를 처리하려면 디버깅 세션에서 handle signal keywords...을 사용하십시오. 세부 사항 : https://sourceware.org/gdb/onlinedocs/gdb/Signals.html

Btw; gdb가 신호를 보내는 것이 아니라 커널입니다. 프로그램을 디버깅하는 동안 당신이 Stop 버튼을 클릭하면

+0

요점은, GDB가 멈출 때 어떤 신호를 보내고 있는지 모르겠다. 나는 'handle all nostop' 명령을 사용했다. 내 이해에서 내 응용 프로그램의 신호를 처리하도록해야하지만 작동하지 않는다. – Jezor

+0

게다가, GDB에서 신호를 보내고 있는지 확실하지 않습니다. 샌드 박스 환경에서 앱을 실행하고 경고없이 죽이는 것처럼 보입니다 ... – Jezor

관련 문제