Debug STL with GDB

26 January 2011

I’ve found very useful script for viewing STL containers under GDB here is link. Also i duplicated them here :


    ##########################################
    # #
    # STL GDB evaluators/views/utilities #
    # #
    ##########################################
    #
    # The new GDB commands:
    # are entirely non instrumental
    # do not depend on any "inline"(s) - e.g. size(), [], etc
    # are extremely tolerant to debugger settings
    #
    # This file should be "included" in .gdbinit as following:
    # source stl-views.gdb or just paste it into your .gdbinit file
    #
    # The following STL containers are currently supported:
    #
    # std::vector -- via pvector command
    # std::list -- via plist command
    # std::map -- via pmap command
    # std::multimap -- via pmap command
    # std::set -- via pset command
    # std::multiset -- via pset command
    # std::deque -- via pdequeue command
    # std::stack -- via pstack command
    # std::queue -- via pqueue command
    # std::priority_queue -- via ppqueue command
    # std::bitset -- via pbitset command
    # std::string -- via pstring command
    # std::widestring -- via pwstring command
    #
    # The end of this file contains (optional) C++ beautifiers
    #
    ##########################################################################
    # #
    # CopyRight @ 2008 - Dan C Marinescu - All Rights Reserved under GPL V3. #
    # #
    # Email: dan_c_marinescu.RemoveThis@yahoo.com #
    # #
    ##########################################################################

    #
    # std::vector<>
    #

    define pvector
    if $argc == 0
    help pvector
    else
    set $size = $arg0._M_impl._M_finish - $arg0._M_impl._M_start
    set $capacity = $arg0._M_impl._M_end_of_storage - $arg0._M_impl._M_start
    set $size_max = $size - 1
    end
    if $argc == 1
    set $i = 0
    while $i < $size printf "elem[%u]: ", $i p *($arg0._M_impl._M_start + $i) set $i++ end end if $argc == 2 set $idx = $arg1 if $idx < 0 || $idx > $size_max
    printf "idx1, idx2 are not in acceptable range: [0..%u].n", $size_max
    else
    printf "elem[%u]: ", $idx
    p *($arg0._M_impl._M_start + $idx)
    end
    end
    if $argc == 3
    set $start_idx = $arg1
    set $stop_idx = $arg2
    if $start_idx > $stop_idx
    set $tmp_idx = $start_idx
    set $start_idx = $stop_idx
    set $stop_idx = $tmp_idx
    end
    if $start_idx < 0 || $stop_idx < 0 || $start_idx > $size_max || $stop_idx > $size_max
    printf "idx1, idx2 are not in acceptable range: [0..%u].n", $size_max
    else
    set $i = $start_idx
    while $i <= $stop_idx printf "elem[%u]: ", $i p *($arg0._M_impl._M_start + $i) set $i++ end end end if $argc > 0
    printf "Vector size = %un", $size
    printf "Vector capacity = %un", $capacity
    printf "Element "
    whatis $arg0._M_impl._M_start
    end
    end

    document pvector
    Prints std::vector information.
    Syntax: pvector
    Note: idx, idx1 and idx2 must be in acceptable range [0...size()-1].
    Examples:
    pvector v - Prints vector content, size, capacity and T typedef
    pvector v 0 - Prints element[idx] from vector
    pvector v 1 2 - Prints elements in range [idx1..idx2] from vector
    end

    #
    # std::list<>
    #

    define plist
    if $argc == 0
    help plist
    else
    set $head = &$arg0._M_impl._M_node
    set $current = $arg0->_M_impl->_M_node->_M_next
    set $size = 0
    while $current != $head
    if $argc == 2
    printf "elem[%u]: ", $size
    p *($arg1*)($current + 1)
    end
    if $argc == 3
    if $size == $arg2
    printf "elem[%u]: ", $size
    p *($arg1*)($current + 1)
    end
    end
    set $current = $current->_M_next
    set $size++
    end
    printf "List size = %u n", $size
    if $argc == 1
    printf "List "
    whatis $arg0
    printf "Use plist to see the elements in the list.n"
    end
    end
    end

    document plist
    Prints std::list information.
    Syntax: plist : Prints list size, if T defined all elements or just element at idx
    Examples:
    plist l - prints list size and definition
    plist l int - prints all elements and list size
    plist l int 2 - prints the third element in the list (if exists) and list size
    end

    #
    # std::map and std::multimap
    #

    define pmap
    if $argc == 0
    help pmap
    else
    set $tree = $arg0
    set $i = 0
    set $node = $tree->_M_t->_M_impl->_M_header->_M_left
    set $end = $tree->_M_t->_M_impl->_M_header
    set $tree_size = $tree->_M_t->_M_impl->_M_node_count
    if $argc == 1
    printf "Map "
    whatis $tree
    printf "Use pmap to see the elements in the map.n"
    end
    if $argc == 3
    while $i < $tree_size set $value = (void *)($node + 1) printf "elem[%u]->left: ", $i
    p *($arg1*)$value
    set $value = $value + 4
    printf "elem[%u]->right: ", $i
    p *($arg2*)$value
    if $node->_M_right != 0
    set $node = $node->_M_right
    while $node->_M_left != 0
    set $node = $node->_M_left
    end
    else
    set $tmp_node = $node->_M_parent
    while $node == $tmp_node->_M_right
    set $node = $tmp_node
    set $tmp_node = $tmp_node->_M_parent
    end
    if $node->_M_right != $tmp_node
    set $node = $tmp_node
    end
    end
    set $i++
    end
    end
    if $argc == 4
    set $idx = $arg3
    set $ElementsFound = 0
    while $i < $tree_size set $value = (void *)($node + 1) if *($arg1*)$value == $idx printf "elem[%u]->left: ", $i
    p *($arg1*)$value
    set $value = $value + 4
    printf "elem[%u]->right: ", $i
    p *($arg2*)$value
    set $ElementsFound++
    end
    if $node->_M_right != 0
    set $node = $node->_M_right
    while $node->_M_left != 0
    set $node = $node->_M_left
    end
    else
    set $tmp_node = $node->_M_parent
    while $node == $tmp_node->_M_right
    set $node = $tmp_node
    set $tmp_node = $tmp_node->_M_parent
    end
    if $node->_M_right != $tmp_node
    set $node = $tmp_node
    end
    end
    set $i++
    end
    printf "Number of elements found = %un", $ElementsFound
    end
    if $argc == 5
    set $idx1 = $arg3
    set $idx2 = $arg4
    set $ElementsFound = 0
    while $i < $tree_size set $value = (void *)($node + 1) set $valueLeft = *($arg1*)$value set $valueRight = *($arg2*)($value + 4) if $valueLeft == $idx1 && $valueRight == $idx2 printf "elem[%u]->left: ", $i
    p $valueLeft
    printf "elem[%u]->right: ", $i
    p $valueRight
    set $ElementsFound++
    end
    if $node->_M_right != 0
    set $node = $node->_M_right
    while $node->_M_left != 0
    set $node = $node->_M_left
    end
    else
    set $tmp_node = $node->_M_parent
    while $node == $tmp_node->_M_right
    set $node = $tmp_node
    set $tmp_node = $tmp_node->_M_parent
    end
    if $node->_M_right != $tmp_node
    set $node = $tmp_node
    end
    end
    set $i++
    end
    printf "Number of elements found = %un", $ElementsFound
    end
    printf "Map size = %un", $tree_size
    end
    end

    document pmap
    Prints std::map or std::multimap information. Works for std::multimap as well.
    Syntax: pmap : Prints map size, if T defined all elements or just element(s) with val(s)
    Examples:
    pmap m - prints map size and definition
    pmap m int int - prints all elements and map size
    pmap m int int 20 - prints the element(s) with left-value = 20 (if any) and map size
    pmap m int int 20 200 - prints the element(s) with left-value = 20 and right-value = 200 (if any) and map size
    end

    #
    # std::set and std::multiset
    #

    define pset
    if $argc == 0
    help pset
    else
    set $tree = $arg0
    set $i = 0
    set $node = $tree->_M_t->_M_impl->_M_header->_M_left
    set $end = $tree->_M_t->_M_impl->_M_header
    set $tree_size = $tree->_M_t->_M_impl->_M_node_count
    if $argc == 1
    printf "Set "
    whatis $tree
    printf "Use pset to see the elements in the set.n"
    end
    if $argc == 2
    while $i < $tree_size set $value = (void *)($node + 1) printf "elem[%u]: ", $i p *($arg1*)$value if $node->_M_right != 0
    set $node = $node->_M_right
    while $node->_M_left != 0
    set $node = $node->_M_left
    end
    else
    set $tmp_node = $node->_M_parent
    while $node == $tmp_node->_M_right
    set $node = $tmp_node
    set $tmp_node = $tmp_node->_M_parent
    end
    if $node->_M_right != $tmp_node
    set $node = $tmp_node
    end
    end
    set $i++
    end
    end
    if $argc == 3
    set $idx = $arg2
    set $ElementsFound = 0
    while $i < $tree_size set $value = (void *)($node + 1) if *($arg1*)$value == $idx printf "elem[%u]: ", $i p *($arg1*)$value set $ElementsFound++ end if $node->_M_right != 0
    set $node = $node->_M_right
    while $node->_M_left != 0
    set $node = $node->_M_left
    end
    else
    set $tmp_node = $node->_M_parent
    while $node == $tmp_node->_M_right
    set $node = $tmp_node
    set $tmp_node = $tmp_node->_M_parent
    end
    if $node->_M_right != $tmp_node
    set $node = $tmp_node
    end
    end
    set $i++
    end
    printf "Number of elements found = %un", $ElementsFound
    end
    printf "Set size = %un", $tree_size
    end
    end

    document pset
    Prints std::set or std::multiset information. Works for std::multiset as well.
    Syntax: pset : Prints set size, if T defined all elements or just element(s) having val
    Examples:
    pset s - prints set size and definition
    pset s int - prints all elements and the size of s
    pset s int 20 - prints the element(s) with value = 20 (if any) and the size of s
    end

    #
    # std::dequeue
    #

    define pdequeue
    if $argc == 0
    help pdequeue
    else
    set $size = 0
    set $start_cur = $arg0._M_impl._M_start._M_cur
    set $start_last = $arg0._M_impl._M_start._M_last
    set $start_stop = $start_last
    while $start_cur != $start_stop
    p *$start_cur
    set $start_cur++
    set $size++
    end
    set $finish_first = $arg0._M_impl._M_finish._M_first
    set $finish_cur = $arg0._M_impl._M_finish._M_cur
    set $finish_last = $arg0._M_impl._M_finish._M_last
    if $finish_cur < $finish_last set $finish_stop = $finish_cur else set $finish_stop = $finish_last end while $finish_first != $finish_stop p *$finish_first set $finish_first++ set $size++ end printf "Dequeue size = %un", $size end end document pdequeue Prints std::dequeue information.
    Syntax: pdequeue : Prints dequeue size, if T defined all elements
    Deque elements are listed "left to right" (left-most stands for front and right-most stands for back)
    Example:
    pdequeue d - prints all elements and size of d
    end

    #
    # std::stack
    #

    define pstack
    if $argc == 0
    help pstack
    else
    set $start_cur = $arg0.c._M_impl._M_start._M_cur
    set $finish_cur = $arg0.c._M_impl._M_finish._M_cur
    set $size = $finish_cur - $start_cur
    set $i = $size - 1
    while $i >= 0
    p *($start_cur + $i)
    set $i--
    end
    printf "Stack size = %un", $size
    end
    end

    document pstack
    Prints std::stack information.
    Syntax: pstack : Prints all elements and size of the stack
    Stack elements are listed "top to buttom" (top-most element is the first to come on pop)
    Example:
    pstack s - prints all elements and the size of s
    end

    #
    # std::queue
    #

    define pqueue
    if $argc == 0
    help pqueue
    else
    set $start_cur = $arg0.c._M_impl._M_start._M_cur
    set $finish_cur = $arg0.c._M_impl._M_finish._M_cur
    set $size = $finish_cur - $start_cur
    set $i = 0
    while $i < $size p *($start_cur + $i) set $i++ end printf "Queue size = %un", $size end end document pqueue Prints std::queue information.
    Syntax: pqueue : Prints all elements and the size of the queue
    Queue elements are listed "top to bottom" (top-most element is the first to come on pop)
    Example:
    pqueue q - prints all elements and the size of q
    end

    #
    # std::priority_queue
    #

    define ppqueue
    if $argc == 0
    help ppqueue
    else
    set $size = $arg0.c._M_impl._M_finish - $arg0.c._M_impl._M_start
    set $capacity = $arg0.c._M_impl._M_end_of_storage - $arg0.c._M_impl._M_start
    set $i = $size - 1
    while $i >= 0
    p *($arg0.c._M_impl._M_start + $i)
    set $i--
    end
    printf "Priority queue size = %un", $size
    printf "Priority queue capacity = %un", $capacity
    end
    end

    document ppqueue
    Prints std::priority_queue information.
    Syntax: ppqueue : Prints all elements, size and capacity of the priority_queue
    Priority_queue elements are listed "top to buttom" (top-most element is the first to come on pop)
    Example:
    ppqueue pq - prints all elements, size and capacity of pq
    end

    #
    # std::bitset
    #

    define pbitset
    if $argc == 0
    help pbitset
    else
    p /t $arg0._M_w
    end
    end

    document pbitset
    Prints std::bitset information.
    Syntax: pbitset : Prints all bits in bitset
    Example:
    pbitset b - prints all bits in b
    end

    #
    # std::string
    #

    define pstring
    if $argc == 0
    help pstring
    else
    printf "String ttt= "%s"n", $arg0._M_data()
    printf "String size/length t= %un", $arg0._M_rep()->_M_length
    printf "String capacity t= %un", $arg0._M_rep()->_M_capacity
    printf "String ref-count t= %dn", $arg0._M_rep()->_M_refcount
    end
    end

    document pstring
    Prints std::string information.
    Syntax: pstring
    Example:
    pstring s - Prints content, size/length, capacity and ref-count of string s
    end

    #
    # std::wstring
    #

    define pwstring
    if $argc == 0
    help pwstring
    else
    call printf("WString tt= "%ls"n", $arg0._M_data())
    printf "WString size/length t= %un", $arg0._M_rep()->_M_length
    printf "WString capacity t= %un", $arg0._M_rep()->_M_capacity
    printf "WString ref-count t= %dn", $arg0._M_rep()->_M_refcount
    end
    end

    document pwstring
    Prints std::wstring information.
    Syntax: pwstring
    Example:
    pwstring s - Prints content, size/length, capacity and ref-count of wstring s
    end

    #
    # C++ related beautifiers
    #

    set print pretty on
    set print object on
    set print static-members on
    set print vtbl on
    set print demangle on
    set demangle-style gnu-v3
    set print sevenbit-strings off

Share on Facebook Share on Google Plus Share on LinkeIn

I'm in social networks

GitHub

LinkedIn

Google

Search:

Tags: