일반적으로 Valgrind는 메모리 릭 판단용으로 많이 쓴다.
주로 “valgrind –leak-check=full args” 형식으로 말이다.
그래서 릭이 어느정도 났는지에 따라서 쭉 따라가면서 릭을 잡아나가는데….
내내 Error Summary부분이 신경을 쓰지 않고 싶었다. 하지만 이번에 알았다. 그 Error Summary를 무시하지 말자고.
방금전에 memory를 잘못 잡은 상태에서 strcat 함수를 써서 데이터 복사를 해나갔는데 그 부분에서 절대 에러가 나지 않고 다른 소켓 부분에서 malloc할때 에러가 난 것이다. segmentation fault….
그래서 왜 malloc에서 에러가 날까?
메모리가 없으면 NULL을 리턴하는데 그래서 이래저래 알아보고 그런 결과 너무 암담해서 valgrind에서 잡아주는 Error Summary를 참고하면서 다른 에러날 경우를 다 없앤 다음에 잡아보자고 다짐하고 한 결과 그 에러를 다 잡으니 정상적으로 프로그램이 돌아가기 시작했다.
무슨 에러였을까???
malloc으로 잘못된 싸이즈를 잡고난 다음에 그 곳에 문자열 복사를 수행했고 이 부분에 대해서 gcc는 아무런 경고를 보내지 않고 있다가 그 아무도 선점하지 않은 영역(실제로는 문자열 복사가 일어난 곳)에 다른 부분 소켓 모듈에서 malloc을 하려하니 런타임 에러가 나버린 것이다.
이야~~~~ valgrind가 알려주는 에러 목록이 이렇게 쓸모가 있다니…
몇시간 전까지만 해도 이 부분 절대 몰랐다. ㅜㅜ
앞으로 엄한영역에 read나 write를 수행했다는 메시지 나오면 절대 그냥 넘어가지 말자!
분명 이런 부분은 malloc 크기를 잘못 잡았는던지 아니면 데이터를 오버해서 쓴 부분이니…
ps. C코딩은 그렇다 치더라도, 버그잡는건 정말 최악 이였는데..나름 여러 툴을 사용하니 좀 편해지긴 하네.
실제로 코딩은 힘들지 않고 설계와 디버깅이 정말 중요한거 같다.
valgrind Error summary를 꼭 참고하자. by from __future__ import dream is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License.