在linux用gdb或者cgdb计较不爽的地方是无法打印STL的东西,所有啊去网上找了找解决方案 https://www.douban.com/note/182826844/?qq-pf-to=pcqq.c2c

本帖把怎么配置这个东西写出了,万一以后忘了,可以回头找找。

首先是下载gdb文件 https://sourceware.org/gdb/wiki/STLSupport ------》找到网页里面的

然后点击进去下载stl_views_1.0.3.gdb

接下来把这个东西当到linux下,位置随便放,我放到了我的用户目录下

然后写一个小程序测试一下,

接着cgdb test 进入调试模式,然后加载刚才的stl_views_1.0.3.gdb

接着就可以看看pmap的命令了

pmap variable------------>打印variable这个map的定义和map里面的个数

pmap variable int  int(就是单纯的两个int) ------------>打印pmap的元素和map的个数

pmap variable int int 20------------>打印索引是20的map的值 和map的个数

pmap variable int int 20 200------->打印索引是20 值是200的map值和map的个数

东西很好用,就怕以后链接失效找不到这个文件了,下面会把这个文件东西拷贝在下面。以后用到了,自己建立一个stl_views_1.0.3.gdb,然后把下面的东西拷贝进去使用。

# STL GDB evaluators/views/utilities - 1.03 # 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 <T> -- via pvector command # std::list <T> -- via plist or plist_member command # std::map <T,T> -- via pmap or pmap_member command # std::multimap <T,T> -- via pmap or pmap_member command # std:: set <T> -- via pset command # std::multiset <T> -- via pset command # std::deque <T> -- via pdequeue command # std::stack <T> -- via pstack command # std::queue <T> -- via pqueue command # std::priority_queue <T> -- via ppqueue command # std::bitset <n> -- via pbitset command # std:: string -- via pstring command # std::widestring -- via pwstring command # The end of this file contains (optional) C++ beautifiers # Make sure your debugger supports $argc # Simple GDB Macros writen by Dan Marinescu (H -PhD) - License GPL # Inspired by intial work of Tom Malnar, # Tony Novac (PhD) / Cornell / Stanford, # Gilad Mishne (PhD) and Many Many Others. # Contact: dan_c_marinescu@yahoo.com (Subject: STL) # Modified to work with g ++ 4.3 by Anders Elton # Also added _member functions, that instead of printing the entire class in map, prints a member. # std::vector <> define pvector if $argc == 0 help pvector 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 if $argc == 1 set $i = 0 while $i < $size printf " elem[%u]: " , $i p *($arg0._M_impl._M_start + $i) set $i++ 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 printf " elem[%u]: " , $idx p *($arg0._M_impl._M_start + $idx) 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 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 set $i = $start_idx while $i <= $stop_idx printf " elem[%u]: " , $i p *($arg0._M_impl._M_start + $i) set $i++ if $argc > 0 printf " Vector size = %u\n " , $size printf " Vector capacity = %u\n " , $capacity printf " Element " whatis $arg0._M_impl._M_start document pvector Prints std::vector <T> information. Syntax: pvector <vector> <idx1> <idx2> Note: idx, idx1 and idx2 must be in acceptable range [ 0 ..<vector>.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 # std::list <> define plist if $argc == 0 help plist 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 ) if $argc == 3 if $size == $arg2 printf " elem[%u]: " , $size p *($arg1*)($current + 1 ) set $current = $current._M_next set $size++ printf " List size = %u \n " , $size if $argc == 1 printf " List " whatis $arg0 printf " Use plist <variable_name> <element_type> to see the elements in the list.\n " document plist Prints std::list <T> information. Syntax: plist <list> <T> <idx>: 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 define plist_member if $argc == 0 help plist_member set $head = & $arg0._M_impl._M_node set $current = $arg0._M_impl._M_node._M_next set $size = 0 while $current != $head if $argc == 3 printf " elem[%u]: " , $size p ( *($arg1*)($current + 1 )).$arg2 if $argc == 4 if $size == $arg3 printf " elem[%u]: " , $size p ( *($arg1*)($current + 1 )).$arg2 set $current = $current._M_next set $size++ printf " List size = %u \n " , $size if $argc == 1 printf " List " whatis $arg0 printf " Use plist_member <variable_name> <element_type> <member> to see the elements in the list.\n " document plist_member Prints std::list <T> information. Syntax: plist <list> <T> <idx>: Prints list size, if T defined all elements or just element at idx Examples: plist_member l int member - prints all elements and list size plist_member l int member 2 - prints the third element in the list ( if exists) and list size # std::map and std::multimap define pmap if $argc == 0 help pmap 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 <variable_name> <left_element_type> <right_element_type> to see the elements in the map.\n " if $argc == 3 while $i < $tree_size set $value = ( void *)($node + 1 ) printf " elem[%u].left: " , $i p *($arg1* )$value set $value = $value + sizeof ($arg1) 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 set $tmp_node = $node._M_parent while $node == $tmp_node._M_right set $node = $tmp_node set $tmp_node = $tmp_node._M_parent if $node._M_right != $tmp_node set $node = $tmp_node set $i++ 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 + sizeof ($arg1) printf " elem[%u].right: " , $i p *($arg2* )$value set $ElementsFound++ if $node._M_right != 0 set $node = $node._M_right while $node._M_left != 0 set $node = $node._M_left set $tmp_node = $node._M_parent while $node == $tmp_node._M_right set $node = $tmp_node set $tmp_node = $tmp_node._M_parent if $node._M_right != $tmp_node set $node = $tmp_node set $i++ printf " Number of elements found = %u\n " , $ElementsFound 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 + sizeof ($arg1)) if $valueLeft == $idx1 && $valueRight == $idx2 printf " elem[%u].left: " , $i p $valueLeft printf " elem[%u].right: " , $i p $valueRight set $ElementsFound++ if $node._M_right != 0 set $node = $node._M_right while $node._M_left != 0 set $node = $node._M_left set $tmp_node = $node._M_parent while $node == $tmp_node._M_right set $node = $tmp_node set $tmp_node = $tmp_node._M_parent if $node._M_right != $tmp_node set $node = $tmp_node set $i++ printf " Number of elements found = %u\n " , $ElementsFound printf " Map size = %u\n " , $tree_size document pmap Prints std::map <TLeft and TRight> or std::multimap<TLeft and TRight> information. Works for std::multimap as well. Syntax: pmap <map> <TtypeLeft> <TypeRight> <valLeft> <valRight>: 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 define pmap_member if $argc == 0 help pmap_member 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 <variable_name> <left_element_type> <right_element_type> to see the elements in the map.\n " if $argc == 5 while $i < $tree_size set $value = ( void *)($node + 1 ) printf " elem[%u].left: " , $i p ( *($arg1* )$value).$arg2 set $value = $value + sizeof ($arg1) printf " elem[%u].right: " , $i p ( *($arg3* )$value).$arg4 if $node._M_right != 0 set $node = $node._M_right while $node._M_left != 0 set $node = $node._M_left set $tmp_node = $node._M_parent while $node == $tmp_node._M_right set $node = $tmp_node set $tmp_node = $tmp_node._M_parent if $node._M_right != $tmp_node set $node = $tmp_node set $i++ if $argc == 6 set $idx = $arg5 set $ElementsFound = 0 while $i < $tree_size set $value = ( void *)($node + 1 ) if *($arg1*)$value == $idx printf " elem[%u].left: " , $i p ( *($arg1* )$value).$arg2 set $value = $value + sizeof ($arg1) printf " elem[%u].right: " , $i p ( *($arg3* )$value).$arg4 set $ElementsFound++ if $node._M_right != 0 set $node = $node._M_right while $node._M_left != 0 set $node = $node._M_left set $tmp_node = $node._M_parent while $node == $tmp_node._M_right set $node = $tmp_node set $tmp_node = $tmp_node._M_parent if $node._M_right != $tmp_node set $node = $tmp_node set $i++ printf " Number of elements found = %u\n " , $ElementsFound printf " Map size = %u\n " , $tree_size document pmap_member Prints std::map <TLeft and TRight> or std::multimap<TLeft and TRight> information. Works for std::multimap as well. Syntax: pmap <map> <TtypeLeft> <TypeRight> <valLeft> <valRight>: Prints map size, if T defined all elements or just element(s) with val(s) Examples: pmap_member m class1 member1 class2 member2 - prints class1.member1 : class2.member2 pmap_member m class1 member1 class2 member2 lvalue - prints class1.member1 : class2.member2 where class1 == lvalue # std:: set and std::multiset define pset if $argc == 0 help pset 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 <variable_name> <element_type> to see the elements in the set.\n " 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 set $tmp_node = $node._M_parent while $node == $tmp_node._M_right set $node = $tmp_node set $tmp_node = $tmp_node._M_parent if $node._M_right != $tmp_node set $node = $tmp_node set $i++ 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++ if $node._M_right != 0 set $node = $node._M_right while $node._M_left != 0 set $node = $node._M_left set $tmp_node = $node._M_parent while $node == $tmp_node._M_right set $node = $tmp_node set $tmp_node = $tmp_node._M_parent if $node._M_right != $tmp_node set $node = $tmp_node set $i++ printf " Number of elements found = %u\n " , $ElementsFound printf " Set size = %u\n " , $tree_size document pset Prints std:: set <T> or std::multiset<T> information. Works for std::multiset as well. Syntax: pset < set > <T> <val>: 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 # std::dequeue define pdequeue if $argc == 0 help pdequeue 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++ 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 set $finish_stop = $finish_last while $finish_first != $finish_stop p * $finish_first set $finish_first++ set $size++ printf " Dequeue size = %u\n " , $size document pdequeue Prints std::dequeue <T> information. Syntax: pdequeue <dequeue>: 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 # std::stack define pstack if $argc == 0 help pstack 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-- printf " Stack size = %u\n " , $size document pstack Prints std::stack <T> information. Syntax: pstack <stack> : 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 # std::queue define pqueue if $argc == 0 help pqueue 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++ printf " Queue size = %u\n " , $size document pqueue Prints std::queue <T> information. Syntax: pqueue <queue> : 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 # std::priority_queue define ppqueue if $argc == 0 help ppqueue 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-- printf " Priority queue size = %u\n " , $size printf " Priority queue capacity = %u\n " , $capacity document ppqueue Prints std::priority_queue <T> information. Syntax: ppqueue <priority_queue> : 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 # std::bitset define pbitset if $argc == 0 help pbitset p / t $arg0._M_w document pbitset Prints std::bitset <n> information. Syntax: pbitset <bitset>: Prints all bits in bitset Example: pbitset b - prints all bits in b # std:: string define pstring if $argc == 0 help pstring printf " String \t\t\t= \"%s\"\n " , $arg0._M_data() printf " String size/length \t= %u\n " , $arg0._M_rep()._M_length printf " String capacity \t= %u\n " , $arg0._M_rep()._M_capacity printf " String ref-count \t= %d\n " , $arg0._M_rep()._M_refcount document pstring Prints std:: string information. Syntax: pstring < string > Example: pstring s - Prints content, size/length, capacity and ref -count of string s # std::wstring define pwstring if $argc == 0 help pwstring call printf( " WString \t\t= \"%ls\"\n " , $arg0._M_data()) printf " WString size/length \t= %u\n " , $arg0._M_rep()._M_length printf " WString capacity \t= %u\n " , $arg0._M_rep()._M_capacity printf " WString ref-count \t= %d\n " , $arg0._M_rep()._M_refcount document pwstring Prints std::wstring information. Syntax: pwstring <wstring> Example: pwstring s - Prints content, size/length, capacity and ref - count of wstring s # C ++ related beautifiers (optional) 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