본문 바로가기

기타 공부

시스템 공부 2일차 (gdb 사용법)

gdb로 파일 디버거 시작

gdb를 실행하기 위해서는 gdb (컴파일된) 실행 파일 이름으로 입력하여 시작하여야 합니다.

 

gdb list 옵션을 준 모습

gdb에서 list 옵션을 줘서 소스코드를 출력할 수는 있지만 그러기 위해선 gcc로 컴파일 할때 기본적으로 붙는 -o외에도 -g를 붙여서 디버깅이 가능하도록 해주어야 합니다.

main 함수 디스어셈블을 한 모습

gdb에 장점 중 하나라고 생각하는 함수별 디스어셈블 기능입니다. 하지만 이것이 오히려 직접 부딪혀 봐야하는 저 같은 초보자들에게는 단점이 될 수도 있습니다.

 

디버거로 프로그램을 실행하는 모습

gdb도 여타 다른 디버거들과 같이 실행 기능 또한 있습니다.

 

 

브레이크를 거는 모습

 

주소로 브레이크포인트를 잡을 수도 있고, 함수 이름으로 잡을 수도 있습니다.

브레이크를 걸면 아래와 같이 실행 됩니다.

 

 

브레이크를 걸고 run 명령을 실행한 모습

 

위 그림과 같은 상황에서 step이나 next를 통해 다음 단계를 실행 할 수 있다.

 

step명령어를 실행한 모습

 

next 1 명령어를 실행한 모습

 

info registers 명령어를 실행한 모습

info registers 명령어는 break 명령어로 breakpoint를 걸고 run명령으로 run을 해야 실행할 수 있습니다.

 

섹션은 동일한 역할을 하는 세그먼트의 집합입니다.

 

kill 명령어를 실행한 모습

kill 명령어를 쓰면 디버깅을 위에 사진과 같이 중단 할 수 있습니다.

 

continue 명령어를 실행한 모습

continue 명령을 사용하면 중단된 그 지점 부터 바로 프로그램 끝까지 실행할 수 있습니다.

 

help 명령어를 실행한 모습

help 명령어를 통해 명령어의 리스트를 출력 할 수 있다.

 

clear 명령어를 사용하는 모습

 

clear 명령어를 사용하면 특정 함수나 라인에 있던 breakpoint를 지울 수 있다.

 

info b를 실행한 모습

info b를 사용하면 지금까지 걸린 breakpoint 리스트를 볼 수 있습니다.

Tip. break, run, info, list, backtrack, temporary breakpoint, clear, until, continue 등.. 이러한 약어들을 gdb에서 사용 할 수 있습니다

 

info + TAB키를 실행하는 모습

 

info 뒤에 올 수 있는 인자들을 보여줍니다

 

 

방향키 Up/Down

 

방향키 Up/Down을 통해 그동안 실행한 명령어들을 볼 수 있다.

 

disable 명령어를 쓴 모습

 

disable 명령어를 통해 특정 고유번호를 가진 breakpoint를 비활성화 할 수 있습니다.

 

enable 명령어를 사용하는 모습

 

enable 명령어를 사용하면 특정 고유번호를 가진 비활성화된 breakpoint를 활성화 할 수 있습니다.

 

Temporary breakpoint를 설정한 모습

 

temporary breakpoint를 쓰면 한 번 쓰면 끝나는 임시 브레이크포인트를 만들 수 있습니다.

 

임시 브레이크 포인트는 한 번 실행하고 나면 없어진다

 

 

그냥 엔터를 친 모습

 

전에 명령어를 실행하고 그냥 엔터를 치면 전에 쳤던 명령어가 자동으로 입력되는 것 같다.

 

finish 명령어를 실행한 모습

 

이건 뭐지...? Cygwin 때문이라는 데혹시 아시는 분 댓글 좀 달아주세요...

 

 

return 명령어를 실행한 모습1

이건 뭐야...? 혹시 아시는 분 댓글 좀 달아주세요...

 

return 명령어를 실행한 모습2

 

뭐가 뭔지 모르겠네요 ㅠㅠ

 

quit 명령어를 사용한 모습

마지막으로, quit 명령어를 실행하면 종료가 가능합니다.

 

P.S 알아두면 좋을 x64디버거 사용 tip

 

1. F7은 함수가 있으면 들어가고 F8은 무조건 한 블록 씩 건너뛴다

 

2.

문자열로 메인함수를 찾을 수 있다.

3.

심볼로도 찾을 수 있다

4.

 

그 뒤에 참조 찾기로도 main함수를 찾을 수 있다.