Quero examinar o conteúdo de um std::vector
no GDB, como faço? Digamos que é uma std::vector<int>
questão de simplicidade.
Quero examinar o conteúdo de um std::vector
no GDB, como faço? Digamos que é uma std::vector<int>
questão de simplicidade.
Respostas:
Para visualizar o conteúdo do vetor std :: vector myVector, basta digitar GDB:
(gdb) print myVector
Isso produzirá uma saída semelhante a:
$1 = std::vector of length 3, capacity 4 = {10, 20, 30}
Para conseguir acima, você precisa do gdb 7 (eu testei no gdb 7.01) e alguma impressora bonita em python. O processo de instalação destes está descrito no wiki do gdb .
Além disso, após a instalação acima, isso funciona bem com a GUI do depurador Eclipse C ++ (e qualquer outro IDE usando GDB, como eu acho).
$HOME/.gdbinit
era necessário. No momento, acabo sem esse arquivo e gdb
mostrando corretamente o conteúdo de std::vector
. No entanto, como durante as minhas tentativas de "divagar", acabei de instalar e, em seguida cgdb
, desinstalei , e já o libstdc++5
instalei, não tenho idéia do motivo pelo qual a bonita impressão não funcionou enquanto agora funciona.
Com o GCC 4.1.2, para imprimir o conjunto de um std :: vector <int> chamado myVector, faça o seguinte:
print *(myVector._M_impl._M_start)@myVector.size()
Para imprimir apenas os primeiros N elementos, faça:
print *(myVector._M_impl._M_start)@N
Explicação
Provavelmente, isso depende muito da sua versão do compilador, mas para o GCC 4.1.2, o ponteiro para a matriz interna é:
myVector._M_impl._M_start
E o comando GDB para imprimir N elementos de uma matriz começando no ponteiro P é:
print P@N
Ou, de forma abreviada (para um arquivo .gdbinit padrão):
p P@N
Cannot evaluate function -- may be inlined
_M_impl
etc) para o seu compilador no GDB 7.0+, useprint /r myVector
'Observar' os contêineres STL durante a depuração é um problema. Aqui estão três soluções diferentes que eu usei no passado, nenhuma delas é perfeita.
1) Use scripts GDB em http://clith.com/gdb_stl_utils/ Esses scripts permitem imprimir o conteúdo de quase todos os contêineres STL. O problema é que isso não funciona para contêineres aninhados como uma pilha de conjuntos.
2) O Visual Studio 2005 tem um suporte fantástico para assistir contêineres STL. Isso funciona para contêineres aninhados, mas é para sua implementação apenas para STL e não funciona se você estiver colocando um contêiner STL em um contêiner Boost.
3) Escreva sua própria função 'print' (ou método) para o item específico que você deseja imprimir durante a depuração e use 'call' enquanto estiver no GDB para imprimir o item. Observe que, se sua função de impressão não estiver sendo chamada em nenhum lugar do código, o g ++ eliminará o código morto e a função 'print' não será encontrada pelo GDB (você receberá uma mensagem informando que a função está embutida). Então compile com -fkeep-inline-functions
coloque o seguinte em ~ / .gdbinit
define print_vector
if $argc == 2
set $elem = $arg0.size()
if $arg1 >= $arg0.size()
printf "Error, %s.size() = %d, printing last element:\n", "$arg0", $arg0.size()
set $elem = $arg1 -1
end
print *($arg0._M_impl._M_start + $elem)@1
else
print *($arg0._M_impl._M_start)@$arg0.size()
end
end
document print_vector
Display vector contents
Usage: print_vector VECTOR_NAME INDEX
VECTOR_NAME is the name of the vector
INDEX is an optional argument specifying the element to display
end
Após reiniciar o gdb (ou sourcing ~ / .gdbinit), mostre a ajuda associada como esta
gdb) help print_vector
Display vector contents
Usage: print_vector VECTOR_NAME INDEX
VECTOR_NAME is the name of the vector
INDEX is an optional argument specifying the element to display
Exemplo de uso:
(gdb) print_vector videoconfig_.entries 0
$32 = {{subChannelId = 177 '\261', sourceId = 0 '\000', hasH264PayloadInfo = false, bitrate = 0, payloadType = 68 'D', maxFs = 0, maxMbps = 0, maxFps = 134, encoder = 0 '\000', temporalLayers = 0 '\000'}}