valgrind 사용에 대해 질문 드립니다
프로젝트 개발 완료하여 메모리 누수를 체크 하기 위해서 valgrind 명령을 사용하여 프로그램 메모리 누수 체크 했는데요.
이 프로그램은 thread 를 여러개 생성해서 동작하는데 스레드 2개 생성했을땐 아래와 같이 나타나지 않는데 3개 이상 스레드 생성했을때
마지막에 죽었음 이라는 메세지가 뜨네요.. valgrind 사용하지 않고 그냥 돌렸을땐, 문제없이 돌아가는것으로 보이는데.. 뭔가 찜찜해서..
나중에 문제 될 것 같고..
문제는 --leak-check=full 했을때 보통 소스 몇 라인의 문제가 있는지 나타내준다고 하는데 전 안나와서.. 어디를 봐야 할지.. 도통 감이 안잡히네요..
혹시 저와 같은 상황 보신분 계신가요..?
==8310== Memcheck, a memory error detector
==8310== Copyright (C) 2002-2009, and GNU GPL'd, by Julian Seward et al.
==8310== Using Valgrind-3.5.0 and LibVEX; rerun with -h for copyright info
==8310== Command:
==8310==
thread [2] End
==8310== Thread 4:
==8310== Invalid read of size 4
==8310== at 0x310C90AD: ???
==8310== by 0x310CAA5F: ???
==8310== Address 0x70588d0 is 16 bytes inside a block of size 160 free'd
==8310== at 0x4A05D21: free (vg_replace_malloc.c:325)
==8310== by 0x558059D: ???
==8310== by 0x104BFF: ???
==8310== by 0x3: ???
==8310== by 0x104BFF: ???
==8310==
==8310== Invalid read of size 4
==8310== at 0x310C90BD: ???
==8310== by 0x310CAA5F: ???
==8310== Address 0x70588d4 is 20 bytes inside a block of size 160 free'd
==8310== at 0x4A05D21: free (vg_replace_malloc.c:325)
==8310== by 0x558059D: ???
==8310== by 0x104BFF: ???
==8310== by 0x3: ???
==8310== by 0x104BFF: ???
==8310==
==8310== Invalid read of size 4
==8310== at 0x310C90FF: ???
==8310== by 0x7B4CD1F: ???
==8310== by 0x310C4658: ???
==8310== by 0x70A53D4: ???
==8310== by 0x3: ???
==8310== by 0x7B4CD1F: ???
==8310== by 0x81FF: ???
==8310== by 0x310C4637: ???
==8310== by 0x310CAA5F: ???
==8310== Address 0x70588d4 is 20 bytes inside a block of size 160 free'd
==8310== at 0x4A05D21: free (vg_replace_malloc.c:325)
==8310== by 0x558059D: ???
==8310== by 0x104BFF: ???
==8310== by 0x3: ???
==8310== by 0x104BFF: ???
==8310==
==8310== Invalid read of size 8
==8310== at 0x641CDC3: ???
==8310== by 0x7026F4F: ???
==8310== by 0x52AABCF: ???
==8310== by 0x784FC5F: ???
==8310== by 0x6406E97: ???
==8310== by 0x7852D9F: ???
==8310== by 0x7: ???
==8310== by 0x310C905A: ???
==8310== by 0xA63: ???
==8310== by 0x7B4CD1F: ???
==8310== by 0x310C933E: ???
==8310== by 0x7B4CD1F: ???
==8310== Address 0x7058930 is 112 bytes inside a block of size 160 free'd
==8310== at 0x4A05D21: free (vg_replace_malloc.c:325)
==8310== by 0x558059D: ???
==8310== by 0x104BFF: ???
==8310== by 0x3: ???
==8310== by 0x104BFF: ???
==8310==
==8310== Invalid read of size 1
==8310== at 0x641CDCE: ???
==8310== by 0x7026F4F: ???
==8310== by 0x52AABCF: ???
==8310== by 0x784FC5F: ???
==8310== by 0x6406E97: ???
==8310== by 0x7852D9F: ???
==8310== by 0x7: ???
==8310== by 0x310C905A: ???
==8310== by 0xA63: ???
==8310== by 0x7B4CD1F: ???
==8310== by 0x310C933E: ???
==8310== by 0x7B4CD1F: ???
==8310== Address 0x70588c8 is 8 bytes inside a block of size 160 free'd
==8310== at 0x4A05D21: free (vg_replace_malloc.c:325)
==8310== by 0x558059D: ???
==8310== by 0x104BFF: ???
==8310== by 0x3: ???
==8310== by 0x104BFF: ???
==8310==
==8310== Invalid read of size 1
==8310== at 0x641CDD7: ???
==8310== by 0x7026F4F: ???
==8310== by 0x52AABCF: ???
==8310== by 0x784FC5F: ???
==8310== by 0x6406E97: ???
==8310== by 0x7852D9F: ???
==8310== by 0x7: ???
==8310== by 0x310C905A: ???
==8310== by 0xA63: ???
==8310== by 0x7B4CD1F: ???
==8310== by 0x310C933E: ???
==8310== by 0x7B4CD1F: ???
==8310== Address 0x70588c0 is 0 bytes inside a block of size 160 free'd
==8310== at 0x4A05D21: free (vg_replace_malloc.c:325)
==8310== by 0x558059D: ???
==8310== by 0x104BFF: ???
==8310== by 0x3: ???
==8310== by 0x104BFF: ???
==8310==
==8310== Invalid read of size 8
==8310== at 0x641CDE7: ???
==8310== by 0x7026F4F: ???
==8310== by 0x52AABCF: ???
==8310== by 0x784FC5F: ???
==8310== by 0x6406E97: ???
==8310== by 0x7852D9F: ???
==8310== by 0x7: ???
==8310== by 0x310C905A: ???
==8310== by 0xA63: ???
==8310== by 0x7B4CD1F: ???
==8310== by 0x310C933E: ???
==8310== by 0x7B4CD1F: ???
==8310== Address 0x7058908 is 72 bytes inside a block of size 160 free'd
==8310== at 0x4A05D21: free (vg_replace_malloc.c:325)
==8310== by 0x558059D: ???
==8310== by 0x104BFF: ???
==8310== by 0x3: ???
==8310== by 0x104BFF: ???
==8310==
==8310== Invalid read of size 8
==8310== at 0x641CDEE: ???
==8310== by 0x7026F4F: ???
==8310== by 0x52AABCF: ???
==8310== by 0x784FC5F: ???
==8310== by 0x6406E97: ???
==8310== by 0x7852D9F: ???
==8310== by 0x7: ???
==8310== by 0x310C905A: ???
==8310== by 0xA63: ???
==8310== by 0x7B4CD1F: ???
==8310== by 0x310C933E: ???
==8310== by 0x7B4CD1F: ???
==8310== Address 0x7058900 is 64 bytes inside a block of size 160 free'd
==8310== at 0x4A05D21: free (vg_replace_malloc.c:325)
==8310== by 0x558059D: ???
==8310== by 0x104BFF: ???
==8310== by 0x3: ???
==8310== by 0x104BFF: ???
==8310==
==8310== Invalid write of size 8
==8310== at 0x641CDF8: ???
==8310== by 0x7026F4F: ???
==8310== by 0x52AABCF: ???
==8310== by 0x784FC5F: ???
==8310== by 0x6406E97: ???
==8310== by 0x7852D9F: ???
==8310== by 0x7: ???
==8310== by 0x310C905A: ???
==8310== by 0xA63: ???
==8310== by 0x7B4CD1F: ???
==8310== by 0x310C933E: ???
==8310== by 0x7B4CD1F: ???
==8310== Address 0x7058910 is 80 bytes inside a block of size 160 free'd
==8310== at 0x4A05D21: free (vg_replace_malloc.c:325)
==8310== by 0x558059D: ???
==8310== by 0x104BFF: ???
==8310== by 0x3: ???
==8310== by 0x104BFF: ???
==8310==
==8310== Invalid write of size 8
==8310== at 0x641CE00: ???
==8310== by 0x7026F4F: ???
==8310== by 0x52AABCF: ???
==8310== by 0x784FC5F: ???
==8310== by 0x6406E97: ???
==8310== by 0x7852D9F: ???
==8310== by 0x7: ???
==8310== by 0x310C905A: ???
==8310== by 0xA63: ???
==8310== by 0x7B4CD1F: ???
==8310== by 0x310C933E: ???
==8310== by 0x7B4CD1F: ???
==8310== Address 0x7058908 is 72 bytes inside a block of size 160 free'd
==8310== at 0x4A05D21: free (vg_replace_malloc.c:325)
==8310== by 0x558059D: ???
==8310== by 0x104BFF: ???
==8310== by 0x3: ???
==8310== by 0x104BFF: ???
==8310==
==8310== Invalid write of size 8
==8310== at 0x641CE0C: ???
==8310== by 0x7026F4F: ???
==8310== by 0x52AABCF: ???
==8310== by 0x784FC5F: ???
==8310== by 0x6406E97: ???
==8310== by 0x7852D9F: ???
==8310== by 0x7: ???
==8310== by 0x310C905A: ???
==8310== by 0xA63: ???
==8310== by 0x7B4CD1F: ???
==8310== by 0x310C933E: ???
==8310== by 0x7B4CD1F: ???
==8310== Address 0x7058900 is 64 bytes inside a block of size 160 free'd
==8310== at 0x4A05D21: free (vg_replace_malloc.c:325)
==8310== by 0x558059D: ???
==8310== by 0x104BFF: ???
==8310== by 0x3: ???
==8310== by 0x104BFF: ???
==8310==
==8310== Invalid read of size 4
==8310== at 0x641CE13: ???
==8310== by 0x7026F4F: ???
==8310== by 0x52AABCF: ???
==8310== by 0x784FC5F: ???
==8310== by 0x6406E97: ???
==8310== by 0x7852D9F: ???
==8310== by 0x7: ???
==8310== by 0x310C905A: ???
==8310== by 0xA63: ???
==8310== by 0x7B4CD1F: ???
==8310== by 0x310C933E: ???
==8310== by 0x7B4CD1F: ???
==8310== Address 0x70588c0 is 0 bytes inside a block of size 160 free'd
==8310== at 0x4A05D21: free (vg_replace_malloc.c:325)
==8310== by 0x558059D: ???
==8310== by 0x104BFF: ???
==8310== by 0x3: ???
==8310== by 0x104BFF: ???
==8310==
==8310== Invalid read of size 8
==8310== at 0x641CE76: ???
==8310== by 0x7026F4F: ???
==8310== by 0x52AABCF: ???
==8310== by 0x784FC5F: ???
==8310== by 0x6406E97: ???
==8310== by 0x7852D9F: ???
==8310== by 0x7: ???
==8310== by 0x310C905A: ???
==8310== by 0xA63: ???
==8310== by 0x7B4CD1F: ???
==8310== by 0x310C933E: ???
==8310== by 0x7B4CD1F: ???
==8310== Address 0x7058918 is 88 bytes inside a block of size 160 free'd
==8310== at 0x4A05D21: free (vg_replace_malloc.c:325)
==8310== by 0x558059D: ???
==8310== by 0x104BFF: ???
==8310== by 0x3: ???
==8310== by 0x104BFF: ???
==8310==
==8310== Invalid read of size 4
==8310== at 0x641CE87: ???
==8310== by 0x7026F4F: ???
==8310== by 0x52AABCF: ???
==8310== by 0x784FC5F: ???
==8310== by 0x6406E97: ???
==8310== by 0x7852D9F: ???
==8310== by 0x7: ???
==8310== by 0x310C905A: ???
==8310== by 0xA63: ???
==8310== by 0x7B4CD1F: ???
==8310== by 0x310C933E: ???
==8310== by 0x7B4CD1F: ???
==8310== Address 0x7058950 is 144 bytes inside a block of size 160 free'd
==8310== at 0x4A05D21: free (vg_replace_malloc.c:325)
==8310== by 0x558059D: ???
==8310== by 0x104BFF: ???
==8310== by 0x3: ???
==8310== by 0x104BFF: ???
==8310==
==8310== Invalid read of size 4
==8310== at 0x641CE8A: ???
==8310== by 0x7026F4F: ???
==8310== by 0x52AABCF: ???
==8310== by 0x784FC5F: ???
==8310== by 0x6406E97: ???
==8310== by 0x7852D9F: ???
==8310== by 0x7: ???
==8310== by 0x310C905A: ???
==8310== by 0xA63: ???
==8310== by 0x7B4CD1F: ???
==8310== by 0x310C933E: ???
==8310== by 0x7B4CD1F: ???
==8310== Address 0x70588d0 is 16 bytes inside a block of size 160 free'd
==8310== at 0x4A05D21: free (vg_replace_malloc.c:325)
==8310== by 0x558059D: ???
==8310== by 0x104BFF: ???
==8310== by 0x3: ???
==8310== by 0x104BFF: ???
==8310==
==8310== Invalid read of size 4
==8310== at 0x641CE9B: ???
==8310== by 0x7026F4F: ???
==8310== by 0x52AABCF: ???
==8310== by 0x784FC5F: ???
==8310== by 0x6406E97: ???
==8310== by 0x7852D9F: ???
==8310== by 0x7: ???
==8310== by 0x310C905A: ???
==8310== by 0xA63: ???
==8310== by 0x7B4CD1F: ???
==8310== by 0x310C933E: ???
==8310== by 0x7B4CD1F: ???
==8310== Address 0x70588c0 is 0 bytes inside a block of size 160 free'd
==8310== at 0x4A05D21: free (vg_replace_malloc.c:325)
==8310== by 0x558059D: ???
==8310== by 0x104BFF: ???
==8310== by 0x3: ???
==8310== by 0x104BFF: ???
==8310==
==8310== Invalid read of size 4
==8310== at 0x641CEC8: ???
==8310== by 0x7026F4F: ???
==8310== by 0x52AABCF: ???
==8310== by 0x784FC5F: ???
==8310== by 0x6406E97: ???
==8310== by 0x7852D9F: ???
==8310== by 0x7: ???
==8310== by 0x310C905A: ???
==8310== by 0xA63: ???
==8310== by 0x7B4CD1F: ???
==8310== by 0x310C933E: ???
==8310== by 0x7B4CD1F: ???
==8310== Address 0x70588d4 is 20 bytes inside a block of size 160 free'd
==8310== at 0x4A05D21: free (vg_replace_malloc.c:325)
==8310== by 0x558059D: ???
==8310== by 0x104BFF: ???
==8310== by 0x3: ???
==8310== by 0x104BFF: ???
==8310==
==8310== Invalid read of size 4
==8310== at 0x641CF02: ???
==8310== by 0x7026F4F: ???
==8310== by 0x52AABCF: ???
==8310== by 0x784FC5F: ???
==8310== by 0x6406E97: ???
==8310== by 0x7852D9F: ???
==8310== by 0x7: ???
==8310== by 0x310C905A: ???
==8310== by 0xA63: ???
==8310== by 0x7B4CD1F: ???
==8310== by 0x310C933E: ???
==8310== by 0xFF: ???
==8310== Address 0x70588c0 is 0 bytes inside a block of size 160 free'd
==8310== at 0x4A05D21: free (vg_replace_malloc.c:325)
==8310== by 0x558059D: ???
==8310== by 0x104BFF: ???
==8310== by 0x3: ???
==8310== by 0x104BFF: ???
==8310==
==8310== Invalid read of size 1
==8310== at 0x641CF24: ???
==8310== by 0x7026F4F: ???
==8310== by 0x52AABCF: ???
==8310== by 0x784FC5F: ???
==8310== by 0x6406E97: ???
==8310== by 0x7852D9F: ???
==8310== by 0x7: ???
==8310== by 0x310C905A: ???
==8310== by 0xA63: ???
==8310== by 0x7B4CD1F: ???
==8310== by 0x310C933E: ???
==8310== by 0xFF: ???
==8310== Address 0x70588c0 is 0 bytes inside a block of size 160 free'd
==8310== at 0x4A05D21: free (vg_replace_malloc.c:325)
==8310== by 0x558059D: ???
==8310== by 0x104BFF: ???
==8310== by 0x3: ???
==8310== by 0x104BFF: ???
==8310==
==8310== Invalid read of size 8
==8310== at 0x641CF39: ???
==8310== by 0x7026F4F: ???
==8310== by 0x52AABCF: ???
==8310== by 0x784FC5F: ???
==8310== by 0x6406E97: ???
==8310== by 0x7852D9F: ???
==8310== by 0x7: ???
==8310== by 0x310C905A: ???
==8310== by 0xA63: ???
==8310== by 0x7B4CD1F: ???
==8310== by 0x310C933E: ???
==8310== by 0xFF: ???
==8310== Address 0x7058930 is 112 bytes inside a block of size 160 free'd
==8310== at 0x4A05D21: free (vg_replace_malloc.c:325)
==8310== by 0x558059D: ???
==8310== by 0x104BFF: ???
==8310== by 0x3: ???
==8310== by 0x104BFF: ???
==8310==
==8310== Invalid read of size 8
==8310== at 0x641CF44: ???
==8310== by 0x7026F4F: ???
==8310== by 0x52AABCF: ???
==8310== by 0x784FC5F: ???
==8310== by 0x6406E97: ???
==8310== by 0x7852D9F: ???
==8310== by 0x7: ???
==8310== by 0x310C905A: ???
==8310== by 0xA63: ???
==8310== by 0x7B4CD1F: ???
==8310== by 0x310C933E: ???
==8310== by 0xFF: ???
==8310== Address 0x70257f0 is 48 bytes inside a block of size 64 free'd
==8310== at 0x4A05D21: free (vg_replace_malloc.c:325)
==8310== by 0x558059D: ???
==8310== by 0x7025B6F: ???
==8310==
==8310== Invalid read of size 8
==8310== at 0x641CF48: ???
==8310== by 0x7026F4F: ???
==8310== by 0x52AABCF: ???
==8310== by 0x784FC5F: ???
==8310== by 0x6406E97: ???
==8310== by 0x7852D9F: ???
==8310== by 0x7: ???
==8310== by 0x310C905A: ???
==8310== by 0xA63: ???
==8310== by 0x7B4CD1F: ???
==8310== by 0x310C933E: ???
==8310== by 0xFF: ???
==8310== Address 0x7058918 is 88 bytes inside a block of size 160 free'd
==8310== at 0x4A05D21: free (vg_replace_malloc.c:325)
==8310== by 0x558059D: ???
==8310== by 0x104BFF: ???
==8310== by 0x3: ???
==8310== by 0x104BFF: ???
==8310==
==8310== Invalid read of size 4
==8310== at 0x641CF53: ???
==8310== by 0x7026F4F: ???
==8310== by 0x52AABCF: ???
==8310== by 0x784FC5F: ???
==8310== by 0x6406E97: ???
==8310== by 0x7852D9F: ???
==8310== by 0x7: ???
==8310== by 0x310C905A: ???
==8310== by 0xA63: ???
==8310== by 0x7B4CD1F: ???
==8310== by 0x310C933E: ???
==8310== by 0xFF: ???
==8310== Address 0x8 is not stack'd, malloc'd or (recently) free'd
==8310==
==8310==
==8310== Process terminating with default action of signal 11 (SIGSEGV): dumping core
==8310== Access not within mapped region at address 0x8
==8310== at 0x641CF53: ???
==8310== by 0x7026F4F: ???
==8310== by 0x52AABCF: ???
==8310== by 0x784FC5F: ???
==8310== by 0x6406E97: ???
==8310== by 0x7852D9F: ???
==8310== by 0x7: ???
==8310== by 0x310C905A: ???
==8310== by 0xA63: ???
==8310== by 0x7B4CD1F: ???
==8310== by 0x310C933E: ???
==8310== by 0xFF: ???
==8310== If you believe this happened as a result of a stack
==8310== overflow in your program's main thread (unlikely but
==8310== possible), you can try to increase the size of the
==8310== main thread stack using the --main-stacksize= flag.
==8310== The main thread stack size used in this run was 10485760.
==8310==
==8310== HEAP SUMMARY:
==8310== in use at exit: 24,541,942 bytes in 11,495 blocks
==8310== total heap usage: 69,818 allocs, 58,323 frees, 2,087,907,326 bytes allocated
==8310==
==8310== LEAK SUMMARY:
==8310== definitely lost: 19,311 bytes in 1,494 blocks
==8310== indirectly lost: 0 bytes in 0 blocks
==8310== possibly lost: 4,709,333 bytes in 5,162 blocks
==8310== still reachable: 19,813,298 bytes in 4,839 blocks
==8310== suppressed: 0 bytes in 0 blocks
==8310== Rerun with --leak-check=full to see details of leaked memory
==8310==
==8310== For counts of detected and suppressed errors, rerun with: -v
==8310== ERROR SUMMARY: 23 errors from 23 contexts (suppressed: 7 from 7)
죽었음
음 ..
소스 라인이 안 보이는 건 strip 되어서 그럴겁니다.
빌드 옵션에 -g 를 넣거나, strip 하는 부분이 있으면 빼고 해보세요.
프로그램이 안 죽고 잘 돈다고 해서 정상이라는 보장이 없습니다.
스택 깨먹고 엉뚱한 메모리를 포인팅 하고 있어도 도는 데까지는 돌다가, 더 이상 못 해먹겠다 싶으면 죽거든요.
그나마 런타임 상황이 변하니까 프로그램이 일찍 죽어주는거라고 생각하시면 될 것 같네요.
되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』
ymir님 이번에도 답변 달아주실꺼라 믿고 있었습니다
ymir님 이번에도 답변 달아주실꺼라 믿고 있었습니다 ㅠ
일단, 디버깅 옵션 넣어서 빌드 하고 제가 만든 라이브러리 또한 strip 하지 않았는데요 ㅠㅠ..
소스를 일일히 찾아보는수 밖에 없을까요..
음 ..
file 명령으로 한 번 더 확인해 보시구요.
음.. 밑에 쯤에 보니 stack overflow 났을 것 같다는데..
그렇다면 저렇게 address 는 찍히는데 symbol 은 커녕 모듈 이름도 안 찍히는 거나..
address 에 0xFF, 0x7 같은 수상한 값이 찍히는 것도 어느 정도 설명이 될 수 있겠네요.
되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』
몇번 더 테스트한 결과 일단 다른쪽에서 쓰는 API
몇번 더 테스트한 결과 일단 다른쪽에서 쓰는 API 문제 인것 같아요. 이 소스는 제가 볼수 있는 API는 아니라서..
특정 파일 PATH를 가져왔을때 위와 같은 현상이 일어나네요.
아무튼 ymir님 ~ 조언 항상 감사드립니다 ~!!
댓글 달기