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


129

OK, 정보 휴식 을 나열 브레이크 포인트가 아니라 --command을 사용하여 재사용와 함께 잘 작동 형식으로 이 문제로 . GDB에 다시 입력 할 수있는 파일로 덤프하는 방법이 있습니까? 때로는 디버깅 세션에서 테스트를 위해 일련의 중단 점을 작성한 후 GDB를 다시 시작해야합니다.

.gdbinit 파일은 --command와 같은 문제가 있습니다. 정보 나누기 명령은 오히려 인간의 소비를위한 테이블을 명령을 나열하지만,하지 않습니다.

자세한 내용은 info break 의 샘플입니다 .

(gdb) 정보 나누기
숫자 유형 Disp Enb 주소
1 중단 점 유지 y 0x08048517 <foo :: bar (void) +7>

답변:


204

GDB 7.2 (2011-08-23)부터는 이제 break breaks 명령을 사용할 수 있습니다 .

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.

source <filename>파일에서 저장된 중단 점을 복원하는 데 사용 합니다.


2
공유 라이브러리로드에서 온 경우는 어떻습니까? 그것은 기본적으로 N으로 대답합니다 ...Make breakpoint pending on future shared library load? (y or [n]) [answered N; input not from terminal]
bjackfly


시작시 ( break g_log if log_level==G_LOG_LEVEL_CRITICAL) 해결할 수없는 중단 점 조건이 있으면 gdb 7.8.1 이상에서 추가 명령 구문 분석이 중지됩니다. 해당 중단 점에 대해 추가 명령을 실행해야하는 경우 commands행 앞에 행을 넣으십시오 condition.
Lekensteyn

@Andry 나는 텍스트가 문서의 완전한 인용문이기 때문에 편집 내용을 원래의 인용구로 롤백했습니다 ... 대신 내 자신의 단어 인 경우 편집 내용에 동의합니다.
aculich

@aculich : 알겠습니다. 어떤 경우에도 코드 스타일 대신 인용 스타일을 사용하는 것이 좋습니다.
Andry

26

이 답변은 구식입니다. 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

breaks.txt 파일에는 다음이 포함됩니다.

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

.gdbinit또는 --command파일에 유용한 형식으로 변환하는 AWK 스크립트 작성 이 쉽습니다. 또는 스크립트 --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

잘라 내기 및 붙여 넣기를 쉽게 사용할 수는 있지만 스크립팅 방법이 좋은 방법 인 것 같습니다.
casualcoder

1
내가 잘라 내기 및 붙여 넣기 그냥 다음 번 스크립트를 작성 다시 때마다 사용 : 모든 후, 당신은 처음에이 질문을 바로 그 이유였습니다, 내가 :) 생각보다 쉽습니다 생각하지 않는다
요하네스 Schaub-litb

음, 로깅 방법 대신 잘라서 붙여 넣기를 사용했습니다. 스크립팅은 지금까지 확실합니다.
casualcoder

와! gdb 실패! 나는 매일 사용하고 많은 기능을 좋아합니다. 그러나 부족은 단순한 바보입니다.
deft_code

4
이 답변은 이제 2 년이 지났으므로 최신 버전의 gdb를 사용하는 경우 사용되지 않을 수 있습니다. gdb 7.2부터는 save breakpoints명령을 사용할 수 있습니다 .
aculich

11

프롬프트 에서 입력하는 것처럼 GDB 명령과 중단 점을 .gdbinit 파일 에 넣으면 gdb>시작시 GDB가 자동으로로드하고 실행합니다. 이것은 디렉토리 별 파일이므로 프로젝트마다 다른 파일을 가질 수 있습니다.


1
이것은 실제로 작동하지 않습니다. "경고 : 저장 추적 점 : 추적 할 추적 점이 없습니다." 중단 점 설정에도 불구하고 gdb 6.8 사용
casualcoder

이것은 나를 위해 작동합니다. GDB에는 'add-auto-load-safe-path /home/johnny/src/.gdbinit'콘텐츠가 포함 된 $ HOME / .gdbinit에 전역 .gdbinit가 있어야하므로 src / 폴더에도 별도의 .gdbinit가 있습니다.
truthadjustr

9

Johannes의 답변에 대한 anon의 확장 에 대한 확장 :

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


더 나은 정규 표현식은 다음과 같습니다. perl -ne "print \"break \ $ 1 \ n \ "if /at\s(.*:\d+)/"brestore.txt
George

6

Johannes의 답변 확장 : 출력을 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로 성공적으로 테스트했습니다 .


1
이 스 니펫에 감사합니다! 잘 작동합니다. Mac OS 10.5.8의 CarbonEmacs GNU Emacs 22.3.1 (i386-apple-darwin9.6.0, Carbon 버전 1.6.0)에서 GNU gdb 6.3.50-20050815 (Apple 버전 gdb-966)로 성공적으로 테스트되었습니다.
pestophagous


3

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

define bsave
    save breakpoints ~/.breakpoints
end

define brestore
   source ~/.breakpoints
end

1

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

또한 TUI 모드 에서 로깅을 사용하려고 할 때 GDB 에서이 오류 / 경고가 발생 합니다. 그러나 "TUI가 아닌"모드에서는 로깅이 작동하는 것 같습니다. 그래서 무언가를 기록하고 싶을 때마다 TUI 모드를 종료합니다. ( Ctrl+X , Ctrl+를A 사용하여 TUI 모드로 앞뒤로 전환 ).

내가 일하는 방법은 다음과 같습니다.

  1. GDB 시작 (일반 모드)
  2. 로깅 활성화 : set logging on-이제 불평하지 않아야합니다.
  3. 앞뒤로 TUI 모드로 전환하고 GDB 작업 수행
  4. 거대한 백 트레이스 덤프와 같이 무언가를 로그하고 싶을 때마다-일반 모드로 전환

아, 그리고 당신이 "화면"(나처럼)을 사용하는 것을 좋아한다면 그것은 같은 핫키를 사용하기 때문에 약간 지저분해질 것입니다.
Magnux

1

이전 답변에 다음과 같은 추가 사항이 브레이크 포인트를 특정 파일에 저장 /로드하는 데 유용하다는 것을 알았습니다.

  • 중단 점 저장 : bsave {filename}
  • 로드 중단 점 : bload {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

0

문제는 중단 점 설정이 상황에 따라 다르다는 것입니다. foo 라는 정적 함수가 두 개인 경우 어떻게 합니까?

foo를 정의하는 모듈 중 하나를 이미 디버깅하는 경우 GDB는 해당 모듈을 의미한다고 가정합니다. 그러나 "break foo"를 파일로 덤프 한 다음 시작할 때 해당 파일을 읽으면 foo가 어떤 기능 을 의미 하는지 명확하지 않습니다 .


0

다른 아이디어가 있습니까? 나는 얻었다

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