alloc한 메모리 이상의 영역을 액세스할때...
글쓴이: kdgcom / 작성시간: 금, 2005/04/01 - 3:20오후
예를 들어......
char *ptr = "1234567"; printf("%c\r\n", *(ptr+8));
라는 코드는 에러가 나지 않지요..
아마 %를 출력할테지만..
("1234567"다음에 "%c\r\n"이 메모리에 할당될테니..)
이런식으로 calloc이나 malloc으로 allocation한 부분 이상의 영역에 대해 access하려고 시도하면 많이 벗어나지 않는 경우 에러가 나지 않는걸로 알고 있습니다. (맞나요? 경험상 그렇던데..)
이경우 당장은 에러가 안나는데 allocation이 빈번하게 일어날 경우 한참 잘 되다가 갑자기 libc의 _int_malloc에서 에러났다는 뻔뻔한 메시지를 보여주면서 segmentation fault를 보이더군요... (gdb에서 backtrace를 했을때의 결과가 말이죠)
이거 좀 쉽게 잡는 방법 없을까요?
지금 쓰는 코드가 struct 머시기 **ptr[][] 이렇게 생긴거 여러개에 대해 빈번하게 읽고 쓰고 하는지라 하나하나 따져보기가 매우 괴롭습니다 ㅠ.ㅠ :?
Forums:
Re: valgrind
valgrind 라는 메모리 디버깅 툴이 있습니다.
한번 사용해 보시길...
컴파일 하실때 -g옵션사용하세요
컴파일 하실때 -g옵션사용하세요.
그럼 위치를 정확하게 나오는걸로 알고있습니다.
메모리 릭관련해서는 추척해주는 라이브러리가 있었던걸로 기억하는데
구글에서 검색해보세요 여러가지 좋은 라이브러리가 많이 있습니다.
Perl 만세~~~
Re: 컴파일 하실때 -g옵션사용하세요
물론 -ggdb 옵션을 썼습니다...
그럼에도 불구하고 bt할때 _int_malloc 에서 오류가 나는걸로 보이니 환장하겠네요 ㅠ.ㅠ
Re: valgrind
죄송하지만 valgrind가 어느 정도 수준의 디버깅을 가능하게 해주는지요? 지금 시간이 없는지라 메뉴얼을 제대로 보기 힘드네요 ㅠ.ㅠ
alloc된 영역 이상의 메모리를 참조할때 잘 잡아 주나요???
Re: alloc한 메모리 이상의 영역을 액세스할때...
아뇨 에러입니다. ptr+6 이 7이니까..
아뇨.. 많이 안벗어나도 에러납니다. 물론 운이 좋아 에러가 나지 않는경우도 많습니다.
잡는법은.. 그저.. 디버깅해야죠..
----------------------------------------------------------------------------
Re: alloc한 메모리 이상의 영역을 액세스할때...
"1234567"과 "%c\r\n"이 연속적으로 들어간다는 보장이 없습니다. 한마디로, 에러가 나지 않은건 '운'이 좋았을 뿐입니다.
할당 받은 크기를 벗어나는 접근은 절대로 일어나지 않도록 정확히 코딩을 해줘야합니다. 넘어가도 된다...라는 생각을 하는 순간부터 잘못된겁니다. 무슨 일이 일어날지 모릅니다. :evil:
Re: alloc한 메모리 이상의 영역을 액세스할때...
당연히 에러입니다. 그러니까 예시를 했겠죠.
그저 디버깅한다는 것.. 예.. 그저 디버깅을 무려 2주 넘게 하고 있습니다만.. 도저히 보이질 않는군요. 다른 해결방안은 없나요?
Re: alloc한 메모리 이상의 영역을 액세스할때...
다중스레드를 쓰지 않는 이상 거의 %가 찍힐 것 같습니다 :) (농담입니다)
그리고 영역 밖의 데이터는 당연히 쓰레기일텐데 넘어가도 된다고 생각하고 프로그램할리는 없을거라고 생각합니다.
특정 디버깅툴을 제시해주는등의 좀 더 구체적인 해결책이 필요합니다.
(최소한 gdb는 여기에 대해 깡통인 것 같고... valgrind는 root 권한이 없어서 아직 실험을 못하고 있습니다.)
댓글 달기