전체 글

Hello World
    반응형
기록/크래프톤 정글

WIL 05 - C : Debugging Lab

이번주 목표C 버그 유형 익히기gdb 툴 숙련도 높이기 이번주 목표 달성률은 40%인 것 같다. C 에서 심각하게 많이 나오는 오류 유형은 익히긴 했지만. gdb 툴을 충분히 활용하지 못한 것 같고, Conditional Breakpoint 도 사용하지 않았다. 문제도 절반만 풀었다. 시도한 접근 방식처음에는 gdb 쓰는 방식이 익숙하지 않아서 코드를 한 줄 씩 읽어서 어떤 코드인지 흐름을 파악했다. gdb 에 조금 익숙해진 다음에는 gdb 를 이용하여 크래시 지점을 파악하고, 코드를 읽어 문제 지점을 확인했다. 최대한 주석을 지우고 gdb 와 코드만 보고 파악하려고 노력했는데, 쉽지 않았다. 문제 지점을 읽어도 뭐가 문제인지 못 알아보는 경우도 있었다. 결국 AI 에게 어떤 데이터를 찍어봐야하는지 ..

CS/CSAPP 컴퓨터 시스템

CSAPP 컴퓨터 시스템 Ch9 (9.1 ~ 9.6)

다른 CSAPP 글 보러가기 'CS/CSAPP 컴퓨터 시스템' 카테고리의 글 목록Hello Worldskylarcoding.tistory.com 9.1 물리 및 가상주소 방식CPU가 쓰는 주소와 메모리의 실제 주소가 다를 수 있다.물리 주소 지정 : CPU가 낸 주소 = 실제 메모리 주소 (단순한 임베디드에서 사용)가상 주소 지정 : CPU가 낸 주소(가상 주소) 는 진짜 위치가 아니고, MMU(Memory Management Unit) 라는 하드웨어가 page table을 보고 실제 위치 (물리 주소) 로 바꿔준 다음에 메모리를 찾아간다. CPU: "이 주소 줘" (가상 주소) ↓MMU: "잠깐, 진짜 주소로 바꿔줄게" (page table 참조) ↓실제 메모리: 진짜 위치에서 데이터 반환..

Back End/C

GDB 디버깅 에러 메시지와 발생 원인 정리

GDB 디버깅 에러 메시지와 발생 원인 정리GDB에서 보게 되는 메시지는 크게 세 부류로 나뉜다. 프로그램이 받은 시그널glibc가 스스로 멈추면서 찍는 메시지GDB 자체의 경고·에러 앞의 두 개는 내 코드에 버그가 있다는 뜻이고, 세 번째는 대부분 컴파일 옵션이나 GDB 사용법 문제다.1. 프로그램이 받은 시그널Program received signal SIGxxx, ... 형태로 나온다. SIGSEGV (Segmentation fault) : NULL 역참조, 이미 free한 메모리 접근, 초기화 안 된 포인터 사용, 배열 범위 밖 접근, 무한 재귀로 인한 스택 오버플로, 문자열 리터럴(char *s = "abc") 수정SIGABRT (Aborted) : abort() 호출, assert 실패, gl..

Back End/C

C - dangling pointer 댕글링 포인터 (SIGABRT 에러)

문제eb_snapshot() 이 저장하는 것은 "그 시점의 data 포인터(원시 주소)"다. 이후 eb_grow()가 realloc 으로 버퍼를 옮기면(주소 변경), 저장해 둔 스냅샷 포인터는 '이미 해제된 옛 블록'을 가리키게 된다(댕글링). 정리 시 eb_free() 는 현재 data 를 해제한 뒤 undo[] 의 옛 포인터들도 free 하는데, 그 블록들은 realloc 이 이미 해제한 것이라 → double free / invalid pointer 로 glibc abort(SIGABRT).https://github.com/yeooonee/Jungle-C-DebuggingLab/blob/main/challenges/10_realloc_dangling/bug.c Jungle-C-DebuggingLab..

Back End/C

C - uninitialized read 미초기화 메모리

문제행 포인터 표를 malloc 으로 잡는데, malloc 은 메모리를 0 으로 초기화하지 않는다. 게다가 이 표는 방금 free 된(=쓰레기로 채워진) 청크를 재사용하므로, 채우지 않은 칸은 NULL 이 아니라 0xABAB.. 같은 '그럴듯한 쓰레기 포인터'가 된다. 합산 루프가 채우지 않은 행까지 rows[i][j] 로 역참조하면 무효 주소 접근 → SIGSEGV. ("NULL 이면 걸러지겠지" 라는 방심이 깨지는 지점 — 쓰레기는 NULL 이 아니다)https://github.com/yeooonee/Jungle-C-DebuggingLab/blob/main/challenges/08_uninitialized_read/bug.c Jungle-C-DebuggingLab/challenges/08_uninit..

    반응형
Lar
개발지식 저장소