2012-06-18 1 views
3

나는 새로운 C 프로그래머이고 포인터 + 배열은 나를 많이 망치고있다. 어떤 오류도 발생시키지 않고 코드가 제대로 실행됩니다 ... 중간에 코드가 작동하기 시작할 때까지 배열의 일부 요소가 원하는 것 이외의 다른 요소로 설정되기 때문에. 실행이 끝난 후 코드의 메모리를 시각화하는 프로그램이 있는지 알고 싶었습니다.C 코드에서 사용중인 메모리를 어떻게 확인합니까?

예컨대 I 후에 실행 : 그것은 배열 0과 4 개의 요소를 갖는 메모리 블록을 표시한다

#include<stdio.h> 
int main(){ 
    int array[2] = {0,1}; 
    array[1] = 4; 
    printf("%d\n",array[1]); 
    } 

.

지금 배열을 수행하여 내가 그 배열의 메모리를 취소 이전 작업의 요소를 포함하는 문제로 실행 피하기 위해 :

memset(tokenized,0,MAX_CHARS); 

작동하는 것 같다,하지만 난 알고하지 않습니다 그 실제로 내가 백 엔드에서하고 있다고 생각하는 것을 수행합니다.

편집 : 지금 Valgrind를 사용하고 있는데 알고 싶습니다. 오류가 어떤 라인을 나타내는 지 어떻게 알 수 있습니까? 나는이있어 예를 들어 :

==24394== Source and destination overlap in strncpy(0x7ff000006, 0x7ff000006, 6) 
==24394== at 0x4C2C236: strncpy (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==24394== by 0x400D8A: tokenize_quotes (in /home/zee/Documents/seng265/repos/assignment2/a.out) 
==24394== by 0x40184E: main (in /home/zee/Documents/seng265/repos/assignment2/a.out) 
==24394== 
==24394== Conditional jump or move depends on uninitialised value(s) 
==24394== at 0x4C2C007: strcpy (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==24394== by 0x400E06: tokenize_quotes (in /home/zee/Documents/seng265/repos/assignment2/a.out) 
==24394== by 0x40184E: main (in /home/zee/Documents/seng265/repos/assignment2/a.out) 
==24394== 

을하지만 모르는 오류가가 뭔지 라인? 나는 strcpy에 관해 그것의 무엇인가를 안다 고마워!

+1

당신은 쉽게 디버거를 사용하여 확인하고 토큰 화 '에 어떤 임의의 항목을 확인할 수 있습니다 ''memset' 호출 전과 후에. –

+0

나는 항상 다음과 같이 valgrind를 실행합니다. valgrind -v --tool = memcheck --leak-check = full --show-reachable = yes . 항상 줄 번호를 표시하므로 도움이됩니다 (어떤 명령 스위치가 내 스크립트에서 복사했는지 기억하지 못합니다). – Wookie88

+0

'-g'로 코드를 컴파일하여 컴파일러가 디버깅 정보도 생성하도록하십시오. 'Valgrind'와'gdb'와 같은 도구는이 정보를 사용하여 가상 주소를 소스 코드의 줄에 매핑 할 수 있습니다. –

답변

4

사용 Valgrind :

Valgrind의 디버깅 및 프로파일 링 리눅스 프로그램에 대한 GPL'd 시스템입니다. Valgrind의 도구 모음을 사용하면 관리 및 스레딩 버그를 자동으로 감지하여 버그를 찾아내는 데 시간을 낭비하지 않고 프로그램을 안정적으로 유지할 수 있습니다. 프로그램의 속도를 높이려면 자세한 프로파일 링을 수행하십시오.

0

valgrind는 좋은 도구입니다.

[email protected]:~$ valgrind ./test 
==2559== Memcheck, a memory error detector 
==2559== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al. 
==2559== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info 
==2559== Command: ./test 
==2559== 
4 
==2559== 
==2559== HEAP SUMMARY: 
==2559==  in use at exit: 0 bytes in 0 blocks 
==2559== total heap usage: 0 allocs, 0 frees, 0 bytes allocated 
==2559== 
==2559== All heap blocks were freed -- no leaks are possible 
==2559== 
==2559== For counts of detected and suppressed errors, rerun with: -v 
==2559== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0) 
[email protected]:~$ 
0

내가 Valgrind의 당신이 찾고있는 도구입니다 생각하지 않습니다 Valgrind의 정말 초기화되지 않은 메모리와 잘못된 메모리 액세스 (등)을 확인하기위한 정말 정말 좋지만,이 경우에는, 그렇게하지 Valgrind가 질문에 대답 할 것입니다.

해당 메모리를 확인하려면

tokenized의 모든 단일 바이트 인 경우에만
char test = 0; 
unsigned i; 
for (i = 0; i < MAX_CHARS; i++) { 
    test |= tokenized[i]; 
} 
printf("Memory %s zero\n", test == 0 ? "is" : "isn't"); 

이 (루프 후, test은 0이됩니다 사용할 수 있습니다 (즉, 제대로 재설정 한) 제로

코드에 영구히 넣고 싶지는 않습니다. memset은 올바른 매개 변수를 전달하면 원하는대로 수행 할 수 있습니다.


당신이 Valgrind의에서 점점 오류는 다른 문제입니다 : 동일한 데이터, 예를 가리 strncpy이와 포인터를 호출 할 일이

strncpy(ptr, ptr, 6); 

이며 데이터는 초기화되지 않습니다. 에서와 마찬가지로, 그것은 본질적으로 무작위입니다. 프로그램은 아직 메모리 블록에 아무 것도 쓰지 않았습니다.

(또한,이 -g (디버깅 기호를 컴파일하는 경우) Valgrind의 당신에게 줄 번호를 포함하여 더 많은 정보를 출력을 제공 할 것입니다.)

관련 문제