https://blogs.oracle.com/ksplice/entry/8_gdb_tricks_you_should
위 글의 내용을 알아보기 편하게 정리 함.
1. break WHERE if COND
"if COND"를 추가로 덧붙여서 특정 조건일 때 break를 걸 수 있다. loop안에 걸거나 특별한 케이스에 재현되는 버그를 잡을 때 쓰기 좋겠다.
2. command
break point를 잡은 후에 "command 1"과 같이 break point에 올 때마다 실행되는 command를 추가할 수 있다. 디버그 정보 프린트 할 때 쓰면 컴파일할 필요없이 원하는 정보를 break point에 올 때 마다 볼 수 있다.
(의문) if COND가 추가된 경우면 COND를 만족하는 경우만 실행되려나? --> 테스트 필요.
3. gdb --args
gdb 옵션에 "--args"를 쓰고 바이너리 -> argument 순서로 넣고 실행하면 된다. gdb 바이너리 한 다음에 gdb shell에서 "set args ..." 하는 것 보다는 반복 수행하기 훨 편하겠다.
4. source 파일 위치 지정
1) directory [source_path]
bin안에 있는 symbol의 path가 relative인 경우, 이렇게 하면 알아서 찾아준다.
2) set substitute-path [path_in_bin] [path_to_sources]
bin의 symbol이 absolute인 경우, 이렇게 하면 알아서 path앞부분을 substitute해서 찾아준다.
5. macro도 gdb에서 챙겨가면서 써 보자.
빌드 옵션에 -ggdb3 를 추가하면 macro도 gdb에서 보면서 처리할 수 있다.
6. gdb variable
set $varname = 4
이런 형태로 gdb variable을 설정할 수 있다. if COND에 들어갈 COND를 만들어 두면 쉽게 써먹을 수 있다. 복잡한 expression은 적절히 variable로 만들면 되겠다.
7. Register variable
$sp, $pi, $rsi 와 같이 architecture마다 존재하는 register는 predefined variable로 들어있다. if COND에 포함해서 사용할 수 있다.
8. 'x' command
'x' command로 특정 메모리에 있는 내용을 특정 포맷으로 출력할 수 있다.
x/FMT ADDRESS
FMT는 종류가 많으니 'help x'로 풀 리스트를 확인하자. 쓸만한건 여기다 리스트업 한다.
x : hex
d : signed decimal
c : character
i : instruction
s : C style string
(Example : gdb shell)
$x/s 0xffffffff0089ffae
...
댓글 없음:
댓글 쓰기