2011-12-12 1 views
4

EDIT 입력 해 주셔서 감사합니다. 제 질문은 약간 퍼지기 만 한 것 같아요. 나는 현명한 대답을 받아 들였고 2 시간의 고집적 출구 (9) 디버깅을 선택하여 적어도 두 개의 버그를 제거하고 이제는 어려운 수수께끼를 풀어 낸 것을 자랑스럽게 생각합니다. ;-)C 소스 코드의 가능한 문제점을 찾아내는 도구와 방법

http://www.spoj.pl에 대한 문제 해결을 위해 많은 시간을 투자했으며 프로그램은 문제 설명에서 나온 테스트 샘플뿐만 아니라 내가 직접 만든 모든 테스트 샘플과 함께 로컬로 작동합니다.

그러나 프로그램은 서버에서 SIGSEGV으로 중단됩니다. 거기에 C99 strict 언어 옵션을 선택하여 업로드했습니다.

수정 : SIGSEGV이 어떻게 발생했는지에 대한 힌트가 전혀 없다는 것을 분명히 다시 설명하겠습니다. 내가 가지고있는 유일한 정보는 전혀 발생하지 않는다는 것입니다. 이걸 지적한 @Oli Charlesworth에게 감사드립니다.

로컬, 나는 모두

gcc -Wall -Wextra -std=c99 -o prog prog.c 

gcc -Wall -Wextra -m32 -std=c99 -o prog prog.c 

컴파일 모든 것이 잘 작동했다. 64 비트 버전은 일반 Debian squeeze amd64 시스템에서 컴파일되었습니다.이 시스템은 데비안 Lenny amd64 시스템의 -m32 버전입니다 (단, Squeeze는 -m32로 인해 손상 되었기 때문에).

valgrind -v도 내 프로그램과 완벽하게 일치합니다.

내 모든 malloccalloc의 반환 값이 0이 아닌지 확인하십시오. tsearch을 제외하고는, 나는 아주 일반적인 표준 기능 외에 아무것도 사용하지 않고있다.

문제의 원인을 알 수있는 몇 가지 정보를 수집하고 싶습니다. (예기치 않은 속성을 가진 입력을 가정하고 있다고 가정되는 경우)

+0

gdb를 사용하셨습니까? – Hgeg

+0

서버에서 충돌하기 전에 프로그램의 출력을 볼 수 있습니까? 즉 당신은 어떤 printf()를 추가하여 문제가 발생한 곳을 볼 수 있습니까? –

+0

@Hgeg : 아니요, 프로그램이 내 시스템에서 정상적으로 작동 할 때 사용할 수있는 방법입니까? –

답변

2

제한된 피드백이있는 환경에서 사용할 수있는 도구는 문제의 원인에 대해 "이원 검색"이라고하는 것입니다.

서버에서 실행되는 가장 간단한 "hello world"프로그램을 업로드하고 충돌이 없는지 확인하십시오. 그런 다음 프로그램이에 충돌 할 때까지 코드 조각을 추가하십시오. 그럴 때 충돌을 담당하는 특정 코드 조각으로 좁힐 때까지 작은 코드 덩어리를 역 추적하고 추가하십시오.

일단 범위를 좁히면 귀찮은 코드 블록을 다시 작성하거나 올바른 결과를 얻는 다른 방법을 찾아 볼 수 있습니다.

+1

+1. 그러나 나는 OP가 "내가 정의되지 않은 행동 등에 의존하지 않는다는 것을 증명하기 위해 나의 지역 환경에서 무엇을 할 수 있는가?"라고 묻고있다. –

+0

@Oli Charlesworth : 프로그램에서 로컬 환경에서 문제가없는 것처럼 들리네. 문제가 발생하지 않는 시스템에서 재현 할 수없는 버그를 검색하면 좌절감이 생길 수 있습니다! –

+1

물론! 하지만 때로는 자신이 발견 한 상황입니다. 아마도 GCC의 버전이 약간 다를 수 있습니다.하지만 그 원인은 거의 확실하게 정의되지 않은 동작에 대한 의도하지 않은 의존성에 있습니다. –

0

"-g"로 컴파일하십시오.

실행 :

ulimit -c unlimited

이 무제한 크기의 코어가 될 수 있습니다 : 그것은 0, 또는 바이트의 작은 수를 반환하는 경우

ulimit -c

는, 다음 입력 덤핑. 코어 덤프를 검사하여 분할 오류가 발생한 위치를 확인해야합니다. 이 정보를 찾으려면 코어 파일에서 gdb를 실행하십시오. 코어 덤프를 일으킨 행을 알려주고, 왜 오류가 발생했는지에 대한 정보를 제공합니다.

핵심을 검사에 대한 자세한 내용은이 링크를 GDB와 덤프 참조 :

http://www.network-theory.co.uk/docs/gccintro/gccintro_38.html

링크는 더 많은 정보를 제공합니다.

관련 문제