Como faço para imprimir o valor integral de uma longa seqüência no gdb?
Pergunta
Quero imprimir todo o comprimento de uma string C em GDB. Por padrão ele está sendo abreviado, como faço para forçar GDB para imprimir a seqüência inteira?
Solução
set print elements 0
set print elements
number-of-elements
Defina um limite de quantos elementos de uma GDB matriz irá imprimir. Se o GDB é a impressão de uma grande variedade, ele pára de impressão depois de ter impresso o número de elementos definidos pelo comando set print elements
. Este limite também se aplica à exibição de strings. Quando GDB começa, este limite é definido para 200. Configuração número-of-elementos para zero significa que a impressão é ilimitado .
Outras dicas
Enquanto o programa está em um estado sadio, você pode também call (void)puts(your_string)
imprimi-lo na saída padrão. Mesmo princípio se aplica a todas as funções disponíveis para o depurador, na verdade.
Há uma terceira opção: o comando x, que permite que você defina um limite diferente para o comando específico em vez de mudar uma configuração global. Para imprimir os primeiros 300 caracteres de uma string você pode usar x/300s your_string
. A saída pode ser um pouco mais difícil de ler. Por exemplo de imprimir os resultados da consulta SQL em:
(gdb) x/300sb stmt.c_str() 0x9cd948: "SELECT article.r"... 0x9cd958: "owid FROM articl"... ..
O comando printf
irá imprimir as cordas completas:
(gdb) printf "%s\n", string
Apenas para completá-lo:
(gdb) p (char[10]) *($ebx)
$87 = "asdfasdfe\n"
Você deve dar um comprimento, mas pode alterar a representação de que string:
(gdb) p/x (char[10]) *($ebx)
$90 = {0x61,
0x73,
0x64,
0x66,
0x61,
0x73,
0x64,
0x66,
0x65,
0xa}
Isto pode ser útil se você deseja depurar pelos seus valores
Usando set elements ...
nem sempre é o melhor caminho. Seria útil se houvesse uma set string-elements ...
distinto.
Então, eu uso essas funções em minha .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
Advertências:
- O primeiro é c ++ lib dependente como ele acessa membros da std :: string, mas é facilmente ajustada.
- O segundo só pode ser usado em um programa em execução, uma vez que as chamadas strlen.