Como faço para imprimir os elementos de um vetor C ++ no GDB?
Pergunta
Eu quero examinar o conteúdo de um std::vector
No GDB, como faço isso? Digamos que é um std::vector<int>
Por uma questão de simplicidade.
Solução
Para visualizar o conteúdo do Vector 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 alcançar acima, você precisa ter o GDB 7 (eu o testei no GDB 7.01) e um pouco de python. O processo de instalação deles é descrito em GDB Wiki.
Além disso, depois de instalar acima, isso funciona bem com Eclipse GUI do depurador C ++ (e qualquer outro IDE usando GDB, como eu penso).
Outras dicas
Com o GCC 4.1.2, para imprimir todo o STD :: Vectoru003Cint> 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 fortemente da versão do seu 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, em uma forma curta (para um .gdbinit padrão):
p P@N
'Assistir' STL contêineres enquanto a depuração é um problema. Aqui estão três soluções diferentes que usei no passado, nenhuma delas é perfeita.
1) Use scripts do GDB de 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 apoio fantástico para assistir aos contêineres STL. Isso funciona para contêineres aninhados, mas isso é para sua implementação apenas para STL e não funciona se você estiver colocando um contêiner STL em um contêiner de impulso.
3) Escreva sua própria função (ou método) para o item específico que deseja imprimir enquanto depura e use 'chamada' 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 G ++ fará a eliminação do código morto e a função 'impressão' não será encontrada pelo GDB (você receberá uma mensagem dizendo que a função está inlinada). Então compilar com -fkeep-inline funcções
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
Depois de reiniciar o GDB (ou fornecer ~/.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'}}