대화식 디버깅 중 gdb 출력을 강조 표시하고 색상을 지정하는 방법은 무엇입니까?


172

나는 ddd, nemiver, emacs, vim 또는 다른 프론트 엔드를 사용해야한다고 대답하지 말고 gdb를 그대로 선호하지만 일부 터미널 색상으로 출력을보고 싶습니다.


4
그것은 당신에게 색상을주지 않을 것입니다 (그래서 나는 이것을 대답이라고 부르지 않을 것입니다), 그러나 ~ / .gdbinit 구성은 경험을 향상시킬 것입니다. 나는 이것을 최소한으로 사용합니다 : 세트 기록 저장 세트 인쇄 꽤 세트 출력 기수 16 세트 높이 0
activout.se

허용 된 답변을 변경하여 이전의 잘못된 답변을 삭제할 수 있습니다. 감사.
ddaa

현재 행을 강조 표시하면 sourceware.org/bugzilla/show_bug.cgi?id=21044l 가 구현 되면 a에 추가 하고 Dev Nirvana를 입력합니다. lhook-stop
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

답변:


183

.gdbinit

~/.gdbinit색상을 가지도록 조정할 수 있습니다 . mammon을 .gdbinit사용할 수 있습니다 :

https://github.com/gdbinit/gdbinit

원하는만큼 조정할 수도 있습니다. 나는 이 SO 답변 덕분에 이것을 발견했다 . 얻을 수있는 출력 종류는 다음과 같습니다.

.gdbinit

GitHub 리포지토리도 사용할 수 있습니다 : https://github.com/gdbinit/Gdbinit

참고로, 동일한 아이디어가 lldb 에도 적용되었습니다 .

GDB 대시 보드

동일한 개념에 따라 GDB 대시 보드 는 Python에서 GDB를위한 모듈 식 시각적 인터페이스를 제공합니다.

GDB 대시 보드

(보이드) 워커

또 다른 유사한 프로젝트는 GDB의 Python 지원을 사용하여 확장 성을 제공하므로 https://github.com/dholm/voidwalker를 확인 하십시오.

@dholm은 또한 이전 .gdbinit에서 영감을 얻은 .gdbinit를 제공합니다 .

(보이드) 워커

pwndbg

일부 프로젝트는 개선 된 디스플레이를 포함하여 유용한 기능 세트를 제공합니다. PEDA 또는 pwndbg 의 경우입니다 . 후자는 다음과 같은 설명을 제공합니다.

PEDA 대체품. 우리의 좋은 친구의 정신 windbg, pwndbg발음된다 pwnd-bag.

  • 속도
  • 복원력
  • 깨끗한 코드

PEDA와 유사한 디버깅 및 개발 개발을 지원하는 명령을 제공하며 더 나은 표시가 가능합니다 (프로젝트의 주요 초점은 아니지만). 소프트웨어가 아직 개발 중이며 아직 제대로 릴리스되지 않았습니다.

pwndbg

볼트론

프로젝트 설명 상태 :

Voltron은 해커를위한 확장 가능한 디버거 UI입니다. 다른 터미널에서 실행되는 유틸리티 뷰를 디버거 (LLDB 또는 GDB)에 연결하여 디스 어셈블리, 스택 내용, 레지스터 값 등과 같은 유용한 정보를 표시하면서도 이전과 동일한 디버거 CLI를 제공합니다.

.gdbinit자동으로 통합하도록을 수정할 수 있습니다 . 그러나 디스플레이 자체는 GDB 외부에 있습니다 (예 : tmux 분할).

볼트론

GEF

GEF 는 또 다른 옵션이며 다음과 같이 설명됩니다.

동적 분석 및 익스플로잇 개발 과정에서 Python API를 사용하여 GDB에 추가 기능을 제공하기 위해 주로 익스플로 터 및 리버스 엔지니어가 사용하는 것이 목표입니다.

GEF


답변 주셔서 감사합니다. 레지스터 출력을 끄는 방법에 대한 아이디어가 있습니까? (나는 C ++ 코드에 gdb를 사용하고 있으며 어셈블러 레벨이 필요하지 않습니다)
vak

예. 젠장 "댓글은 15 자 이상이어야합니다."
vak

