Como imprimo o valor total de uma string longa em gdb?


376

Quero imprimir o comprimento total de uma string C no GDB. Por padrão, está sendo abreviado, como forço o GDB a imprimir a string inteira?

Respostas:


504
set print elements 0

No manual do GDB :

set print elements number-of-elements
Defina um limite para quantos elementos de uma matriz o GDB imprimirá. Se o GDB estiver imprimindo uma matriz grande, ele interromperá a impressão após a impressão do número de elementos definidos pelo set print elementscomando. Esse limite também se aplica à exibição de strings. Quando o GDB é iniciado, esse limite é definido como 200. Definir o número de elementos como zero significa que a impressão é ilimitada .

4
Atualmente, você também pode precisar de "definir repetições de impressão 0", caso contrário, o GDB omitirá elementos repetidos da string / matriz.
John Lindgren

isso também se aplica a tipos de matriz #
Trevor Boyd Smith

11
Você também pode precisar "definir o tamanho máximo do valor ilimitado".
30718

100

Enquanto o seu programa estiver em bom estado, você também pode call (void)puts(your_string)imprimi-lo no stdout. O mesmo princípio se aplica a todas as funções disponíveis para o depurador, na verdade.


2
Essa resposta é ainda melhor do que "definir elementos de impressão 0" (para meus propósitos) porque respeita os caracteres de nova linha / retorno de carro em vez de escapar deles.
mhenry1384

6
Boa solução, mas não funciona quando se tenta analisar núcleo arquivo de despejo
Elalfer

Brilliant duskwuff sugestão, eu desejo que eu tinha lido que antes de eu copiado e colado em uma chamada printf para obter a saída unescaped ..: D
nevelis

4
Nota: esta opção funciona apenas se você estiver depurando um programa ativo. Você não pode usar o comando "call" do GDB quando estiver depurando um arquivo principal.
Solomon Slow

11
também exige que o gdb seja sadio, o que parece cada vez mais NÃO ser o caso (recebo "Nenhum símbolo" coloca "no contexto atual" na minha máquina Mac OS X)
Michael

39

Existe uma terceira opção: o comando x, que permite definir um limite diferente para o comando específico em vez de alterar uma configuração global. Para imprimir os primeiros 300 caracteres de uma sequência, você pode usar x/300s your_string. A saída pode ser um pouco mais difícil de ler. Por exemplo, imprimir uma consulta SQL resulta em:

(gdb) x / 300sb stmt.c_str ()
0x9cd948: "SELECT article.r" ...
0x9cd958: "owid FROM articl" ...
..

3
Eu queria saber o que "x / 300sb" significava. Com a ajuda desta folha de dicas (pdf) , traduzi "x / 300sb cstr" como "eXamine 300 unidades (bytes) de memória no endereço cstr, interpretado como uma string terminada em NULL (S)". Se sua string tiver comprimento 100, você verá muito lixo, porque todos os 300 bytes são impressos, independentemente de fazerem sentido ou não. +1, no entanto, por me apresentar x!
Rob W

39

O printfcomando imprimirá as seqüências completas:

(gdb) printf "%s\n", string

2
desculpe, mas isso não é verdade
UmNyobe

11
Isso parece respeitar o set print elements nnnlimite e não imprimirá a sequência completa, a menos que você o faça set print elements 0.
Mark Lakata

3
Quando tento isso, apenas obtenho: "O valor não pode ser convertido em número inteiro".
Philipp Ludwig

2
para std :: string, você precisa de string.c_str () para evitar o erro "O valor não pode ser convertido em número inteiro"
Paul Childs

21

Apenas para completá-lo:

(gdb) p (char[10]) *($ebx)
$87 =   "asdfasdfe\n"

Você deve fornecer um comprimento, mas pode alterar a representação dessa sequência:

(gdb) p/x (char[10]) *($ebx)
$90 =   {0x61,
  0x73,
  0x64,
  0x66,
  0x61,
  0x73,
  0x64,
  0x66,
  0x65,
  0xa}

Isso pode ser útil se você deseja depurar por seus valores


1

Usar set elements ...nem sempre é o melhor caminho. Seria útil se houvesse uma distintaset string-elements ... .

Então, eu uso essas funções no meu .gdbinit:

define pstr
  ptype $arg0._M_dataplus._M_p
  printf "[%d] = %s\n", $arg0._M_string_length, $arg0._M_dataplus._M_p
end

define pcstr
  ptype $arg0
  printf "[%d] = %s\n", strlen($arg0), $arg0
end

Ressalvas:

  • O primeiro é dependente de c ++ lib, pois acessa membros de std :: string, mas é facilmente ajustado.
  • O segundo só pode ser usado em um programa em execução, pois chama strlen.
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.