help-gplusplus
[Top][All Lists]
Advanced

[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






reply via email to

[Prev in Thread] Current Thread [Next in Thread]