1
@vak 시도 set $SHOWCPUREGISTERS = 0했습니까? 기본적으로 몇 가지 매개 변수를 설정할 수 있으며 필요에 따라 코드를 항상 수정할 수 있습니다.
BenC

100

색상은 아니지만 gdb의 텍스트 gui를 고려하십시오 . 사용 가능한 gdb와는 크게 다릅니다.

다음과 같이 시작할 수 있습니다.

gdb -tui executable.out

스크린 샷 :

여기에 이미지 설명을 입력하십시오

보다시피 주요 기능은 다음과 같습니다.

  • 소스의 어떤 라인과 주변 라인을 보여줍니다
  • 중단 점 표시

5
와! 감사! 나는 gdb를 둘러싼 멋진 그래픽 쉘을 오랫동안 찾고 있었고 xxgdb, kgdb 및 ddd를 시도했지만 그중 어느 것도 나를 위해 잘 작동하지 않았으므로 평범한 이전 명령 줄 인터페이스를 고수했습니다. 그러나 이것은 절대적으로 완벽합니다!
Thomas Padron-McCarthy

46
Ctrl-x Ctrl-a : 텍스트 GUI 모드로 전환하거나 명령 행 옵션 없이도 작동하려면 이것을 입력하십시오.
jturcotte

2
프로그램에서 stdout으로 인쇄하면 인터페이스가 손상됩니다. 리디렉션 이외의 해결 방법이 있습니까?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

1
stdout이 인터페이스를 깨는 것과 동일한 문제가 발생합니다. Ctrl-L 또는 다시 그리기 바인딩이 무엇이든 적어도 사용할 수 있습니다. vi 편집 모드를 사용하는 사용자의 경우 Ctrl-X Ctrl-A가 작동하지 않지만 'layout src'명령은 이미지와 같이 소스가 표시된 TUI 모드로 전환합니다.
wilywampa

1
두 번째 터미널을 열고 다음 명령을 실행하십시오. $ tty 결과를 사용하여 (gdb) set inferior-tty 명령을 사용하여 gdb 세션에서 해당 터미널로 stdout을 보내십시오. 전의. 내 .gdbinit에서 inferior-tty / dev / tty2를 설정하면 stdout이 $ gdb -tui를 망칠 수 없습니다.
netskink

46

나는 당신이 프론트 엔드를 원하지 않았다는 것을 알고 있습니다. 그러나 cgdb 는 gdb와 매우 비슷하지만 텍스트 모드이지만 코드에서 구문 강조 표시가있는 위의 소스 창이 있습니다.


2
sudo apt-get install cgdb
cs01

2
진짜 운이 좋았 :)
무식한

그냥 실행 해 보았습니다 .gdb 기록이 표시되지 않으며 캐럿과 기호를 입력하는 실제 위치 사이에 공백 이 있습니다 . gdb ) . 전혀 감동하지 않았습니다.
Hi-Angel

19

