在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