2017-01-02 12 views
5

Tôi đã có chương trình thử nghiệm như dưới đây:Làm thế nào để xem dữ liệu nội bộ của một con trỏ thông minh bên trong gdb?

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

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

gỡ lỗi nó:

(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 

Nó chỉ in ra những thông tin kiểu con trỏ của si, nhưng làm thế nào để có được những giá trị lưu giữ trong nó (trong trường hợp này 5)? Làm cách nào để kiểm tra nội dung bên trong của si trong khi gỡ lỗi?

+0

Bạn có ý nghĩa gì với * "cửa hàng giá trị trong si" *? Giá trị của 'int'' si' trỏ tới? –

+0

Bản sao có thể có của [Cách truy cập mục tiêu của tiêu chuẩn :: tr1 :: shared \ _ptr in 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 –

Trả lời

1

Hãy thử như sau:

p *si._M_ptr 

Bây giờ, điều này giả định rằng bạn đang sử dụng libstdc++.so, do đầu ra cho p si.

Ngoài ra, bạn có thể sử dụng giá trị 0x614c20 trực tiếp (từ đầu ra của bạn):

p {int}0x614c20 

Cả hai sẽ hiển thị giá trị 5.

0

nhưng làm thế nào để có được giá trị lưu giữ trong nó

Bạn sẽ phải đúc con trỏ liệu đến kiểu con trỏ thực tế lưu trữ trong std::shared_ptr. Sử dụng whatis để biết loại con trỏ thực tế là gì.

(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 
Các vấn đề liên quan