ETC/Linux

gdb 기초 사용법

쪽제비 2015. 9. 15. 19:49

gdb를 사용해야 할 일이 많아서 내가 사용하기에 맞게끔 정리를 해야겠다

인터넷을 뒤지다 보면 컴파일할때부터 gcc -g 옵션을 가지고 컴파일한 파일 위주로 설명이 되어 있다

나는 그렇게 컴파일한 파일을 디버깅 하려고 쓰는게 아니기 때문에 내가 하나씩 해보면서

정리를 하겠다.

인터넷에는 의외로 쓸모 없는 정보들이 참 많다.. ㅠㅠㅠ ,, 참고로 이글은 초보만 보기를..


1. gdb 실행

gdb 명령을 통해 들어가고 quit 를 통해 나갈 수 있다.


원하는 프로그램을 gdb로 실행하려면

gdb [프로그램 명]   으로 하면 되는데 다른 옵션들도 있으나 내가 필요한건 일단 이 명령이므로

이거에 대해서만 다룰거다


이거 네모 어떻게 그리는거지....

아무튼 test 파일을 gdb로 실행했다.


-프로그램 시작

run 명령을 통해서 시작을 햇다가 끝이 난다.

break point가 없어서 그런것이므로... 일단은 이렇게 시작한다는 것을 알면 되겠다.



2. disassemble

윈도우에서 사용하는 디버거를 사용해봤다면 어셈블리어로 디버깅 하는 것을 원했을지도 모른다

내가 그랬으니까.

찾다 찾다 내가 쓰는거다.

어셈블리어로 보면서 디버깅을 해보자

disassemble 주소

disassemble main

메인 함수에 대해 어셈블리어로 표현해 준다.

뒤에 주소를 써도 된다.

disassemble 이라고 전부다 치기 어렵다면 disas 정도까지만 치고 TAB키를 누르면 자동 완성된다. 편하다


x/명령수i 주소

무슨 뜻인지 이해가 되겠나 ?

x/3i 3줄을 표시하라는 뜻이다. 이또한 main 말고 0x8048394 를 넣어도 같은 결과를 낼 수 있다.


어셈블리어 문법

AT&T VS Intel 문법

두 분법에 차이가 있다.

쉽게 정리해 놓은게 있어서 출처를 남기고 

출처 : http://huammmm1.tistory.com/492

1. 레지스터를 나타낼 때


intel : eax


AT&T : %eax



2. operand 순서


intel : destination, source


AT&T : source, destination



3. 상수


intel : 5로 표기


AT&T : $5로 표기



4. 메모리 주소 참조


intel : [eax]


AT&T : (%eax)



5. 레지스터 + offset 위치의 메모리 주소를 참조할 때


intel : [eax + 4]


AT&T : 4(%eax)


이러한 차이점이 있는데... 나는 intel로 된게 좋다.... 그래서 바꿔 보겠다

set disassembly-flavor intel 
이렇게 쓰면 된다.

기호에 맞게 취향에 맞게 사용하면 된다. 난 이게 편하다...


3. breakpoint

처음에 run을 했을때 시작했다가 그냥 끝나는 것을 보았다.

이제는 breakpoint를 설정해서 그 부분에서 정지 하도록 해보자

break *main+3 

이런 식으로 브레이크 포인트를 지정하면 된다.

어디가 지정되어 있나 확인할때는

info break 명령을 하면 된다


슬슬 길어 진다... 이런식으로 하면 된다...

4. netxi stepi

이제 명령을 한줄씩 실행하는것을 알아보도록 할 거다...

이거까지만 쓰고 다음 글에 이어서 쓰도록 해야 겠다.

break point를 지정하고 run을 하면 거기서 멈춘다

그런데 나는 한줄 씩 보기를 원한다면...

계속 break point를 지정해주면서 확인할 것인가?

그래서 있는 명령어가 nexti 와 stepi 이다.

nexti는 단축으로 ni 

stepi 는 si 이다. 간편하다

브레이크 포인트 적용한 곳으로부터 한 명령씩 진행하는 것을 볼 수 있다.

stepi와 nexti의 차이점이라면...

stepi는 하위 함수를 따라간다. call이 있으면 그 주소로 따라가서 진행한다

그러나 nexti는 따라가지 않고 call이 진행되고 다음줄로 넘어간다.

이거는 다음에 해보면서 정리하도록 하자.





'ETC > Linux' 카테고리의 다른 글

make 유틸리티  (0) 2016.09.30
vi 에디터  (0) 2016.09.30
gdb 기초 사용법 (메모리, 레지스터 내용 읽기)  (0) 2015.09.16
gdb 기초 사용법2(stepi nexti 차이점)  (0) 2015.09.16
gcc 컴파일  (0) 2015.09.15