[gdb] gdb로 내 코드 디버깅 하는 방법

New Jenice!·2024년 11월 3일
0
post-thumbnail

gdb란?

  • gdb는 GNU Debugger 의 약자로, 주로 C/C++ 언어로 작성된 프로그램의 실행을 분석하고 오류를 찾아내는 데 사용되는 디버거 프로그램이다
    • GNU(GNU's Not Unix): 주로 GNU/Linux 형태로 사용되며, 소프트웨어를 무료로 배포하고 사용자들이 소프트웨어를 자유롭게 사용할 수 있어야 하는 목표를 기반으로 함
      • gcc, gdb, glibc 등 GNU 프로젝트를 통해 개발 되었다

gdb 설치하기

  • gdb를 사용하기 위해서는 gdb 패키지가 필요하다
  • 해당 글은 우분투를 기반으로 적혀있다 (필자가 우분투 환경ㅋㅋ)
    • 만약, windows나 macOS라면 MinGW 또는 Xcode에서 제공되는 LLDB를 사용하도록 하자
sudo apt install build-essential gdb
  • gdb를 시작하려면 gdb를 다운 받아야 겠지? 바로 다운로드 ㄱㄱ
    • build-essential은 gcc, g++ 등 C/C++개발 및 빌드 환경에서 필요한 기본적인 도구를 설치하므로 gdb랑 같이 설치 (어차피 gcc 필요해서 그래요)
  • 여기까지 했다면 끝났다 그럼 디버깅을 시작해보자

gdb 시작하기

  • 예를 들어 백준 문제를 ㅇㅋ 끝났다! 하고 호기롭게 제출했는데 채점에서 개같이 틀려버렸다 난감하다 어디가 틀렸는지 모르겠다(ㅠㅠ)
  • 이 때, gdb로 관련 변수의 카운팅이나 함수를 체크할 수 있는데
gcc -g -o 1926 1926.c
  • gcc로 컴파일 하겠다 -> -g 디버깅 모드로 -> -o 실행파일을 만들건데 걔 이름은 -> 1926야 -> 컴파일 할 코드파일은 1926.c다

  • 그러면? 관련 실행파일인 1926가 생깁니다요
gdb 1926

(gdb) b 64
(gdb) r

예제입력을 넣어줍니다

6 5
1 1 0 1 1
0 1 1 0 0
0 0 0 0 0
1 0 1 1 1
0 0 1 1 1
0 0 1 1 1

  • 그럼 gdb를 실행하고, 뭔가 여기를 봐야 겠다는 부분에 브레이크포인트(b) 후 실행 시킵니다(r)
    • 실행됐다면, 예제입력을 그대로 입력ㄱㄱ

  • 카운트증가 부분에 몇번 들어오나 보려고 c(다음 브레이크포인트까지 계속)로 보다가 아니다 변수를 확인해야 겠다 싶어서 보고 싶은 변수 옵션을 줬어요 (display area) 중간오타 눈감아...
  • 무튼 그렇게 확인하니까 area가 5라니? 왜 5가 나와 .. 4, 2, 1, 9 로 업데이트 되어야 하는데 이상하다 이건 visit가 빠진것같다 확신이 들어버림 -> 디버깅 완료(quit)

  • 개같이 부활 성공! 모두 즐거운 디버깅 되세요~^^

알아두면 좋은 gdb 명령어

시작, 종료 관련

  • run(r): 시작
  • quit(q): 종료

브레이크 포인트 관련

  • break(b) <라인 번호 or 함수명>: 특정 라인이나 함수에 브레이크 포인트 설정
    • 라인 번호일 때
      • (gdb) b filename.c:20
      • (gdb) list filename.c:20 (20 근처코드 확인 가능)
    • 함수명일 때
      • (gdb) b filename.c:functionname
      • (gdb) list functionname (functionname의 코드가 출력되며 어떤 파일에 몇 번째 줄에 위치하는지 확인 가능)
  • next(n): 한줄씩 실행하면서 함수 내부로는 들어가지 않음
  • step(s): 한줄씩 실행하되, 함수 호출이 있는 경우 함수 내부로 들어감
  • continue(c): 다음 브레이크 포인트까지 프로그램을 계속 실행
  • finish: 현재 함수를 끝까지 실행하고 호출된 함수로 돌아감 (상위 함수로 돌아가기 위함)
  • until: 현재 반복문이 끝날 때까지 실행

변수 값 확인 관련

  • printf <변수 이름>: 변수의 현재 값 출력
  • display <변수 이름>: 특정 변수값을 매 줄 마다 자동으로 출력 (매 줄 마다 변수 값 자동 업데이트)
  • info locals: 현재 함수에서 사용되는 모든 지역변수 값을 확인

이것도 알면 좋다~

  • backtrace(bt): 호출 스택을 확인하여 프로그램이 어디에서 멈췄는지 어떤 함수가 호출됐는지 확인 가능
    • 이건 약간 tmi인데 프로그램 뻑나는 이슈 왔을 때 추적용으로 좋음
profile
Embedded Software Engineer

0개의 댓글