2013-03-27 2 views
3

GDB에서 부동 소수점 예외 (SIGFPE)를 잡아 내고 프로세스로 전달하지 않고 계속 디버깅을 계속하려고합니다. 나는 GDB이 준하십시오 SIGFPE은 GDB가 올바른 위치에서 정지 발생하면GDB : 신호 잡기 및 디버깅 계속

handle SIGFPE stop nopass 

합니다. 문제는 디버깅을 계속할 수 없다는 것입니다. 내가

continue 

또는

signal 0 

GDB

를주는 시도했지만 여전히 문제가되는 라인에 달려 계속 거부합니다.

신호를받은 후 디버깅을 계속할 수 있습니까?

내가 직접 컴파일 한 GDB 7.5.1을 사용하고 있으며, 12.04 우분투 배포본과 함께 제공되는 GDB 7.4를 사용해 보았습니다. 둘 다 같은 행동을합니다.

답변

6

동기 신호 후에 프로그램을 계속 실행하면 신호를 유발 한 동일한 명령이 다시 실행되므로 문제가 다시 발생한다는 것입니다. 신호를 무시하도록 (직접 또는 gdb를 통해) 지시하면 명령을 반복적으로 재실행하는 엄격한 루프로 들어갑니다.

신호를 발생시키는 명령어 다음에 실제로 프로그램을 계속하려면 continue 명령을 실행하기 전에 $pc 레지스터를 수동으로 다음 (또는 다른) 명령어로 설정해야합니다.

+0

통찰력을 가져 주셔서 감사합니다. 당신이 신호를 멈추고 나서 GDB에게 "SIGFPE nostop nopass를 처리하려고했다"고 말한 다음, 계속하기를 시도 했으므로, 다시 시작한 후 두 번째로 신호를 무시합니다. 하지만 GDB 솔기는 그 후에 매달려서 다시 멈출 수 없습니다. 정말 간단한 솔루션이었을 것입니다. 이제 수동으로 프로그램 카운터를 움직여야합니다. – Sogartar

+0

이렇게하면 명령을 건너 뛰지 않고 정확히 같은 방법으로 프로그램을 실행할 수있는 방법이 없습니다. – Sogartar

+0

@Sogartar 당신은 똑같은 방식으로 실행하고 정확히 같은 결과를 얻습니다. – Ruslan