gdb 디버거에 대한 가장 까다 롭고 유용한 명령


138

gdb 또는 dbx와 같은 디버거를 실행하는 동안 가장 까다 롭고 유용한 명령을 게시 할 수 있습니다.


이 문서가 훌륭하다는 것을 알았습니다. scc.ustc.edu.cn/zlsc/sugon/intel/debugger/cl/…
Rick

답변:


134
  1. 역 추적 전체 : 지역 변수로 완전한 역 추적
  2. , 아래 , 프레임 : 프레임을 통해 이동
  3. watch : 특정 조건이 충족되면 프로세스를 일시 중단합니다
  4. 예쁜 인쇄 설정 : 예쁘게 포맷 된 C 소스 코드를 인쇄합니다
  5. 로깅 설정 : 지원을 위해 다른 사람에게 보여주기 위해 디버깅 세션 로그
  6. 인쇄 배열 설정 : 예쁜 배열 인쇄
  7. 마무리 : 기능이 끝날 때까지 계속
  8. 활성화비활성화 : 중단 점 활성화 / 비활성화
  9. tbreak : 한 번 중단 한 후 중단 점 제거
  10. where : 현재 실행중인 줄 번호
  11. 정보 지역 : 모든 지역 변수보기
  12. info args : 모든 함수 인수보기
  13. 목록 : 소스보기
  14. rbreak : 정규 표현식과 일치하는 함수에서 중단

7
info locals-모든 지역 변수를 봅니다. 리스트-소스보기; rbreak-정규식과 일치하는 함수를 중단합니다.
Paul Biggar

source / path / to / macro / file 그리고 모든 멋진 매크로는 몇 초 안에 디버깅하는 데 도움이됩니다.
Sudhanshu

1
set print object on다형성 요소의 set print elements 0경우 매우 자주 사용하는 두 가지 명령입니다. 매우 유용합니다.
Kiril Kirov

1
또한 t a a bt(의미 thread apply all backtrace) (거의) 다른 모든 명령과 함께 사용할 수 있습니다. 에 특히 유용합니다 bt full.
Kiril Kirov


45

gdb 7.0부터는 뒤집을 수있는 디버깅 기능 이 있으므로 자주 사용하는 새로운 명령은 다음과 같습니다.

* reverse-continue ('rc') -- Continue program being debugged but run it in reverse
* reverse-finish -- Execute backward until just before the selected stack frame is called
* reverse-next ('rn') -- Step program backward, proceeding through subroutine calls.
* reverse-nexti ('rni') -- Step backward one instruction, but proceed through called subroutines.
* reverse-step ('rs') -- Step program backward until it reaches the beginning of a previous source line
* reverse-stepi -- Step backward exactly one instruction
* set exec-direction (forward/reverse) -- Set direction of execution.

21

"-tui"매개 변수로 GDB를 시작하는 대신 "wh"를 입력하여 잠시 후 텍스트 모드로 전환 할 수도 있습니다.


3
Ctrl-a a '정상'명령 행보기로 다시 전환!
케빈

2
"- '는'wh '로 인스 타트 될 수있다. 더 짧을수록 좋다 .. :)
raj_gt1

6
Ctrl-a a? 농담인가요? tmux/ screen명령 처럼 보입니다 . 그리고 나를 위해 작동하지 않습니다. 그것은 중 하나 여야합니다 같은문서 : C-x C-a, C-x a, C-x A.
x-yuri

실제로 C-x a입니다. 또한 함께보기를 전환 할 수 C-x 1C-x 2투이 모드에서 볼 때 조립뿐만 아니라 (필요가있을 경우).
Sam Whitlock

16

thread apply all bt또는 thread apply all print $pc: 모든 스레드가 수행하는 작업을 신속하게 파악합니다.


그것은 내가 오랫동안 찾고 있던 명령이었습니다! 30 개의 스레드를 하나씩 하나씩 확인하는 것은 정말 불쾌합니다!
tothphu


6

-command=<file with gdb commands>gdb를 시작하는 동안 옵션 사용 와 동일합니다 -x <command file>. 이 명령 파일은 중단 점, 옵션 등과 같은 gdb 명령을 포함 할 수 있습니다. 특정 실행 파일이 gdb를 사용하여 연속적인 디버그 실행을 거쳐야하는 경우에 유용합니다.


-iex옵션을 사용 하여 gdb 명령 행에서 개별 명령을 추가 할 수도 있습니다 .
doug65536

5

스크립팅 gdb는 스케줄러 잠금을 설정 / 해제하여 다른 스레드를 실행할 때 다른 스레드가 실행되는 것을 방지하는 것 외에는 좋은 트릭입니다.


1
스케줄러 잠금을 어떻게 설정합니까?
deft_code 2018 년

3
set scheduler-locking on내부 gdb
Ben

어떻게 이것을 기본값으로 설정합니까? .gdbinit를 시도했지만 gdb가 /home/omry/.gdbinit:1을 인쇄합니다. 소스 명령 파일의 오류 : 대상 '없음'이이 명령을 지원할 수 없습니다.
Omry Yadan 1

4
  • .gdbinit 사용 (매크로를 작성하고 gdb에서 호출 할 수있는 시작 파일) gdb가로드 될 때마다 선택되도록 홈 디렉토리에 .gdbinit를 배치하십시오.
  • 모든 활성 스레드 를 나열하는 정보 스레드 및 f (#)-> # 전환하려는 스레드 번호

  • 언젠가 gdb를 사용하여 16 진수에서 10 진수 또는 이진으로 변환하면 계산기를 여는 대신 매우 편리합니다.

    • p / d 0x10-> 0x10에 해당하는 10 진수를 제공합니다.
    • p / t 0x10-> 이진 0x10
    • p / x 256-> 16 진수 256

4

-tui 옵션을 사용하여 gdb를 시작하는 대신 프로그램에서 실행중인 코드 행을 강조 표시하는 화면이 포함 된 하위 프로세스를 보려면 Cx o 및 Cx a를 사용하여이 기능을 시작 및 종료하십시오. 이 기능을 사용하고 있으며 일시적으로 사용하지 않는 기능이 있으면 위쪽 화살표를 사용하여 이전 명령을 가져올 수 있습니다.


2
focus cmd위 / 아래 화살표가 작동하도록 명령 창으로 포커스를 변경할 수 있습니다 . 을 사용하여 다시 전환 focus src합니다.
Nathan Fellman

3

이것은 유용 할 수 있지만 개선 될 수 있다고 확신합니다. 환영하십시오.

define mallocinfo
  set $__f = fopen("/dev/tty", "w")
  call malloc_info(0, $__f)
  call fclose($__f)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.