Como destacar e colorir a saída gdb durante a depuração interativa?

172

Por favor, não responda. Devo usar ddd, nemiver, emacs, vim ou qualquer outro front-end. Apenas prefiro o gdb, mas gostaria de ver sua saída com algumas cores de terminal.

elmarco
fonte
4
Ele não fornecerá cores (portanto, não chamarei isso de Resposta), mas algumas configurações ~ / .gdbinit melhorarão a experiência. Eu uso isso como um mínimo: história set salvar no set de impressão bastante conjunto de saída de radix 16 set altura 0
activout.se
Seria bom alterar a resposta aceita para que minha resposta antiga e incorreta possa ser excluída. Obrigado.
Ddaa
Depois que a linha atual de destaque lfor implementada , sourceware.org/bugzilla/show_bug.cgi?id=21044 , adicionarei apenas la hook-stope insiro Dev Nirvana.
Ciro Santilli #

Respostas:

183

.gdbinit

Você pode ajustar o seu ~/.gdbinitpara ter cores. Você pode usar o Mammon, .gdbinitdisponível aqui:

https://github.com/gdbinit/gdbinit

Você pode ajustá-lo o quanto quiser também. Achei isso graças a esta resposta SO . Aqui está o tipo de saída que você pode obter:

.gdbinit

Um repositório GitHub também está disponível: https://github.com/gdbinit/Gdbinit

Em uma nota lateral, a mesma idéia também foi aplicada ao lldb .

Painel GDB

Seguindo o mesmo conceito, o GDB Dashboard fornece uma interface visual modular para o GDB em Python.

Painel GDB

andador (vazio)

Outro projeto semelhante usa o suporte Python do GDB para fornecer mais extensibilidade, portanto vale a pena conferir: https://github.com/dholm/voidwalker

O @dholm também fornece seu próprio .gdbinit inspirado no anterior.

andador (vazio)

pwndbg

Alguns projetos fornecem um conjunto de funções úteis, incluindo exibição aprimorada. Este é o caso de PEDA ou pwndbg . Este último fornece a seguinte descrição:

Uma substituição PEDA. No espírito do nosso bom amigo windbg, pwndbgé pronunciado pwnd-bag.

  • Rapidez
  • Resiliência
  • Código limpo

Ele fornece comandos para dar suporte à depuração e explorar um desenvolvimento semelhante aos do PEDA e exibir melhor (embora esse não seja o foco principal do projeto). O software ainda está em desenvolvimento e ainda não foi lançado corretamente.

pwndbg

voltron

A descrição do projeto indica:

Voltron é uma interface de usuário extensível para depurador para hackers. Permite anexar visualizações de utilitários em execução em outros terminais ao seu depurador (LLDB ou GDB), exibindo informações úteis como desmontagem, conteúdo da pilha, valores de registro etc., enquanto ainda fornece a mesma CLI do depurador à qual você está acostumado.

Você pode modificar o seu .gdbinitpara integrá-lo automaticamente. No entanto, a própria tela está fora do GDB (por exemplo, em uma divisão do tmux).

voltron

GEF

O GEF é outra opção e é descrito como:

Seu objetivo é ser usado principalmente por exploradores e engenheiros reversos, para fornecer recursos adicionais ao GDB usando a API Python para auxiliar durante o processo de análise dinâmica e explorar o desenvolvimento.

GEF

BenC
fonte
muito obrigado pela sua resposta, você tem uma idéia de como desativar a saída do registro? (estou usando gdb para o código C ++ e não necessitam de nível assembler imediato)
vak
sim. Droga "Os comentários devem ter pelo menos 15 caracteres."
vak
1
@vak você tentou set $SHOWCPUREGISTERS = 0? Basicamente, você tem vários parâmetros que podem ser configurados e sempre pode modificar o código para atender às suas necessidades.
BenC
100

Não são cores, mas considere o gui de texto do gdb . Faz uma grande diferença em como o gdb é utilizável.

Você pode iniciá-lo com:

gdb -tui executable.out

Captura de tela:

insira a descrição da imagem aqui

Como você pode ver, os principais recursos são:

  • mostra em que linha da fonte estamos e as linhas circundantes
  • mostra pontos de interrupção
John Carter
fonte
5
Uau! Obrigado! Há muito tempo que estou procurando por um bom shell gráfico em torno do gdb, e tentei xxgdb, kgdb e ddd, mas nenhum deles funcionou muito bem para mim, por isso fiquei com a antiga interface de linha de comando. Mas isso é absolutamente perfeito!
Thomas Padron-McCarthy
46
Ctrl-x Ctrl-a: digite para alternar para e do modo de texto da GUI, funciona mesmo sem a opção de linha de comando.
Jturcotte #
2
Imprimir em stdout a partir do programa interrompe a interface para mim. Alguma solução alternativa além de redirecioná-lo?
Ciro Santilli #
1
Eu recebo o mesmo problema com o stdout quebrando a interface. Ctrl-L ou qualquer que seja sua ligação de redesenho torna pelo menos utilizável. Para pessoas com o modo de edição vi ativado, Ctrl-X Ctrl-A não funciona, mas o comando 'layout src' o colocará no modo TUI com a fonte mostrada como a imagem.
Wilywampa
1
Abra um segundo terminal e, em seguida, emita o comando: $ tty Use o resultado para direcionar o stdout da sessão gdb para esse terminal usando o comando (gdb) set inferior-tty. ex. do meu conjunto .gdbinit inferior-tty / dev / tty2 agora seu stdout não irá atrapalhar o $ gdb -tui.
Netskink 18/01/16
46

