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]

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top