Valgrind
valgrind는 프로그램의 런타임 이슈를 찾거나 수정하는데 도움을 줄 수 있도록 디자인된 툴입니다. 이 툴의 주요 용도는 memcheck입니다. memcheck는 C와 C++에서 흔하게 일어날수 있는 메모리 관련 에러를 찾는데 도움을 줍니다. 이러한 에러들은 충돌이나 예상치 못한 동작을 일으킵니다.
valgrind를 프로그램에서 수행하려면
valgrind --leak-check=yes myprogram arg1 arg2
이나
valgrind ./myprogram
를 통해 메모리 Memcheck을 할 수 있습니다.
argument는 선택적이지만 기본 툴은 Memcheck를 실행합니다. 결과는 할당된 수, free된 수, error의 수 대로 표현됩니다.
아래와같은 에러가 발생하는 코드를 짰다고 가정해봅시다.
#include <stdlib.h> void dummy_function() { int* x = malloc(10 * sizeof(int)); x[10] = 0; // error 1:as you can see here we write to an out of bound memory address } // error 2: memory leak the allocated x not freed int main(void) { dummy_function(); return 0; }
위 코드에서는 malloc으로 할당한 메모리를 free시켜주지 않았고, allocation되지 않은 메모리에 접근했습니다(x[10]).
이 프로그램을 valrind로 체크해보면 다음과 같은 결과가 나올 것입니다.
==29515== Memcheck, a memory error detector
==29515== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==29515== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info
==29515== Command: ./a
==29515==
==29515== Invalid write of size 4
==29515== at 0x400544: dummy_function (in /home/rafi/projects/exocpp/a)
==29515== by 0x40055A: main (in /home/rafi/projects/exocpp/a)
==29515== Address 0x5203068 is 0 bytes after a block of size 40 alloc'd
==29515== at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==29515== by 0x400537: dummy_function (in /home/rafi/projects/exocpp/a)
==29515== by 0x40055A: main (in /home/rafi/projects/exocpp/a)
==29515==
==29515==
==29515== HEAP SUMMARY:
==29515== in use at exit: 40 bytes in 1 blocks
==29515== total heap usage: 1 allocs, 0 frees, 40 bytes allocated
==29515==
==29515== LEAK SUMMARY:
==29515== definitely lost: 40 bytes in 1 blocks
==29515== indirectly lost: 0 bytes in 0 blocks
==29515== possibly lost: 0 bytes in 0 blocks
==29515== still reachable: 0 bytes in 0 blocks
==29515== suppressed: 0 bytes in 0 blocks
==29515== Rerun with --leak-check=full to see details of leaked memory
==29515==
==29515== For counts of detected and suppressed errors, rerun with: -v
==29515== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
Invalid write : 할당된 블록을 넘어선 쓰기를 찾아냅니다. 위에 결과에서는 침범한 메모리가 할당된 메모리보다 얼마나 뒤에 있는지 알려주고 있습니다.
Definitely lost : allocation 해준 뒤 free해주지 않아 발생한 memory leak을 알려줍니다.
1개의 블록에서 40바이트가 확실하게 lost됐다는 것을 알 수 있습니다.
valgrind는 런타임 에러를 체크하는데 매우 효과적입니다. 프로그램을 컴파일 한 후에 valgrind로 에러를 고치는 일은 컴파일러가 잡지 못하는 에러를 찾는데 유용합니다.
'Angrave System Programming > Learning C' 카테고리의 다른 글
Debugging(4) (0) | 2019.01.09 |
---|---|
Debugging(3) (0) | 2019.01.09 |
Debugging(1) (0) | 2019.01.09 |
Strings and Structs(2) (0) | 2019.01.09 |
Strings and Structs(1) (0) | 2019.01.09 |