PintOS

VSCode에서 PintOS 네이티브 디버깅하기: 완벽 가이드

넌뭐가그렇게중요해 2025. 5. 9. 01:21

들어가며

PintOS 프로젝트를 진행하다 보면 디버깅의 중요성을 절실히 느끼게 됩니다. 특히 운영체제 수준의 코드는 디버깅이 어렵기 때문에 효율적인 도구가 필수입니다. 이번 포스팅에서는 VSCode와 Native Debug 확장을 활용하여 PintOS를 쉽게 디버깅하는 방법을 소개합니다.

먼저 결과 먼저 보여드리겠습니다.

breakpoint in VScode

1. 필요한 도구 설치하기

VSCode 확장 프로그램

  • Native Debug: GDB 기반 디버깅을 VSCode에서 사용할 수 있게 해주는 필수 확장 프로그램
  • C/C++ Extension: (선택) 코드 탐색과 인텔리센스 기능 향상을 위한 확장 프로그램

2. 디버깅 환경 구성하기

.vscode 디렉토리 생성

PintOS 루트 디렉토리에 .vscode 폴더를 생성합니다. 이 폴더는 VSCode 설정 파일들을 담게 됩니다.

launch.json 파일 설정

.vscode 폴더 안에 launch.json 파일을 생성하고 다음 내용을 입력합니다:

 
{
  "configurations": [
    {
      "type": "gdb",
      "request": "attach",
      "name": "Attach to Pintos GDB",
      "executable": "${workspaceFolder}/threads/build/kernel.o",
      "target": "localhost:1234",
      "remote": true,
      "cwd": "${workspaceFolder}",
      "valuesFormatting": "parseText"
    }
  ]
}

📌 중요: 현재 작업 중인 프로젝트에 따라 executable 경로를 수정해야 합니다.

  • 스레드(Project 1): ${workspaceFolder}/threads/build/kernel.o
  • 유저 프로그램(Project 2): ${workspaceFolder}/userprog/build/kernel.o
  • 가상 메모리(Project 3): ${workspaceFolder}/vm/build/kernel.o

 

다 귀찮다? 그냥 이거 복사하시면 저희 프로젝트 마다 디버깅 해주는 것들을 만들어 줍니다. 

{
    "configurations": [
      {
        "type": "gdb",
        "request": "attach",
        "name": "Project1_threads",
        "executable": "${workspaceFolder}/pintos-kaist/threads/build/kernel.o",
        "target": "localhost:1234",
        "remote": true,
        "cwd": "${workspaceFolder}",
        "valuesFormatting": "parseText"
      },
      {
        "type": "gdb",
        "request": "attach",
        "name": "Project2_userprog",
        "executable": "${workspaceFolder}/pintos-kaist/userprog/build/kernel.o",
        "target": "localhost:1234",
        "remote": true,
        "cwd": "${workspaceFolder}",
        "valuesFormatting": "parseText"
      },
      {
        "type": "gdb",
        "request": "attach",
        "name": "Project3_vm",
        "executable": "${workspaceFolder}/pintos-kaist/vm/build/kernel.o",
        "target": "localhost:1234",
        "remote": true,
        "cwd": "${workspaceFolder}",
        "valuesFormatting": "parseText"
      }
    ]
  }

3. 디버깅 워크플로우

1) 빌드하기

먼저 현재 작업 중인 프로젝트 디렉토리에서 코드를 빌드합니다:

cd threads/ # 또는 현재 작업 중인 프로젝트 디렉토리 make clean make

2) 디버깅 모드로 실행하기

다음 명령어로 PintOS를 GDB 디버깅 모드로 실행합니다:

이 부분은 cd threads/build 들어가셔서 지금 위치를 pwd로 확인하시고 실행하셔야합니다.(build 에서 실행 시키는겁니다!)

 
# 기본 테스트 실행
pintos --gdb -m 20 -- -q run alarm-multiple

# 또는 특정 테스트 실행 (예: Project 2의 경우)
pintos --gdb --filesys-size=2 -p tests/userprog/args-single -a args-single -- -q run 'args-single'

이 명령어를 실행하면 터미널에 "Waiting for gdb connection"과 같은 메시지가 표시되며 GDB 연결을 기다립니다.

3) VSCode에서 디버거 연결하기

  1. VSCode 왼쪽 사이드바에서 "Run and Debug" 메뉴(재생 버튼 아이콘)를 클릭합니다
  2. 상단의 드롭다운 메뉴에서 "Attach to Pintos GDB" 구성을 선택합니다
  3. 녹색 재생 버튼을 클릭하거나 F5 키를 눌러 디버거를 시작합니다

