Confuso com gdb print ptr vs print “%s”
-
09-06-2019 - |
Pergunta
1167 ptr = (void*)getcwd(cwd, MAX_PATH_LENGTH-1);
(gdb) n
1168 if (!ptr) {
(gdb) print ptr
$1 = 0xbff2d96c "/media/MMC-SD/partition1/aaaaaaaaaaa"
(gdb) print &cwd
$2 = (char (*)[3500]) 0xbff2d96c
(gdb) print strlen(cwd)
$3 = 36
(gdb) print "%s",cwd
$4 = "/media/MMC-SD/partition1/aaaaaaaaaaa", '\0' <repeats 912 times>, "��O�001\000\000\000\000��027\000\000\000�3����EL鷠3�000��027\000\000\000\000\000\000\000\027\000\000\000\000��/�027\000\000\000�3����N����\230���鷠3�000��027\000\000\000\000\000\000\000��000\000\000\000\001\000\000\000��M鷠3����\000\000\000\000.\231�027��w\005\b\001\000"...
(gdb) print "%s", ptr
$5 = 0xbff2d96c "/media/MMC-SD/partition1/aaaaaaaaaaa"
(gdb) Quit
Por que o ptr está imprimindo a string corretamente, mas o cwd não;isso também afeta o programa e ele trava se eu tentar usar o cwd...
[editar:Acontece que a falha foi causada por um estouro de buffer estúpido nesta var...grr...não gdb, mas a pergunta de impressão ainda era válida]
Solução
A razão pela qual cwd
é impresso de forma diferente em gdb
é porque gdb
Sabe disso ptr
é um char *
(eu acho) e isso cwd
é uma matriz de comprimento 3500
(conforme mostrado na sua saída).Então, ao imprimir ptr
imprime o valor do ponteiro (e como serviço também a string para a qual aponta) e ao imprimir cwd
ele imprime o todo variedade.
Não vejo nenhuma razão para usar cwd
em vez de ptr
levaria a problemas, mas eu precisaria ver algum código para ter certeza.
Outras dicas
Eu concordo com Mweerden.Tentando algo que acredito ser semelhante ao seu código, recebo:
(gdb) print cwd
$1 = "/media", '\0' <repeats 782 times>, "\016���" ...
(gdb) print (char*) cwd
$2 = 0xbfc8eb84 "/media"
do gdb, então parece que desde cwd
foi definido como char cwd[3500]
, o gdb imprime o array inteiro, mas se você disser ao gdb para interpretá-lo como um char*
, funcionará conforme o esperado.Se o seu aplicativo travar, presumo que seja por outro motivo.
Que ptr
é exibido como uma string bem formatada e cwd
já que "buffer de bytes" é provavelmente específico do gdb.De qualquer forma, isso não deve afetar sua aplicação;de acordo com man 3 getcwd
, ptr
deveria apontar para cwd
(ou deveria ser NULL se ocorreu um erro).Você pode usar ptr
sem travar o programa?
Que tipo é cwd?O trecho de código acima não nos diz isso.Pode ser que ptr sendo um void* seja tratado de forma diferente pelo gdb.