Pergunta

Supondo que ter algo parecido com isto:

#include <map>
int main(){
    std::map<int,int> m;
    m[1] = 2;
    m[2] = 4;
    return 0;
}

Eu gostaria de ser capaz de inspecionar o conteúdo do mapa de executar o programa a partir do gdb.
Se eu tentar usar o operador subscrito eu recebo:

(gdb) p m[1]
Attempt to take address of value not located in memory.

Usando o método find não produzem melhores resultados:

(gdb) p m.find(1)
Cannot evaluate function -- may be inlined

Existe uma maneira de conseguir isso?

Foi útil?

Solução

Eu acho que não há, pelo menos, não se sua fonte é otimizado etc. No entanto, existem alguns macros para o GDB que pode inspecionar contêineres STL para você:

http://sourceware.org/ml/gdb/2008-02/ msg00064.html

No entanto, eu não uso isso, então YMMV

Outras dicas

As respostas existentes a esta pergunta são muito desatualizado. Com um GCC recente e GDB ele simplesmente funciona TM graças ao suporte embutido Python em GDB 7.x eo libstdc ++ impressoras bonitas que vêm com GCC.

Por exemplo, o OP eu recebo:

(gdb) print m
$1 = std::map with 2 elements = {[1] = 2, [2] = 4}

Se ele não funciona automaticamente para você ver o primeiro ponto na STL Suporte página do wiki GDB.

Você pode escrever Python impressoras bonito para seus próprios tipos também, veja Pretty Impressão no manual do GDB.

Há sempre o óbvio: Defina o seu próprio-função de teste ... Chamá-lo a partir do gdb. Por exemplo:.

#define SHOW(X) cout << # X " = " << (X) << endl

void testPrint( map<int,int> & m, int i )
{
  SHOW( m[i] );
  SHOW( m.find(i)->first );
}

int
main()
{
    std::map<int,int> m;
    m[1] = 2;
    m[2] = 4;
    return 0;  // Line 15.
}

E:

....
Breakpoint 1 at 0x400e08: file foo.C, line 15.
(gdb) run
Starting program: /tmp/z/qD 

Breakpoint 1, main () at qD.C:15
(gdb) call testPrint( m, 2)
m[i] = 4
(*m.find(i)).first = 2
(gdb) 

O stl-views.gdb costumava ser a melhor resposta que havia, mas não mais.

Isto não é integrado ao GDB linha principal ainda, mas aqui é o que se obtém usando o 'arqueiro-tromey-python' ramo :

(gdb) list
1   #include <map>
2   int main(){
3       std::map<int,int> m;
4       m[1] = 2;
5       m[2] = 4;
6       return 0;
7   }
(gdb) break 6
Breakpoint 1 at 0x8048274: file map.cc, line 6.
(gdb) run

Breakpoint 1, main () at map.cc:6
6       return 0;
(gdb) print m
$1 = std::map with 2 elements = {
  [1] = 2,
  [2] = 4
}
(gdb) quit

Tente De-referenciamento STL Contentores: nessa página: http: //www.yolinux .com / tutoriais / GDB-Commands.html

Você pode obter em torno do segundo problema (Cannot evaluate function -- may be inlined), certificando-se de que o seu compilador usa-2 ANÃO (ou 3 ou 4) informações de depuração quando você compilar seu programa. ANÃO-2 inclui inlining informações, então você deve ser capaz de usar qualquer um dos métodos que você descreveu a elementos de acesso do seu recipiente std::map.

Para compilar com 2-ANÃO informações de depuração, adicione a bandeira -gdwarf-2 ao seu comando de compilação.

As respostas acima estão trabalhando e multa. No caso de você estiver usando STL-views.gdb, aqui é a maneira correta de visualizar os mapas e elementos dentro dele. Deixe o seu mapa é a seguinte: std::map<char, int> myMap;

(gdb) pmap myMap char int

i. pmap <variable_name> <left_element_type> <right_element_type> para ver os elementos no mapa.

Espero que ajude.

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