-
반응형double free or corruption
오류 중 쉽다고 생각했던 double free or corruption 문제의 원인을 찾는데 엄청난 시간이 걸림을 경험하고 나니, 다른 분들도 이런 경우를 고려해 봤으면 하는 바람에서 >글을 적는다.
double free or corruption 오류는 메모리 오류로써 두가지 발생 케이스가 있다.
- passing the same address to free twice
- overrunning an allocated area before passing its address to free.
1번과 2번 모두 free라는 메모리 해제 시스템함수를 호출할 때 segfault가 발생합니다.
이런 문제를 만나면 일단 free가 두 번되는 경우가 있는지를 빠르게 찾고, 그 다음부터는 마음을 차분히 갖고(제일 중요) gdb를 통하여 segfault 발생 위치와 관련되어진 메모리의 크기를 검토해보면 원인이 파악한다.
내가 겪은 문제는 2번이다. free 함수에서 segfault가 발생하여 당연히 double free라고 생각했으나 결론적으로 사용해야 할 메모리 크기보다 더 크게 메모리를 사용하였고 free하는 순간 문제가 발생한 것이다.
문제는 외부 프로그램으로부터 요청을 받으면 정보를 제공하는 프로그램이었는데, 버전에 따라서 제공되는 메모리 크기가 달라지는 경우가 발생했다. 자신이 요청을 받았을 때 요청해 줄 데이터의 전체 크기를 체크하는 기능이 필요해 보였다. 예전 버전을 지원하지 못하는 것은 이해되나, 죽어버리면 곤란하기 때문이다.
See also- http://www.valgrind.org/
반응형