2010-06-07 1 views
2

리눅스 환경에서 C 프로그램에 대한 오류 [EDIT1 :] I 글로벌로를 sqlName를 들어"는 0x0 주소는 다음 malloc, stack'd 또는 (최근) free되기를 않음"

선언 매개 변수는 파일의 시작 부분에

char seqName [20];

[Edit2가 :]

실제 실행 중에 프로그램에 전달하는 그 숫자가 아닌가요? valgrind 도구를 사용하여 다음과 같은 메시지가 나타납니다. 명령 I 입력은 다음과 같습니다

JL의 @ 우분투 : ~/작업/dsr_analysis $ Valgrind의 --tool = memcheck --leak 검사 = 예 ./test

[EDIT3 :]

죄송합니다. Valgrind를 처음 사용하는 사용자인데 사용하면 Edit2에서만 명령을 입력합니다.

그러나 내 프로그램에는 몇 가지 명령 줄 매개 변수가 있습니다.

Valgrind의 --tool = memcheck --leak 검사 = 352 288

foreman.cif 예 ./test :

그러므로 나는 새 명령에 의해 내 프로그램을 디버깅하는 것이 더 거라고 생각

height = atoi(argv[3]); 

width = atoi(argv[2]); 

sprintf(seqName,"%s", argv[1]); 

// strcpy(seqName, argv[1]); 

을 컴파일 후, exe 파일 테스트가 생성되고, 나는 그것을 확인하기 위해 Valgrind의를 사용


내 프로그램의 조각이있다. 그렇다면 다음 메시지가 표시되지만 나에게 어떤 말을하는지 이해할 수는 없습니다. 누구나 친절한 도움을 제공 할 수 있습니까?

JL의 @ 우분투 : ~/작업/dsr_analysis $ Valgrind의 --tool = memcheck --leak 검사 = 예 ./test

== 28940 == Memcheck, 메모리 에러 검출기

== 28940 == Julian Seward 외 다수의 저작권 (C) 2002-2009 및 GNU GPL'd.

== 28940 == Valgrind-3.6.0.SVN-Debian 및 LibVEX 사용하기; 저작권 정보 -h와

다시 실행

== 28940 == 명령 : ./test

== 28940 ==

== 크기의 28940 == 잘못된 읽기 1

0x40260CA에서

== 28,940 ==의 strcpy (mc_replace_strmem.c : 311)

== 0x804A5C6하여 28,940 == 본체 (me_search.C : 1,428)

== 28,940 == 0x0 주소가 stack'd되지 않고, 또는 다음 malloc (최근) free되기를

== 28,940 ==

== 28,940 ==

== 신호의 기본 동작도 11의 (SIGSEGV)

== 28,940 ==

== 28,940 == 0x40260CA에서 0x0 주소에 매핑되지 영역 내의 통로와 종료 28,940 == 공정 :의 strcpy (mc_replace _strmem.c : 311)

== 0x804A5C6하여 28,940 == : 주 (me_search.c : 당신이 믿는 경우 1428)

== 28940 ==이 스택의 결과로 일어난

== 28940 == 프로그램의 메인 스레드에서 오버 플로우 (가능성이 있지만

== 28940 == 가능), 당신은을 사용하여 28,940 == 메인 스레드 스택을

==의 크기를 증가시키기 위해 시도 할 수 있습니다 - -main-stacksize = 플래그.

== 28,940 ==이 실행에 사용되는 주 스레드 스택 크기였다 8388608.

== 28,940 ==

== 28,940 == HEAP 요약 :

== = 28,940 = 출구에서 사용 :

== 28940 ==

할당 0 바이트 0 allocs, 0 해방 : 0 블록

== 28940 == 총 힙 사용량이 0 바이트

== 28940 == 모든 힙 블록이 해제되었다 - 누출이

== 28940 ==

==와 감지 및 억제 오류의 수, 다시 실행을 위해 28,940 == 할 수 없습니다 : -v

== 28,940 == ERROR 요약 : 1 컨텍스트 (억제 : 13 (8)에서) 1 1 에러 상황 (억제 : 8 내지 13)

1 컨텍스트 (억제 : 8 내지 13)

답변

7

당신은 정말 확실하게 충분히 명확한 코드를 게시하지 않은,하지만 당신은 어떤 명령 줄 매개 변수로 실행 파일을 호출하는 경우, 다음 argv[1]NULL 포인터를 포함하고, argv[2]argv[3] 등은 정의되지 않은 값을 포함합니다.

편집 :이 프로그램에는 valgrind 명령 줄에 매개 변수를 제공해야합니다 (저는 valgrind를 사용하지 않습니다). 뭔가 같이 : 그런 없습니다

+0

많은 감사합니다, Neil. 나는 당신에게서 많은 것을 배웁니다. – MaiTiano

+0

나는 이것을지지하지 않을 것이다. 장군 Zod는 단순한 농부 인'foo'와'bar' 전에 논해야합니다! –

+0

* 나는 항상 시퀀스가 ​​"foo, bar, baz, quux"가되었다고 생각했다. – caf

1

프로그램에 전달 된 실제 인수 수를 확인합니까? (argc)

프로그램의 인수가 3 개 미만이고 argv[1..3]을 시도하면 세그먼트 화 오류 및 기타 예측할 수없는 동작이 발생합니다. sprintf(seqName,"%s", argv[1])

그리고 당신이 실제로 원하는 것은 코드를 판단 sprintf((strcat(seqName,"%s"), argv[1])입니다 :

+1

같은 이름의 쉘 내장과 혼동하기 쉽습니다으로 실행 test를 호출

valgrind ... ./test foo bar zod 

그리고 BTW, 리눅스/유닉스에 대한 좋은 생각이다 NULL 포인터 예외 또는 어떤 종류의 예외로 C에있는 일이 일어납니다. 수정 후 –

+1

+1 – DevSolar

1

나는 지점이라고 생각합니다.

여기에서 수행하려고 시도하는 것은 표현식 "% s"의 값을 형식으로 해석하여 전달하는 것입니다.그 값은 정적 메모리의 '%'에 대한 char 포인터이며 그 옆에 's'가 있고 '\ 0'입니다.

편집 오, 잠깐, 신경 쓰지 마라, 나는 printf가 아닌 sprintf를 본다. 그렇다면 아마 argcount 일 것입니다.

Edit2 : seqName도 제대로 초기화되고 할당 되었습니까?

1) argc의 값을 확인하여 정확한 수의 매개 변수를 전달되고 있는지 확인하십시오

2

는 확인해야 두 가지가 있습니다.

2) malloc()을 사용하여 strcpy()을 시도하기 전에 seqName에 충분한 공간을 할당했는지 확인하십시오.