HOWTO debug smart pointer
Jump to navigation
Jump to search
Suppose I have an ns-3 smart pointer such as:
Ptr<Packet> p = ...
To access the underlying raw pointer via gdb (e.g. to inspect the contents), you want to access the p->m_ptr member:
(gdb) p *p
$22 = (
ns3::Packet &) @0x80b0ea0: {<ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >>
= {<ns3::empty> = {<No data fields>},
m_count = 1}, m_buffer = {m_data = 0x80b0f28, m_maxZeroAreaStart = 7,
static g_recommendedStart = 7, m_zeroAreaStart = 7, m_zeroAreaEnd = 27,
m_start = 0, m_end = 29}, m_byteTagList = {m_used = 0, m_data = 0x0},
m_packetTagList = {static g_free = <optimized out>,
static g_nfree = <optimized out>, m_next = 0x0}, m_metadata = {
static m_freeList = {<std::vector<ns3::PacketMetadata::Data*, std::allocator<ns3::PacketMetadata::Data*> >> =
{<std::_Vector_base<ns3::PacketMetadata::Data*, std::allocator<ns3::PacketMetadata::Data*> >> = {
_M_impl = {<std::allocator<ns3::PacketMetadata::Data*>> =
{<__gnu_cxx::new_allocator<ns3::PacketMetadata::Data*>> = {<No data fields>}, <No data fields>}, _M_start = 0x0,
_M_finish = 0x0,
_M_end_of_storage = 0x0}}, <No data fields>}, <No data fields>},
static m_enable = true, static m_enableChecking = false,
static m_metadataSkipped = false, static m_maxSize = 26,
static m_chunkUid = 4, m_data = 0x80b0f48, m_head = 8, m_tail = 17,
m_used = 26, m_packetUid = 0}, m_nixVector = {m_ptr = 0x0},
static m_globalUid = 2}
This will not work:
(gdb) p p->m_buffer There is no member or method named m_buffer.
Instead, do this:
(gdb) p (p->m_ptr)->m_buffer
$24 = {m_data = 0x80b0f28, m_maxZeroAreaStart = 7,
static g_recommendedStart = 7, m_zeroAreaStart = 7, m_zeroAreaEnd = 27,
m_start = 0, m_end = 29}
Going further, suppose you want to look at the raw bytes of the packet buffer. This is stored in the m_data field of the buffer, (0x80b0f28 above). To inspect the memory contents of that address, use the "x" command of gdb; e.g. this will print out three bytes starting at the referenced address:
(gdb) x/3 0x80b0f28 0x80b0f28: 0x00000001 0x00000009 0x00000000
Keep in mind that data contents in a packet buffer are in network byte order and may be endian swapped with respect to your (x86) host operating system.