2010-05-20 4 views
81

segmentation fault이 발생하는 코드에서 실수가 어디에 있는지 어떻게 판단 할 수 있습니까?세그멘테이션 오류를 일으키는 코드 행을 결정 하시겠습니까?

일부 코드를 작성한 후 세그먼테이션 결함이있는 곳을 확인하려면 내 컴파일러 (gcc)가 내 프로그램의 오류 위치를 표시 할 수 있습니까?

+2

gcc/gdb는 사용할 수 없습니다. segfault가 발견 된 곳을 찾을 수 있지만 실제 오류는 완전히 다른 위치에있을 수 있습니다. –

답변

121

GCC는이를 수행 할 수 없지만 GDB는이를 수행 할 수 있습니다. 이처럼 -g 스위치를 사용하여 프로그램을 컴파일합니다

gcc program.c -g 

그리고 GDB를 사용

$ gdb ./a.out 
(gdb) run 
<segfault happens here> 
(gdb) backtrace 
<offending code is shown here> 

Here 당신이 GDB를 시작하는 멋진 튜토리얼입니다.

+9

gdb의 백 트레이스 ('bt')를 사용하면 빠르게 일어난 곳을 찾을 수 있습니다. – nategoose

+1

@nategoose : True :) – nc3b

+12

segfault가 발생하는 곳은 일반적으로 코드에서 "원인이되는 실수"가 어디인지에 대한 단서입니다.중요한 단서이지만 문제가있는 곳은 아닙니다. – mpez0

13

코어 덤프를 사용하여 gdb로 검사 할 수도 있습니다. 유용한 정보를 얻으려면 -g 플래그로 컴파일해야합니다.

Segmentation fault (core dumped) 

코어 파일이 현재 디렉토리에 기록됩니다

은 할 때마다이 메시지가 나타납니다. 그리고 명령으로 검사 할 수 있습니다.

gdb your_program core_file 

파일에 프로그램이 손상되었을 때의 메모리 상태가 포함되어 있습니다. 코어 덤프는 소프트웨어를 배포하는 동안 유용 할 수 있습니다.

시스템에서 코어 덤프 파일 크기를 0으로 설정하지 않았는지 확인하십시오. 하지만

ulimit -c unlimited

주의 : 당신은 무제한으로 설정할 수 있습니다! 그 코어 덤프가 커질 수 있습니다.

+0

나는 최근에 arch-linux로 전환했다. 현재 디렉토리에 코어 덤프 파일이 없습니다. 어떻게 생성 할 수 있습니까? – Abhinav

+0

생성하지 마십시오. 리눅스는 그렇다. 코어 덤프는 다른 Linuces - Google 주변에 다른 위치에 저장됩니다. 아치 리눅스의 경우, https://wiki.archlinux.org/index.php/Core_dump – Mawg

2

코어 덤프에 대한 루카스의 대답이 좋습니다. 내 .cshrc 있음 :

alias core 'ls -lt core; echo where | gdb -core=core -silent; echo "\n"' 

'core'를 입력하여 백 트레이스를 표시합니다. 그리고 날짜 스탬프, 내가 올바른 파일 :(에서 찾고 있어요 보장하기 위해

추가 :.. 스택 손상 버그가있는 경우, 코어 덤프에 적용되는 역 추적 종종 쓰레기이 경우 gdb 내에서 프로그램을 실행하면 오류를 쉽게 재현 할 수 있다고 가정 할 때 더 나은 결과를 얻을 수 있으며 코어를 동시에 덤프하는 여러 프로세스를주의해야합니다. 일부 OS는 코어 파일의 이름에 PID를 추가합니다.

+4

을 읽고 처음에 코어 덤프를 사용하려면'ulimit -c unlimited'를 잊지 마십시오. –

+0

@James : 수정하십시오. 루카스는 이미 이것을 언급했다. 그리고 여전히 csh에 갇혀있는 사람들에게는 '한계'를 사용하십시오. 그리고 나는 CYGWIN stackdumps를 읽을 수 없었습니다 (그러나 2 년에서 3 년 동안 시도하지 않았습니다). –

24

또한 Valgrind를 사용해 볼 수도 있습니다. Valgrind를 설치하고 valgrind --leak-check = full을 실행하면 프로그램이 실행되고 스택 t가 표시됩니다 모든 segfaults에 대한 경쟁뿐만 아니라 유효하지 않은 메모리 읽기 또는 쓰기와 메모리 누수가 발생할 수 있습니다. 정말 유용합니다.

+2

+1, Valgrind는 메모리 오류를 발견하는 데 훨씬 빠르고 쉽게 사용할 수 있습니다. 디버깅 기호가있는 최적화되지 않은 빌드에서는 segfault가 발생한 위치와 이유를 정확히 알려줍니다. –

+0

슬프게도 내 segfault는 -g -O0으로 컴파일 할 때 사라지고 valgrind와 결합됩니다. – JohnMudd

관련 문제