2013-12-12 4 views
-1

세그먼트 화 오류를 생성하고 코어 파일을 생성하는 C 프로그램을 실행했습니다. 코어 파일에서 세분화 오류가 발생하는 위치에 대한 명확한 설명이 필요합니다. 해당 코어 파일을 읽는 방법.코어 파일에서 오류를 찾는 방법은 무엇입니까?

#include "stdio.h" 
main() 
{ 
    char *ptr; 
    *ptr=100; 
    printf("\nPointer Value is :%s\n", ptr) ; 
} 

당신은이 프로그램을 실행하고이 명령을 무제한 사용으로 코어 파일 크기의 ulimit를 변경해야 :

$ulimit -c unlimited 

다음이 C 프로그램을 컴파일을하고 프로그램 세그먼트 오류가 발생합니다 실행 코어 파일 이 생성됩니다. 코어 파일을 읽고 조각화 오류가 발생한 위치를 찾는 방법.

미리 감사드립니다.

답변

4

포인터가 초기화되지 않았습니다 (즉, 포인터를 아무 것도 가리 키지 않음). 초기화되지 않은 모든 지역 변수는 그 값이 불확실하고 무작위이기 때문에 어디에서 가리키는 지 알 수 없습니다.

다음이 임의의 위치에 숫자를 쓰려고 시도하면 정의되지 않은 동작이 발생합니다.그것은 프로그램을 충돌 할 수 있습니다, 또는 nasal demons의 원인, 정의되지 않은 행동은 예측할 수 없으며, 그것은 일, 그것은 예상치 못한 원인 일이 일어날 수도있다.

당신은 번 이득이 정의되지 않은 동작의 두 인스턴스에 연결되는 문자열로 그 포인터를 사용하려고 : printf 문자열 종결을 찾아 바이트 후에 바이트를 읽을 때 포인터가 한 번 더 초기화되지 않은, 그리고 일단 때문에 .


은 정의되지 않은 동작이 다른 경우가 있습니다, 그것은 당신의 main 기능이 올바르게 정의되지 않는 것입니다. int을 반환하고 void 인수 또는 intchar** 인수를 취해야합니다. 이것은 C 스펙에 있습니다. 적절한 main을 가지고 있지 않은 것은 기술적으로 불법 프로그램이지만, 불행히도 컴파일러가 사용하지 못하게하는 것이 일반적입니다.

$ gdb ./myProgram 
... 
(gdb) run 
Starting program: /home/someone/myProgram 

Program received signal SIGSEGV, Segmentation fault. 
0x0000000000400518 in main() at myProgram.c:5 
5  *ptr=100; 
(gdb) 

을하거나 충돌 및 코어 덤프를 생성 한 후, 당신은 코어 덤프를 사용하여 디버거를 실행합니다 :


는 디버거에서 프로그램을 실행하거나, 디버거에서 사용하려면 그런데
$ ./myProgram 
Segmentation fault (core dumped) 
$ gdb ./myProgram core 
... 
Reading symbols from /home/someone/myProgram...done. 
[New LWP 4655] 

Core was generated by `./myProgram'. 
Program terminated with signal 11, Segmentation fault. 
#0 0x0000000000400518 in main() at myProgram.c:5 
5  *ptr=100; 
(gdb) 

디버깅 정보 (이하 '심볼'디버거 판독) 프로그램은 -g 플래그 컴파일되어야한다.

+0

질문 문언은 약간 모호합니다. 그러나 질문은 프로그램이이 예제보다 덜 사소한 경우에 대비하여 "핵심 덤프 파일을 읽는 방법"에 관한 문제라고 생각합니다. – DCoder

+0

@DCoder 예, 제발 부탁드립니다. ... –

+0

@Q_SaD 내 대답을 업데이트했습니다. –

2

디버거 사용법을 배워야합니다. 나는 당신이 리눅스를 사용하고 있다고 생각하고있다.

그래서 첫째, 당신은 약 ptr가 초기화되지 않는 경고를 얻을 수 있습니다

gcc -g -Wall prog.c -o progbin 

로 프로그램을 컴파일; 그것을 고쳐주세요. 당신은 아마 그런 다음 (gdb) 프롬프트 help에서

gdb progbin 

라이브 디버거를 사용

char somebuf[10]; 
ptr = somebuf; 

또는

ptr = malloc(10); 
if (!ptr) { perror("malloc"); exit(EXIT_FAILURE); }; 

같은

뭔가를해야합니다. 그런 다음 GDB documentation 읽기 : 매우 유용한 GDB 명령은 bt (역 추적) (다음), r (실행), b (휴식), c (계속) p (인쇄), n, s (단계), watch ...

디버깅하는

당신이 이미는이 코어 덤프 (즉, "코어 파일을 읽기"입니다) :

gdb progbin core 

을 일부 GDB 명령을 사용, 특히 bt (역 추적을 얻을 수있는 call stack) 및 p (에 일부 변수 나 표현식을 출력하고 up & down을 호출 스택을 통해 처리합니다. 컴파일러에 -g 옵션을 사용하여 progbin을 빌드했는지 확인하십시오.

core 파일이 주어지면 file core 명령으로 중단 된 프로그램의 파일을 가져올 수 있습니다.

+1

RTFM 스타일 주석은 도움이되지 않습니다. – hillu

+0

유용하다. –

+0

RTFM 이후에 물질을 추가 한 후에, 나는 (그리고 -1)을 되 찾는다. – hillu

1

코어 덤프 파일을 gdb에 전달하여 읽을 수 있습니다. wikipedia에 따르면 코어 덤프 파일은 일반적으로 프로그램이 비정상적으로 종료 (충돌)했을 때 특정 시간에 컴퓨터 프로그램의 작업 메모리에 기록 된 상태로 구성됩니다.

일반적으로 gdb는 디버깅 목적으로 실행 파일을 허용합니다. gdb에 실행 파일을 전달하면 해당 프로그램을 실행하고 관련 정보를 제공합니다.

실행 파일과 함께 코어 덤프 파일을 gdb에 전달하면 이전에 충돌 한 프로그램을 검사합니다. 디버거에 의해 사용되는 디버깅 주석을 거의 또는 전혀 최적화 프로그램을 컴파일

+1

좋은데,'gdb'는'core' 덤프에서 프로그램을 실행하지 않습니다. 그것! –

+0

@BasileStarynkevitch, 그게 무슨 뜻인지 ... 당신은 내 게시물을 편집하여 그것을 좋게 만들 수 있습니다. – Chinna

2

것들을 많이하게 쉽게 :

$ gcc -g -ggdb -O0 foo.c -o foo 

... GDB에 코어 파일을로드 한 후

$ gdb progbin core 

... 충돌이 인쇄되어 일어난 위치 :

Core was generated by `./foo'. 
Program terminated with signal 11, Segmentation fault. 
#0 0x0000000000400509 in main() at foo.c:5 
5   *ptr=100; 

더 복잡한 프로그램에서는 백 트레이스를 인쇄하는 것이 좋습니다. ( 이 간단한 프로그램에서는 더 이상 유용한 정보를 얻을 수 없습니다 :

(gdb) bt 
#0 0x0000000000400509 in main() at foo.c:5 
관련 문제