2011-10-19 3 views
4

FreeBSD 6.2 및 OS에서 C++ 프로그램이 충돌하여 코어 덤프를 생성 할 수있었습니다. 일부 스택 프레임을 절단하여 명령 포인터를 재설정하고 gdb에서 프로세스를 다시 시작하는 것이 가능합니까?코어 덤프로 인한 충돌에서 복구

답변

2

예, gdb는 실행중인 프로그램뿐만 아니라 코어 덤프도 디버깅 할 수 있습니다. a.out이 프로그램의 실행 파일의 이름이라고 가정하고 a.core은 핵심 파일의 이름, 그래서 같은 GDB를 호출 :

gdb a.out a.core 

을 그리고 당신이 어떤 방법으로 실행을 계속할 수 없습니다를 제외하고 당신은 (정상처럼 디버깅 할 수 있습니다 당신이 할 수 있더라도, 프로그램은 다시 충돌 할 것입니다.) 스택 추적, 레지스터, 메모리 등을 검사 할 수 있습니다.

+1

GDB는 어떤 프린터도 실행할 수 없기 때문에 "프로그램 실행과 마찬가지로"코어 덤프를 디버깅하지 않습니다 .http : //yosefk.com/blog/ 매우 이상하게도 gdb-ve-ery-fun.html – ACyclic

3

일부 스택 프레임을 절단하고 명령 포인터를 재설정하고 gdb에서 프로세스를 다시 시작할 수 있습니까?

나는 당신이 : 프로세스 상태를 변경하고 처음부터 충돌이없는 것처럼 다시 실행을 시작하도록 설정했다고 가정합니다.

아니요. GDB (마술처럼이 기능이있는 경우)가 파일 설명자를 처리하는 방법 (커널이 프로세스가 종료 될 때 자동으로 닫히는 방법)을 제안 하시겠습니까? 이것의

+0

GDB가 함수를 호출하고 변수를 할당 할 수있는 능력을 가지고 있다고 잘못 생각하지 않는다면 적어도 이론 상으로는 프로세스가 다시 시작되는 지점에서 파일 설명자를 복원 할 수 있습니다. – Droopov

+0

"함수를 호출 할 수있는 능력이 있습니다"- "라이브"의 열등한 프로세스가있는 경우에만 코어를 디버깅 할 때 GDB는 "파일 설명자 복원"을 할 수 없습니다 : 더 이상 존재하지 않는 파일을 가리킬 수 있거나 또한 파일 오프셋은 커널에 의해서만 유지되므로 GDB는 커널을 복원 할 방법이 없습니다. –

0

가능한 중복 : Best practices for recovering from a segmentation fault

요약 : 그것은 가능하지만 권장하지 않습니다. 이를 수행하는 방법은 시그널 핸들러에서 setjmp()와 longjmp()를 사용하는 것입니다. (완전한 소스 코드 예제를 중복 된 게시물로 보시기 바랍니다.