색상을 사용하여 gdb의 모양을 크게 향상시킬 수 있습니다. 이는 다음 방법 중 하나를 통해 수행됩니다.

  1. "프롬프트 프롬프트"를 통한 컬러 프롬프트. 예를 들어, 프롬프트를 굵고 빨간색으로 표시하십시오.

    set prompt \033[1;31m(gdb) \033[m

    또는 프롬프트를 굵고 빨간색으로 새 모양으로 만듭니다.

    set prompt \033[01;31m\n\n#####################################> \033[0m

    여기에 이미지 설명을 입력하십시오

  2. 후크를 통한 컬러 명령

  3. "list"명령의 색상이 지정된 구문 강조 표시.

모든 예제는 Michael Kelleher가 작성한 다음 블로그 게시물에서 볼 수 있습니다.

"GDB 아름답게하기", 2010 년 5 월 12 일 (아카이브를 통해)

"실험적인 GDB 구문 강조", 2010 년 5 월 15 일 (archive.org를 통해)


14
링크가 끊어졌습니다.
John Carter

7
@Mike : 사이트에 더 이상 액세스 할 수없고 robots.txt가 archive.org에서 색인을 생성하지 못하도록하기 때문에 해당 링크의 컨텐츠를 여기에 게시하는 것이 유용합니다.
Lucian Adrian Grijincu

1
관련 정보는 여기에서 얻을 수 있습니다 : sourceware.org/gdb/current/onlinedocs/gdb/Prompt.html
musiphil

1
링크는 이제 블로그 게시물의 archive.org 캐시를 가리 킵니다.
Alex Quinn

1
@ 마이크로 블로그 글의 작성자 인 것 같습니다. 그렇다면 답변에이를 공개해야합니다.
David Z

13

다가오는 GDB 8.3의 새로운 기능 !

https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;a=blob;f=gdb/NEWS

이제 CLI 및 TUI에 터미널 스타일을 사용할 수 있습니다. GNU 소스 하이라이트는 또한 소스 코드 스 니펫의 스타일을 제공하는 데 사용될 수 있습니다. 자세한 정보는 아래의 "스타일 설정"명령을 참조하십시오.

gdb 8.2.91.20190401-23.fc30의 스크린 샷


최고의 답변! gdb 8.3 medium.com/@simonconnah/… 설치 방법에 대한 자습서를 여기에서 찾을 수 있습니다. 컴퓨터에는 최소 512MB 의 RAM이 필요합니다. 그렇지 않으면 gcc컴파일러가 휴지통을 시작합니다.
사용자

7
#into .gdbinit
shell mkfifo /tmp/colorPipe

define hook-disassemble
echo \n
shell cat /tmp/colorPipe | c++filt | highlight --syntax=asm -s darkness -Oxterm256 &
set logging redirect on
set logging on /tmp/colorPipe
end 

define hookpost-disassemble
hookpost-list
end 

define hook-list
echo \n
shell cat /tmp/colorPipe | c++filt | highlight --syntax=cpp -s darkness -Oxterm256 &
set logging redirect on
set logging on /tmp/colorPipe
end 

define hookpost-list
set logging off 
set logging redirect off 
shell sleep 0.1s
end 

define hook-quit
shell rm /tmp/colorPipe
end 

define re
hookpost-disassemble
echo \033[0m
end 
document re
Restore colorscheme
end 

경고 : 버기. TUI 지원, '사용자 모드'해킹이 없습니다.

여기서 주요 부분을 찾아서 약간 수정했습니다. 강조 표시, c ++ filt가 필요합니다. 색상이 엉망이되면 명령을 다시 발행하십시오.


7

cgdb 보다 훨씬 낫다 gdb -tui


동의했다. 내 프로그램에 의해 인쇄 된 간단한 줄은 gdb -tui의 콘솔을 휴지통에 버렸습니다. cgdb에서는 발생하지 않습니다. 팁 고마워!
랜달 쿡


4

다음과 같이 강조하고 싶었습니다. 라이브러리가 아닌 소스 파일에 속하는 스택 추적 행을 강조하십시오.

해결책은 gdb-python을 사용하는 것입니다 (MSYS에서; Linux에서는 일반적으로 gdb이미 Python이 내장되어 있습니까?), hook backtrace, use

python stack_trace = gdb.execute('backtrace', False, True')

그런 다음 stack_trace파이썬의 정규 표현식으로 처리하고 인쇄하십시오. 굵은 색과 다른 색은 다음과 같은 기능으로 달성됩니다.

def term_style(*v):
    """1 is bold, 30--37 are the 8 colours, but specifying bold may also
    change the colour. 40--47 are background colours."""
    return '\x1B['+';'.join(map(str, v))+'m'

#Use like this:
print term_style(1) + 'This will be bold' + term_style(0) #Reset.
print term_style(1,30) + 'This will be bold and coloured' + term_style(0)
print term_style(1,30,40) + 'Plus coloured background' + term_style(0)

후크를 사용하는 실제 사례 (최소한 경우에도)가 더 환영받을 것입니다.
Hi-Angel

4

이 구성으로 또 다른 좋은 색상 조합이 제공됩니다 . 백 트레이스 검사가 훨씬 쉬워집니다. 사용하려면 해당 파일을 다른 이름으로 저장하고 ~/.gdbinitgdb를 정상적으로 실행하십시오.


고마워, 이것은 내가 찾던 것입니다. 나는 긴 호출 스택을 가진 멀티 스레드 응용 프로그램을 조사하고 있었고 이는 역 추적에 완벽합니다.
Johan Bjäreholt

-2

원하는 색상을 얻을 수 있습니다.

# gdb
(gdb) shell echo -en '\E[47;34m'"\033[1m"
...
anything is now blue foreground and white background
...
(gdb) shell tput sgr0
... back to normal
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.