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.

Foi útil?

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'}}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top