segmentation fault이 발생하는 코드에서 실수가 어디에 있는지 어떻게 판단 할 수 있습니까?세그멘테이션 오류를 일으키는 코드 행을 결정 하시겠습니까?
일부 코드를 작성한 후 세그먼테이션 결함이있는 곳을 확인하려면 내 컴파일러 (gcc
)가 내 프로그램의 오류 위치를 표시 할 수 있습니까?
segmentation fault이 발생하는 코드에서 실수가 어디에 있는지 어떻게 판단 할 수 있습니까?세그멘테이션 오류를 일으키는 코드 행을 결정 하시겠습니까?
일부 코드를 작성한 후 세그먼테이션 결함이있는 곳을 확인하려면 내 컴파일러 (gcc
)가 내 프로그램의 오류 위치를 표시 할 수 있습니까?
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를 시작하는 멋진 튜토리얼입니다.
코어 덤프를 사용하여 gdb로 검사 할 수도 있습니다. 유용한 정보를 얻으려면 -g
플래그로 컴파일해야합니다.
Segmentation fault (core dumped)
코어 파일이 현재 디렉토리에 기록됩니다
은 할 때마다이 메시지가 나타납니다. 그리고 명령으로 검사 할 수 있습니다.gdb your_program core_file
파일에 프로그램이 손상되었을 때의 메모리 상태가 포함되어 있습니다. 코어 덤프는 소프트웨어를 배포하는 동안 유용 할 수 있습니다.
시스템에서 코어 덤프 파일 크기를 0으로 설정하지 않았는지 확인하십시오. 하지만
ulimit -c unlimited
주의 : 당신은 무제한으로 설정할 수 있습니다! 그 코어 덤프가 커질 수 있습니다.
코어 덤프에 대한 루카스의 대답이 좋습니다. 내 .cshrc 있음 :
alias core 'ls -lt core; echo where | gdb -core=core -silent; echo "\n"'
'core'를 입력하여 백 트레이스를 표시합니다. 그리고 날짜 스탬프, 내가 올바른 파일 :(에서 찾고 있어요 보장하기 위해
추가 :.. 스택 손상 버그가있는 경우, 코어 덤프에 적용되는 역 추적 종종 쓰레기이 경우 gdb 내에서 프로그램을 실행하면 오류를 쉽게 재현 할 수 있다고 가정 할 때 더 나은 결과를 얻을 수 있으며 코어를 동시에 덤프하는 여러 프로세스를주의해야합니다. 일부 OS는 코어 파일의 이름에 PID를 추가합니다.
을 읽고 처음에 코어 덤프를 사용하려면'ulimit -c unlimited'를 잊지 마십시오. –
@James : 수정하십시오. 루카스는 이미 이것을 언급했다. 그리고 여전히 csh에 갇혀있는 사람들에게는 '한계'를 사용하십시오. 그리고 나는 CYGWIN stackdumps를 읽을 수 없었습니다 (그러나 2 년에서 3 년 동안 시도하지 않았습니다). –
또한 Valgrind를 사용해 볼 수도 있습니다. Valgrind를 설치하고 valgrind --leak-check = full을 실행하면 프로그램이 실행되고 스택 t가 표시됩니다 모든 segfaults에 대한 경쟁뿐만 아니라 유효하지 않은 메모리 읽기 또는 쓰기와 메모리 누수가 발생할 수 있습니다. 정말 유용합니다.
+1, Valgrind는 메모리 오류를 발견하는 데 훨씬 빠르고 쉽게 사용할 수 있습니다. 디버깅 기호가있는 최적화되지 않은 빌드에서는 segfault가 발생한 위치와 이유를 정확히 알려줍니다. –
슬프게도 내 segfault는 -g -O0으로 컴파일 할 때 사라지고 valgrind와 결합됩니다. – JohnMudd
gcc/gdb는 사용할 수 없습니다. segfault가 발견 된 곳을 찾을 수 있지만 실제 오류는 완전히 다른 위치에있을 수 있습니다. –