4. 디버깅 기법 활용하기

중단점(Breakpoint) 설정

  • 코드 라인 왼쪽 여백을 클릭하여 중단점을 설정합니다
  • 또는 디버거 콘솔에 -exec break 함수명 명령을 입력합니다

변수 검사

  • 중단점에서 멈추면 Variables 패널에서 변수 값을 확인할 수 있습니다
  • 변수에 마우스를 올리면 툴팁으로 값을 볼 수 있습니다

코드 단계별 실행

  • Step Over (F10): 현재 라인을 실행하고 다음 라인으로 이동
  • Step Into (F11): 함수 호출 내부로 들어가기
  • Step Out (Shift+F11): 현재 함수에서 빠져나오기
  • Continue (F5): 다음 중단점까지 계속 실행

5. 주의사항 및 문제 해결

디버깅 세션 종료와 재연결

  • 연결이 끊기면(트리플 폴트 등) 디버깅 세션도 종료됩니다
  • 이 경우 pintos --gdb 명령어를 다시 실행하고 VSCode에서 재연결해야 합니다

일반적인 문제 해결

  • 연결 오류: GDB 서버가 실행 중인지 확인하고, 포트(1234)가 다른 프로세스에 의해 사용되고 있지 않은지 확인
  • 중단점 작동 안 함: 디버깅 시작 후 중단점을 설정했다면 중단점을 제거하고 다시 설정해보세요
  • 소스 파일 매핑 문제: VSCode가 소스 파일을 찾지 못하면 직접 파일 경로를 지정해야 할 수 있습니다

6. 추가 팁: ASSERT() 활용하기

PintOS에서 효율적인 디버깅을 위해 ASSERT() 매크로를 적극 활용하세요:

// 예시: 포인터가 NULL이 아님을 확인
ASSERT(thread_ptr != NULL);

// 예시: 조건 검사
ASSERT(priority >= PRI_MIN && priority <= PRI_MAX);

이렇게 ASSERT()를 사용하면 오류 발생 즉시 정확한 위치에서 커널이 중단되므로 디버깅이 훨씬 용이해집니다.

이상으로 VSCode에서 PintOS를 디버깅하는 방법에 대한 가이드를 마치겠습니다. 위 방법을 활용하면 디버깅이 한결 수월해지고, 프로젝트 진행 속도도 빨라질 것입니다.

 

 

 

이 방법을 찾아내고 널리 알려주신 정글 8기 김윤석님에게 모든 영광을 돌립니다. shout out to yunseok!

Citations:

  1. https://pplx-res.cloudinary.com/image/private/user_uploads/68258710/e1e89778-9f50-4672-a14c-429aeecbb214/image.jpg
  2. https://pplx-res.cloudinary.com/image/private/user_uploads/68258710/63cb424e-418e-466d-8560-bb20de396426/image.jpg
  3. https://velog.io/@rivolt0421/Pintos-VSCode%EB%A1%9C-Pintos-%EB%94%94%EB%B2%84%EA%B7%B8%ED%95%98%EA%B8%B0
  4. https://cocopam.tistory.com/22
  5. https://teaching.hkaiser.org/spring2025/csc4103/pintos/overview/debugging_tests.html
  6. https://gitlab.liu.se/marka727/pintos-vscode
  7. https://pangeei-h.tistory.com/entry/Pintos-Project-VScode-Debugging-Setting
  8. https://github.com/LiangLouise/pintos_dev_container
  9. https://pangeei-h.tistory.com/category/CS(ComputerScience)/Pintos
  10. https://cs162.org/static/proj/pintos-docs/docs/development/gdb/
  11. https://terryahn.tistory.com/category/Archive/Tips
  12. https://groovetechnology.com/blog/technologies/how-to-set-up-and-use-react-native-in-visual-studio-code/
  13. https://terryahn.tistory.com/24
  14. https://gist.github.com/yifeiyin/0299f580da2339e68e2106513e8608a2
  15. https://yoonho-devlog.tistory.com/166
  16. https://www.youtube.com/watch?v=ll2Rw616wkU
  17. https://marketplace.visualstudio.com/items?itemName=gbenm.pintos
  18. https://www.ekleenterprise.com/html/tutorials.html
  19. https://velog.io/@rivolt0421/series/Pintos
  20. https://code.visualstudio.com/Docs/editor/debugging
  21. https://thierrysans.me/CSCC69/doc/vscode2/
  22. https://velog.io/@bcgo99/react-native-expo-vscode%EC%97%90%EC%84%9C-%EB%94%94%EB%B2%84%EA%B1%B0-%EB%B6%99%EC%9D%B4%EA%B8%B0