2017-01-02 73 views
5

Mam program testowy jak poniżej:Jak wyświetlić wewnętrzne dane inteligentnego wskaźnika wewnątrz gdb?

#include<memory> 
#include<iostream> 
using namespace std; 

int main() 
{ 
    shared_ptr<int> si(new int(5)); 
    return 0; 
} 

Debug go:

(gdb) l 
1 #include<memory> 
2 #include<iostream> 
3 using namespace std; 
4 
5 int main() 
6 { 
7  shared_ptr<int> si(new int(5)); 
8  return 0; 
9 } 
10 
(gdb) b 8 
Breakpoint 1 at 0x400bba: file testshare.cpp, line 8. 
(gdb) r 
Starting program: /home/x/cpp/x01/a.out 

Breakpoint 1, main() at testshare.cpp:8 
8  return 0; 
(gdb) p si 
$1 = std::shared_ptr (count 1, weak 0) 0x614c20 

Drukuje tylko informacje typu wskaźnik na si, ale jak uzyskać wartość przechowywaną w nim (w w tym przypadku 5)? Jak mogę sprawdzić wewnętrzną zawartość si podczas debugowania?

+0

Co masz na myśli, jeśli chodzi o * "magazyn wartości w si" *? Wartość 'int'' si' wskazuje na? –

+0

Możliwy duplikat [Jak uzyskać dostęp do celu std :: tr1 :: shared \ _ptr w GDB] (https://stackoverflow.com/questions/24917556/how-to-access-target-of-stdtr1shared-ptr-in -gdb) | 'unique_ptr': https://stackoverflow.com/questions/22798601/how-to-debug-c11-code-with-unique-ptr-in-ddd-or-gdb –

Odpowiedz

1

Spróbuj wykonać następujące czynności:

p *si._M_ptr 

Teraz, to zakłada się, że używasz libstdc++.so, biorąc pod uwagę wyjście p si.

Alternatywnie, można użyć wartości 0x614c20 bezpośrednio (od wyjściowego):

p {int}0x614c20 

Zarówno powinien wyświetlić wartość 5.

0

ale jak uzyskać wartość przechowywana w nim

Będziesz musiał rzucać surowy wskaźnik do rzeczywistego typu wskaźnika przechowywanego w std::shared_ptr. Użyj whatis, aby dowiedzieć się, jaki jest rzeczywisty typ wskaźnika.

(gdb) p si 
$8 = std::shared_ptr (count 1, weak 0) 0x614c20 
(gdb) whatis si 
type = std::shared_ptr<int> 
(gdb) p *(int*)0x614c20 
$9 = 5