Eu sei que você não queria um frontend. Mas e quanto ao cgdb, ele é muito próximo ao gdb, é um modo de texto, mas tem uma janela de origem acima com destaque de sintaxe no código.

Johan
fonte
2
sudo apt-get install cgdb
cs01
2
Um verdadeiro acaso :)
1919 Ignorant
Apenas tentei executá-lo: ele não vê nenhum histórico de gdb e também possui um prompt danificado, onde há algum espaço em branco entre o sinal de intercalação e o local real onde o símbolo está sendo digitado (provavelmente porque eu tenho um prompt colorido em gdb ) . Não estou impressionado.
Hi-Angel
19

É possível melhorar muito a aparência do gdb através do uso de cores. Isso é feito através de qualquer um dos seguintes métodos:

  1. Prompt colorido com o "prompt definido". Por exemplo, torne o prompt em negrito e vermelho:

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

    ou faça do prompt uma nova forma, em negrito e vermelho:

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

    insira a descrição da imagem aqui

  2. Comandos coloridos através de ganchos

  3. Realce de sintaxe colorido do comando "list".

Todos os exemplos estão disponíveis nos seguintes posts escritos por Michael Kelleher:

"Embelezar o GDB", 12 de maio de 2010 (via archive.org)

"Destaque experimental da sintaxe do GDB", 15 de maio de 2010 (via archive.org)

Mike
fonte
14
Os links estão quebrados.
John Carter
7
@ Mike: seria útil postar o conteúdo desses links aqui, já que o site não está mais acessível e o robots.txt impediu que o archive.org o indexasse.
Lucian Adrian Grijincu
1
Você pode obter as informações relevantes aqui: sourceware.org/gdb/current/onlinedocs/gdb/Prompt.html
musiphil
1
Os links agora estão apontados para um cache archive.org das postagens do blog.
Alex Quinn
1
@ Mike, parece que você é o autor das postagens do blog; Nesse caso, você deve divulgar isso na resposta.
David Z
13

Novo no próximo GDB 8.3!

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

O estilo do terminal está agora disponível para a CLI e a TUI. O GNU Source Highlight também pode ser usado para fornecer estilo de trechos de código-fonte. Veja os comandos "definir estilo", abaixo, para mais informações.

captura de tela do gdb 8.2.91.20190401-23.fc30

elmarco
fonte
Melhor resposta NUNCA! Você pode encontrar aqui um tutorial sobre como instalar gdb 8.3 medium.com/@simonconnah/… , observe que sua máquina precisa de pelo menos 512 MB de RAM; caso contrário, o gcccompilador começará a lixeira.
usuário
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 

Atenção: Buggy. Não há suporte para TUI, hack 'modo de usuário'.

Encontrei a parte principal aqui e a modifiquei um pouco. Precisa destacar, c ++ filt. Se as cores ficarem bagunçadas, emita um comando novamente.

ftk
fonte
7

cgdb é muito melhor que gdb -tui

justin.yqyang
fonte
Acordado. Linhas simples impressas pelo meu programa destruíram o console do gdb -tui. Isso não acontece no cgdb. Obrigado pela dica!
Randall Cook
4

Eu queria destacar da seguinte maneira: enfatize as linhas de um rastreamento de pilha que pertencem aos meus arquivos de origem (em vez de bibliotecas).

A solução foi usar gdb-python (no MSYS; no Linux já gdbvem com o Python já incorporado?), Hook backtrace, use

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

Em seguida, processe stack_tracecom as expressões regulares do Python e imprima-as. Negrito e outras cores são alcançadas por uma função como esta:

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)
Evgeni Sergeev
fonte
Um exemplo de trabalho que usa o gancho - mesmo que mínimo - provavelmente seria mais bem-vindo.
Oi-Angel
4

Outra boa combinação de cores é dada por essa configuração . Torna a inspeção dos backtraces muito mais fácil. Para usá-lo, salve esse arquivo como ~/.gdbinite execute o gdb normalmente

Andrea Araldo
fonte
Obrigado, era exatamente isso que eu estava procurando. Eu estava olhando para um aplicativo multiencadeado com uma pilha de chamadas longa e isso é perfeito para esses backtraces.
Johan Bjäreholt
-2

você pode obter as cores que desejar;

# 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
RandomNickName42
fonte