Programing

중단점 목록을 저장하도록 GDB 가져오기

c10106 2022. 5. 8. 21:02
반응형

중단점 목록을 저장하도록 GDB 가져오기

그래, 정보 중단은 중단점을 나열하지만, 이 질문에서처럼 --command를 사용하여 중단점을 재사용하는 형식은 아니다.GDB는 그것들을 다시 입력할 수 있는 파일에 버리는 방법을 가지고 있는가?때로는 디버깅 세션에서 테스트를 위한 중단점 집합을 쌓은 후 GDB를 재시작해야 한다.

.gdbinit 파일에는 --command와 같은 문제가 있다.info break 명령은 명령을 나열하는 것이 아니라 사람이 소비하는 표를 나열한다.

자세한 내용은 정보 단절의 샘플을 참조하십시오.

(gdb) 정보 중단Num Type Disp Enb 주소 내용1 브레이크포인트 keep y 0x08048517 <foo::bar(bar)+7>

GDB 7.2(2011-08-23)부터는 중단점 저장 명령을 사용할 수 있다.

save breakpoints <filename>
  Save all current breakpoint definitions to a file suitable for use
  in a later debugging session.  To read the saved breakpoint
  definitions, use the `source' command.

파일에서 저장된 중단점을 복원하는 데 사용하십시오.

bsavebrestore를 GDB 명령으로 정의하여 중단점을 저장 및 복원하려면 ~/.gdbinit에 다음을 넣으십시오.

define bsave
    save breakpoints ~/.breakpoints
end

define brestore
   source ~/.breakpoints
end

나는 이전의 답변에 다음과 같은 추가가 특정 파일에 중단점을 저장/로드하는 데 유용하다는 것을 알았다.

  • 중단점 저장: bsave {filename}
  • 로드 중단점: {filename}을(를) 확대

이전 답변과 같이 ~/.gdbinit 파일에 다음 코드를 추가하십시오.

# Save breakpoints to a file
define bsave
    if $argc != 1
        help bsave
    else
    save breakpoints $arg0
    end
end
document bsave
Saves all current defined breakpoints to the defined file in the PWD
Usage: bsave <filename>
end

# Loads breakpoints from a file
define bload
    if $argc != 1
        help bload
    else
        source $arg0
    end
end
document bload
Loads all breakpoints from the defined file in the PWD
Usage: bload <filename>
end

이 대답은 시대에 뒤떨어져 있다.이제 GDB는 직접 저장을 지원한다.이 대답을 보십시오.

로깅을 사용할 수 있음:

(gdb) b main
Breakpoint 1 at 0x8049329
(gdb) info break
Num     Type           Disp Enb Address    What
1       breakpoint     keep y   0x08049329 <main+16>
(gdb) set logging file breaks.txt
(gdb) set logging on
Copying output to breaks.txt.
(gdb) info break
Num     Type           Disp Enb Address    What
1       breakpoint     keep y   0x08049329 <main+16>
(gdb) q

파일이 깨지다.txt에 포함되는 항목:

Num     Type           Disp Enb Address    What
1       breakpoint     keep y   0x08049329 <main+16>

AWK 스크립트를 작성하여 이를 유용한 형식으로 변환.gdbinit또는 a--command파일은 쉽다.아니면 대본을 따로 내보내게 할 수도 있다.--eval-command의 GDB 명령줄...

.gdbinit에 이 작은 매크로를 추가하면 다음과 같은 작업을 수행할 수 있다.

# Call with dump_breaks file.txt
define dump_breaks
    set logging file $arg0
    set logging redirect on
    set logging on
    info breakpoints
    set logging off
    set logging redirect off
end

요하네스의 대답에 대한 애논의 연장선상:

.gdbinit:

define bsave
    shell rm -f brestore.txt
    set logging file brestore.txt
    set logging on
    info break
    set logging off
    # Reformat on-the-fly to a valid GDB command file
    shell perl -n -e 'print "break $1\n" if /^\d+.+?(\S+)$/g' brestore.txt > brestore.gdb
end
document bsave
  store actual breakpoints
end

define brestore
  source brestore.gdb
end
document brestore
  restore breakpoints saved by bsave
end

와 함께brestore그런 다음 로 저장된 중단점을 복원할 수 있다.bsave.

.gdbinit 파일에 GDB 명령과 중단점을 입력할 때와 동일하게 입력하십시오.gdb>프롬프트가 표시되고, GDB는 시작 시 자동으로 로딩되어 실행된다.이것은 디렉터리별 파일이기 때문에 프로젝트별로 다른 파일을 가질 수 있다.

요하네스로부터의 답변에 대한 확장: 출력을 자동으로 다시 포맷할 수 있음info break유효한 GDB 명령 파일로:

.gdbinit:

define bsave
   shell rm -f brestore.txt
   set logging file brestore.txt
   set logging on
   info break
   set logging off
   # Reformat on-the-fly to a valid gdb command file
   shell perl -n -e 'print "break $1\n" if /^\d+.+?(\S+)$/g' brestore.txt > brestore.gdb
end
document bsave
  store actual breakpoints
end

그 후에 유효한 명령 파일이brestore.gdb.

이것은 지원서를 컴파일할 때 나에게 효과가 있었다.-g.

또한 우분투 9.10 (Karmic Koala)에서 GDB v6.8로 성공적으로 시험해 보았다.

아마도 이것은 다음과 같다.

save breakpoints [filename]

경고: 현재 출력 프로토콜이 리디렉션을 지원하지 않음

나는 또한 TUI 모드에서 로깅을 활성화하려고 할 때 GDB에서 이 오류/경고를 받는다.그러나 "비 TUI" 모드에서는 로깅이 작동하는 것 같다.그래서 나는 어떤 것을 기록할 때마다 TUI 모드를 떠난다. (+ , + )와 함께 TUI 모드로 앞뒤로 이동한다.

내 작업 방식:

  1. GDB 시작(정상 모드)
  2. 기록 로펌/사서명사:set logging on- 이제 불평해서는 안 된다.
  3. 뒤로/뒤로 TUI 모드로 전환하고 GDB 작업을 수행하십시오.
  4. (대규모의 역추적 덤프)를 기록하려는 경우 - 일반 모드로 전환

문제는 중단점을 설정하는 것이 상황에 민감하다는 점이다.foo라는 이름의 정적 기능이 두 개 있으면 어떻게 하시겠습니까?

foo를 정의하는 모듈 중 하나를 이미 디버깅하고 있다면 GDB는 당신이 그 모듈을 의미한다고 가정할 것이다.그러나 "break foo"를 파일에 덤프한 다음 시작 시 해당 파일을 읽으면 foo가 어떤 기능을 의미하는지 알 수 없다.

다른 생각 있나요?가지고 있다

warning: Current output protocol does not support redirection

다음에

set logging on

편집:

나는 그 질문이 "파단점 목록을 저장하는 방법"이라는 것을 알고 있지만, 내가 방금 발견한 것은 GDB로 우리는 단순히 "파일에 저장"파단점을 설정할 수 있다는 것이다.

gdb> source breakpoints.txt

어디에breakpoints.txt다음과 같은 파일:

break main.cpp:25
break engine.cpp:465
break wheel.cpp:57

참조URL: https://stackoverflow.com/questions/501486/getting-gdb-to-save-a-list-of-breakpoints

반응형