2 분 소요

Debug 도입

  • MARK2 컴퓨터의 에러를 찾아내는 과정에서 Debug라는 용어를 처음 사용하게 되었다.
  • bug란 incorrect, unexpected한 결과를 일으키는 error이다.
  • debugging이란 bug를 찾고 해결하는 과정이다.
  • debugger의 목적은 다음과 같습니다.
    • 디버깅: bugs를 찾는 것을 도와준다.
    • 동적 분석: 다른 프로그램의 흐름을 이해하기 위함
  • debugger의 기능은 다음과 같습니다.
    • 프로그램을 정지하고 시작하고 통제할 수 있다.
    • 멈췄을 때, 내부가 무슨 상태인지 확인할 수 있다.
  • Debugging의 4가지 용어
    • Test, Stabilize(재현), Localize, Correction
    • stabilize, localize가 거의 90%라고 할정도로 대부분의 비율을 차지한다.
  • 디버깅 경험
    • 예전에 경험했던 비슷한 버그를 찾을 수 있다.
    • 의심되는 지점에 printf를 통해 대충 localize하고 디버깅을 시작할 수 있다.
    • 최근 변화된 것을 중점으로 디버거를 사용할 수 있다.

GDB(GNU Debugger)

도입

  • gdb hello로 프로그램과 같이 gdb를 메모리에 올려놓음 아직 hello 프로그램이 실행된 것은 아님
  • run으로 start execution
  • breakpoint 설정 가능
  • print / x / display 로 변수 조사 가능
  • kill로 execution 종료
  • quit으로 gdb 종료
  • gdb도 유틸리티이기 때문에 다른 프로그램을 통제할 수 없습니다.
    실질적으로는 커널에 ptrace라는 시스템콜을 보내고 커널을 통해 프로그램을 통제하는 방식입니다.
gcc -o hello hello.c -g # -g로 debug mode compile
./hello # 실행하기

명령어 미리보기

run
break main.c:1 # file에 설정
b 1 # current source file일 때, main.c: 생략 가능
b main #함수에 설정
delete N # 중단점 삭제
next # 또는 n
step # 또는 s / 함수 안으로 들어감
print E # 또는 p E / 변수값 출력
continue # 또는 c / 다음 중단점으로 뛰기
kill
quit
info source # current sourcefile 알수 있음
info b # breakpoint 다 보여줌 #1, #2 같은 형태로 나옴

Segmentation fault

접근할 수 없거나 할당되지 않은 주소에 접근할 때 뜨는 에러

과정

gdb ./matloff # starting gdb
run # start program
backtrace
bt # 어디서 호출했는지 알려줌
up
down
list main.c:15 # 위아래 총 10줄 보여줌 / 엔터 치면 다음 라인 / l 줄임말
info source # current source file
list # 다음 10라인
list - # 이전 10라인
kill
quit
print j
print is_prime[147328]
break main
info b # 중단점 모두 보기
finish # step에서 나오기 / 약자 없음
break prime.c:7 if k >= 9 # 조건부 중단점 설정
cond 2 k>=15 # 2번 중단점 조건 변경
ignore 2 10 # 2번 중단점 10번 무시
advance 19 # 19번 라인까지 수행

보통 터미널 여러개 띄워놓고 한다. (편집기, 컴파일 핸들링, GDB)

다른 명령어

gcc -g3 -fno-stack-protector -o encrypt encrypt.c # 스택 보호 기능 해제
display 변수 # 계속 보여줌
d display N # N번 삭제
x /1wd &x # 메모리 접근 보여줌

Watchpoints

변수값이 바뀔때마다 멈추게 가능

p $key # 결과값 0x7fffffffe51c
wa *(int *) 0x7fffffffe51c

댓글남기기