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?
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:
set print elements 0
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 elements
comando. 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 .
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.
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" ... ..
x
!
O printf
comando imprimirá as seqüências completas:
(gdb) printf "%s\n", string
set print elements nnn
limite e não imprimirá a sequência completa, a menos que você o faça set print elements 0
.
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
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: