Visual Studio(GUI)로 디버깅 하다
리눅스에서 gdb(CLI)로 디버깅하니 너무 힘들다.
gdb [프로그램명] : 시작
q(quit) or ctrl+d : 종료
list
b func : func 함수의 시작부분에 브레이크 포인트 설정
b 10 : 10행에 브레이크 포인트 설정
b *0x8049000 : 특정 주소에 브레이크 포인트 설정
tb : b와 같으나 1회용 브레이크 포인트. 문법은 b와 동일
info b : 현재 브레이크 포인트 보기
cl : 브레이크 포인트 지우기
d : 모든 브레이크 포인트 지우기
r(run) : 프로그램 수행
k(kill) : 프로그램 수행 종료
s(step) : 현재 행 수행 후 정지, 함수 호출시 함수 안으로 들어감
s 5 : s 다섯번 수행
n(next) : 현재 행 수행 후 정지, 함수 호출시 함수 수행 다음 행으로 감
n 5 : n 다섯번 수행
c(continue) : 다음 브레이크 포인트까지 진행
u : 현재 루프를 빠져나감
finish : 현재 함수를 수행하고 빠져 나감
return : 현재 함수를 수행하지 않고 빠져 나감
return : 위와 같으나 리턴값 지정
watch [변수명] : 특정변수에 와치 포인트를 설정하고, 특정변수가 바뀔 때마다 브레이크가 걸리면서 이전/현재 값을 출력한다.
info locals : 현재 스택의 로컬변수 모두를 출력
info variables : 전역변수 모두 출력 (스압)
p [변수명] : 해당변수 value 출력
포인터변수 입력시 주소값 출력, *포인터변수명 -> 실제 value 출력
p $[레지스터명] : 레지스터값 출력
p *[포인터] : struct/class의 배열일 때 배열의 크기를 알림
p /[출력형식][변수명] : 출력형식에 맞추어 변수값 출력
t : 2진수
o : 8진수
d : 부호없는 10진수
u : 부호없는 10진수
x : 16진수
c : 최초 1바이트 값을 문자형으로 출력
f : 부동소수점
a : 가장 가까운 심볼의 오프셋 출력
p (캐스팅)[변수명] : 변수를 캐스팅하여 출력 ( p (char*)ptr )
p [포인터변수or배열]+[숫자] : 특정 주소 + 숫자 위치 출력 ( p (array[1]+4) )
p [변수명] = [value] : 특정 변수의 값을 설정
info registers : 레지스터 전체 출력
display [변수명] : 매번 p 치기 귀찮으니 특정변수 진행 중 계속 출력
p와 동일한 방식으로 출력형식 지정가능
disalbe display [번호] : 일시적으로 디스플레이 중단
enable display [번호] : 중단했던 번호 다시 출력
undisplay [번호] : 출력하던 display 변수 제거
info f : 스택 프레임 내용 출력
info args : 함수 호출시 인자를 출력
info locals : 함수의 지역변수를 출력
info catch : 함수의 예외 핸들러를 출력
bt : 전체 스택 프레임 출력(콜스택)
frame [스택번호] : 스택번호의 스택 프레임으로 이동
up : 상위 스택 프레임으로 이동
up [숫자] : 숫자만큼 상위 스택프레임으로 이동
down : 하위 스택 프레임으로 이동
down [숫자] : 숫자만큼 하위 스택프레임으로 이동
x/[범위][출력형식][범위의단위][메모리주소나 함수명]
범위 : 기본 4바이트 단위
출력 형식
t : 2진수
o : 8진수
d : 부호없는 10진수
u : 부호없는 10진수
x : 16진수
c : 최초 1바이트 값을 문자형으로 출력
f : 부동소수점
a : 가장 가까운 심볼의 오프셋 출력
s: 문자열로 출력
i : 어셈블리 형식으로 출력
b : 1 byte
h : 2 byte
w : 4 byte
g : 8 byte
ex) x/10 main : main 함수로부터 40 byte 출력
disas [함수명] : 특정함수의 어셈블리 코드 출력
disas [주소][주소] : 주소 사이의 어셈블리 코드 출력
call [함수명(인자)] : 특정 함수를 인자값으로 호출
jump *[주소] : 주소로 강제적으로 분기
jump [행번호] : 특정 행으로 강제 분기
jump [함수명] : 특정 함수로 강제 분기
info signals : signal 종류 출력
info tab키 : info로 확인 가능한 명령어 출력
set {타입}[주소] = [값] : 특정 메모리에 값을 지정 ( set {int}0x8048300 = 100 )
info set : 설정 가능한 내용 출력
1) 역어셈블 표시
gdb$ disas (함수명) or gdb$ disas (함수 내의 시작 주소) (함수 내의 종료 주소)
함수에 포함되지 않는 영역을 역어셈블 하는 경우
gdb$ x/ (명령 수) i (선두 주소)
=> 앞쪽의 주소에서 지정된 명령어만큼 역어셈블
1) 브레이크 포인트 설정
gdb$ b (함수 이름) or gdb$ b (주소)
2) 브레이크 포인트 상태 표시
-브레이크 포인트가 어디에 설정되어 있는지 등의 상태를 확인
gdb$ i b (info break)
3) 브레이크 포인트 삭제,비활성화,활성화
-브레이크 포인트 삭제 : gdb$ d (브레이크 포인트 번호)
-브레이크 포인트 비활성화 : gdb$ disable (브레이크 포인트 번호)
-브레이크 포인트 활성화 : gdb$ enable (브레이크 포인트 번호)
-일정 횟수만큼 브레이크 포인트를 통과하게끔 비활성화 : gdb$ ignore (브레이크 포인트 번호) ( 비활성화 할 횟수)