SNU-ARC / 2024_spring_sysprog_Lab3

8 stars 0 forks source link

mm_driver의 debug모드 관련 질문 드립니다. #11

Open tpwls6630 opened 2 months ago

tpwls6630 commented 2 months ago

개인적으로 테스트케이스를 돌려보다 발견한 문제점입니다.

테스트케이스는 다음과 같습니다.

dataseg 0x2000000
heap implicit
mode debug

log ds 1
log mm 1

start

c 0 12255431
c 1 19701946
r 1 376522

stop
stat

문제는 mode가 debug일때 발생합니다. mode가 performance나 correctness일땐 발생하지 않는 문제입니다. 다음과 같은 메세지가 출력됩니다. image 해당 화면에서 보이는 mm_check는 realloc을 하기 전 상태입니다. 1번 블록이 heap area를 벗어났다는 에러입니다.

1번 블록에 대해 realloc을 하고 나면 마지막 free블록의 크기가 커져 heap shrink를 합니다. shrink과정에서 발생한 문제같습니다. 디버깅을 위해 mm_check를 realloc이 마쳐지는 부분에 추가하여 확인해봤습니다. 다음 사진은 realloc 직후 mm_check로 블럭의 주소값을 확인한 결과입니다. image

결과적으로 1번 블록이 존재하는 [0x7f1811b7b100 ~ 0x7f1811bd6fe0)은 valid heap area인 [0x7f1810fcb000 ~ 0x7f1811be8000)구간 안에 들어옵니다.

mm_driver의 debug에서 block데이터를 따로 관리하기 때문에 생기는 문제처럼 보입니다. realloc에 대해선 heap shrink를 하면 안되는 것인지 궁금합니다.

tpwls6630 commented 2 months ago

추가적으로 correctness모드에 대해서도 질문이 있습니다.

explicit free list일때, mode가 correctness일 때, realloc을 하는 경우 payload not copied 에러를 받았습니다. 에러가 나는 경우는 realloc을 할 때 new size가 old size보다 큰 경우, 뒷 블럭이 free블럭이 아니거나, free블럭이지만 늘릴 공간이 충분하지 않을 경우 mm_malloc을 호출하여 payload를 복사하는 경우 발생했습니다. 해당 경우에 대해선

  1. mm_malloc을 호출하여 best fit 메모리 공간을 할당받아
  2. payload를 복사하고
  3. 원래 블럭을 free하여 realloc을 완료합니다.

같은 테스트케이스에 대해 implicit에선 에러가 나지 않고 explicit에서 에러가 나는 것은 3단계 free이후 next, prev포인터를 할당하는 시점에서 생긴다고 보았습니다. 기존 블럭을 free하는 과정에서 payload가 손상되기 때문에, realloc 이전과 이후의 payload를 비교할 수 없게 된다고 생각했습니다.

이는 저의 구현의 문제인지, mm_driver의 문제인지 확인이 어려워 질문드립니다.

kwonsw055 commented 2 months ago

mm_driver에서 realloc시 디버깅용 포인터 정보를 업데이트하지 않아 발생한 문제였습니다. 업데이트된 mm_driver.o 파일을 commit 하였습니다. 감사합니다.

tpwls6630 commented 2 months ago

mm_driver.o를 업데이트 하고 다시 테스트해보았습니다.

그런데 이번엔 다른 오류가 발생했습니다.

------------------------------------------------------------
Configuration:
  script file:           ./tests/COR.dmas

  configuration:
    implementation:      memory manager
    mode:                correctness
    freelist policy:     explicit
    data segment size:   0x6000000 (100663296)

Action: c 0 3743
Action: r 1 3839
mm_driver: src/blocklist.c:125: delete_block: Assertion `(ptr != NULL) && (ptr != (void*)-1)' failed.
Aborted (core dumped)

이번엔 implicit/explicit 모두의 경우에서 mode가 correctness/debug일때 realloc을 할 때 발생했습니다. 자세히 테스트케이스를 분석해보니 r 커맨드의 첫번째 인자가 가리키는 블럭이 기존에 존재하지 않던 블럭일 때 오류가 났습니다. 즉 mm_malloc과 동일한 동작을 할 때 오류가 났습니다. 다음과 같은 테스트케이스에선 맨 마지막 realloc에서 오류가 났습니다.

c 0 3743
r 0 3839
r 0 2144
r 0 2204
m 3 402
f -1
c 4 1432
f -1
r 5 3873

blocklist.c의 delete_block을 실행할 때 ptr이 NULL이거나 (void)-1인 상황입니다. 혹시 제 realloc이 NULL이나 (void)-1을 반환하는지 똑같은 assert문으로 체크해보았지만 그렇진 않았습니다.

--implementation libc 태그를 넣고 돌려봐도 동일한 오류가 나는 것을 확인했습니다.

kwonsw055 commented 2 months ago

업데이트 된 mm_driver.o를 commit 하였습니다.

tpwls6630 commented 2 months ago

감사합니다.