GDB 에서 알 아야 할 몇 가지 디 버 깅 방법

5177 단어 linuxgdb디 버 깅
쿨 케이스 로 전환:http://coolshell.cn/articles/3643.html
7,8 년 전에'GDB 로 디 버 깅 프로그램'을 한 편 썼 습 니 다.그래서 그 이후로 많은 친구 들 이 MSN 과 저 에 게 메 일 로 GDB 에 관 한 문 제 를 물 었 습 니 다.지금까지 GDB 에 관 한 문 제 를 물 었 습 니 다.이렇게 여러 해 동안 몇 가지 문 제 는 모두 가 반복 해서 묻 는 것 이다.한편,나 는 나의 이전의 문장 이 명확 하 게 말 하지 못 했 을 수도 있다 고 생각한다.다른 한편,나 는 모두 가 자주 묻 는 문제 가 바로 가장 유용 하 다 고 생각한다.그래서 여기에 나열 해 놓 았 다.보충 해 주시 기 바 랍 니 다.
다 중 스 레 드 디 버 깅
다 중 스 레 드 디 버 깅 은 아마 가장 많이 물 었 을 것 이다.사실 중요 한 것 은 다음 과 같은 몇 가지 명령 이다.
  • info thread 는 현재 프로 세 스 의 스 레 드 를 봅 니 다.
  • thread디 버 깅 스 레 드 를 지정 한 ID 스 레 드 로 전환 합 니 다.
  • break file.c:100 thread all  file.c 파일 100 줄 에 있 는 모든 스 레 드 에 정지점 을 설정 합 니 다.
  • set scheduler-locking of|on|step,이것 이 가장 많이 물 었 습 니 다.step 또는 contine 명령 을 사용 하여 현재 디 버 깅 스 레 드 를 디 버 깅 할 때 다른 스 레 드 도 동시에 실 행 됩 니 다.어떻게 디 버 깅 프로그램 만 실 행 됩 니까?이 명령 을 통 해 이 요 구 를 실현 할 수 있다.
  • off 는 모든 스 레 드 를 잠 그 지 않 습 니 다.이것 은 기본 값 입 니 다.
  • on 은 현재 디 버 깅 프로그램 만 실 행 됩 니 다.
  • step 가 한 단계 에 있 을 때 next 에서 함수 가 있 는 상황(상황 을 잘 아 는 사람 이 알 수 있 습 니 다.이것 은 사실 정지점 을 설정 하고 continue 하 는 행위)을 제외 하고 현재 스 레 드 만 실 행 됩 니 다.


  • 디 버 깅 매크로
    이 문 제 는 매우 많다.GDB 에서 매크로 는 미리 컴 파일 되 었 기 때문에 print 매크로 를 정의 할 수 없습니다.그러나 우 리 는 매크로 를 디 버 깅 할 방법 이 있다.이것 은 GCC 의 협조 가 필요 하 다.
    GCC 컴 파일 러 에-gdb 3 인 자 를 추가 하면 매크로 를 디 버 깅 할 수 있 습 니 다.
    또한,다음 GDB 의 매크로 디 버 깅 명령 을 사용 할 수 있 습 니 다. 관련 매크로 를 살 펴 보 겠 습 니 다.
  • info macro–이 매크로 가 어떤 파일 에서 인용 되 었 는 지,매크로 정의 가 어떤 지 볼 수 있 습 니 다.
  • macro–웅장 한 모습 을 볼 수 있 습 니 다.

  • 원본 파일
    이 질문 도 많 습 니 다.원본 파일 을 찾 지 못 한 다 는 친구 가 너무 많 습 니 다.여기 서 다음 검 사 를 하 라 고 말씀 드 리 고 싶 습 니 다.
  • 컴 파일 러 가 debug 정 보 를 포함 하기 위해-g 인 자 를 추가 하 였 습 니까?
  • 경로 가 올 바 르 게 설정 되 었 습 니까?원본 파일 의 디 렉 터 리 를 설정 하려 면 GDB directory 명령 을 사용 하 십시오.

  • 다음은 디 버 깅/bin/ls 의 예제(ubuntu 아래)를 드 립 니 다.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20 $ apt-get source coreutils $ sudo apt-get install coreutils-dbgsym $ gdb /bin/ls GNU gdb (GDB) 7.1-ubuntu (gdb) list main 1192    ls .c: No such file or directory. in ls .c (gdb) directory ~ /src/coreutils-7 .4 /src/ Source directories searched: /home/hchen/src/coreutils-7 .4:$cdir:$cwd (gdb) list main 1192        } 1193    } 1194 1195    int 1196    main (int argc, char **argv) 1197    { 1198      int i; 1199      struct pending *thispend; 1200      int n_files; 1201
    조건 단점
    조건 단점 [where]if[condition],이런 단점 은 정말 유용 하 다.특히 순환 이나 재 귀 에서 변 수 를 감시 해 야 한다.이 설정 은 GDB 에 있 습 니 다.다만 그 정지점 을 지나 갈 때마다 GDB 가 조건 이 만족 하 는 지 확인 해 줍 니 다.
    5.명령 행 매개 변수
    때때로,우리 가 디 버 깅 을 해 야 하 는 프로그램 은 명령 행 파라미터 가 있어 야 하 며,많은 친구 들 이 디 버 깅 프로그램의 명령 행 파 라미 터 를 어떻게 설정 해 야 하 는 지 모른다.사실 두 가지 방법 이 있 습 니 다.
  • gdb 명령 행 의–args 인자
  • gdb 환경 에서 set args 명령.

  • gdb 의 변수
    때때로 디 버 깅 프로그램 에서 우 리 는 실행 중인 변수 만 보 는 것 이 아니 라 프로그램의 변 수 를 직접 설정 하여 테스트 에서 발생 하기 어 려 운 상황 을 모 의 하고 오류 나 switch 의 분기 문 구 를 비교 할 수 있 습 니 다.set 명령 을 사용 하면 프로그램의 변 수 를 수정 할 수 있 습 니 다.
    그리고 gdb 에 도 변수 가 있 을 수 있다 는 것 을 아 십 니까?셸 처럼 gdb 의 변 수 는$로 시작 합 니 다.예 를 들 어 배열 의 모든 요 소 를 인쇄 하려 면 이렇게 할 수 있 습 니 다.
    1
    2
    3
    4
    5 (gdb) set $i = 0
      (gdb) p a[$i++]
      ...   #
    물론 프로그램의 변수 와 gdb 의 변 수 는 상호작용 을 할 수 있 음 을 나타 내 는 예시 일 뿐이다.
    명령
    아마도,당신 은 p 명령 을 사용 하 는 것 을 매우 좋아 할 것 입 니 다.따라서 변수 이름 을 모 를 때 당황 할 수 있 습 니 다.p 명령 은 항상 변수 이름 이 필요 하기 때 문 입 니 다.x 명령 은 메모 리 를 보 는 데 사 용 됩 니 다.gdb 에서"help x"는 도움말 을 볼 수 있 습 니 다.
  • x/x 16 진법 으로 출력
  • x/d 를 10 진법 으로 출력
  • x/c 단일 문자 로 출력
  • x/i  어 셈 블 리-보통 사용 합 니 다x/10i $ip-20 ($ip )
  • x/s 문자열 로 출력
  • 8.명령
    어떤 친구 들 이 나 에 게 어떻게 자동화 디 버 깅 을 하 느 냐 고 물 었 다.여기 서 command 명령 을 소개 합 니 다.간단하게 이해 해 보 세 요.gdb 명령 을 포장 하 는 것 입 니 다.약간 워드 프로세서 의'매크로'와 같 습 니 다.다음은 예시 입 니 다.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10 (gdb) break func Breakpoint 1 at 0x3475678: file test .c, line 12. (gdb) command 1 Type commands for when breakpoint 1 is hit, one per line. End with a line saying just "end" . >print arg1 >print arg2 >print arg3 >end (gdb)
    우리 의 정지점 이 도 착 했 을 때,command 의 세 명령 을 자동 으로 실행 하고,func 의 세 개의 매개 변수 값 을 출력 합 니 다.
    (전문 완료)

    좋은 웹페이지 즐겨찾기