[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: How to inspect and debug STL containers?
From: |
karsten |
Subject: |
Re: How to inspect and debug STL containers? |
Date: |
25 Apr 2007 02:19:15 -0700 |
User-agent: |
G2/1.0 |
Hello,
here's the missing gdb macro code for the std::deque
# -----------------------------------------------------------------
# std::deque
#
# A deque<T> allocates memory in pages of min(512, sizeof(T)) bytes.
# **deque._M_impl_M_map has the "value_type" of the deque
# calculate deque size and store in $size;
# calculate size of data element $datasize and number of nodes per
memory page $bufsize
define deque_size
set $vec = ($arg0)
# size of one data element
set $datasize = sizeof(**$vec._M_impl._M_map)
# bufsize is the number of nodes per memory page
set $bufsize = $datasize < 512 ? 512/$datasize : 1
set $x = $vec->_M_impl->_M_finish
set $y = $vec->_M_impl->_M_start
set $size = $bufsize * ($x._M_node - $y._M_node - 1) + ($x._M_cur -
$x._M_first) + ($y._M_last - $y._M_cur)
end
define p_deque_size
deque_size ($arg0)
printf "Deque size: %d\n", $size
end
document p_deque_size
p_deque_size <variable> -- Print size of deque
end
define p_deque
set $vec = ($arg0)
whatis $vec
p_deque_size $vec
set $iter = $vec._M_impl._M_start
set $enditer = $vec._M_impl._M_finish
set $i=0
set $mnode = $iter._M_node
set $mfirst = $iter._M_first
set $mlast = $iter._M_last
set $mcur = $iter._M_cur
while ($mcur != $enditer._M_cur)
printf "Deque element %d: ", $i
p *$mcur
# now imitate iter.operator++
set $mcur++
if ($mcur == $mlast)
set $mnode++
set $mfirst = *$mnode
set $mlast = $mfirst + $bufsize
set $mcur = $mfirst
end
set $i++
end
end
document p_deque
p_deque <variable> -- Prints whole deque
end
define p_deque_node
set $vec = ($arg0)
deque_size $vec
set $iter = $vec._M_impl._M_start
set $enditer = $vec._M_impl._M_finish
set $i=0
set $mnode = $iter._M_node
set $mfirst = $iter._M_first
set $mlast = $iter._M_last
set $mcur = $iter._M_cur
# print deque[ n ]
set $n = $arg1
if ($n >= 0 && $n < $size)
if ($n < $bufsize)
set $mcur += $n
else
set $node_offset = $n / $bufsize
set $mnode += $node_offset
set $mfirst = *$mnode
set $mlast = $mfirst + $bufsize
set $mcur = $mfirst + ($n - $node_offset*$bufsize)
end
p *$mcur
else
printf "index out of range 0...%d \n", $size-1
end
end
document p_deque_node
p_deque_node <variable> <value> -- Prints the node with index #value
end
define p_deque_front
set $vec = ($arg0)
#p_deque_node $vec 0
p *$vec._M_impl._M_start._M_cur
end
document p_deque_front
p_deque_front <variable> -- Prints the front node
end
define p_deque_back
set $vec = ($arg0)
deque_size $vec
# we imitate: deque.end()--
set $iter = $vec._M_impl._M_finish
set $mnode = $iter._M_node
set $mfirst = $iter._M_first
set $mlast = $iter._M_last
set $mcur = $iter._M_cur
if ($mcur == $mfirst)
set $mnode--
set $mfirst = *$mnode
set $mlast = $mfirst + $bufsize
set $mcur = $mlast
end
set $mcur--
p *$mcur
end
document p_deque_back
p_deque_back <variable> -- Prints the back node
end