2012년 10월 15일 월요일

반드시 알아야 할 8 gdb tricks

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
  ...

댓글 없음:

댓글 쓰기