先下载gdb_stl_utils., extract it, and run make. This will compile and install the necessary files in ~/.gdb (edit the Makefile if you want to use a different directory). To use the p_stl_* functions, add:
source ~/.gdb/gdb_stl_utils
to your ~/.gdbinit.
I've tested this with GCC 3.3.3 and 3.4.0, and GDB 6.0. Let me know if you have any problems with it!
如何使用请查看gdbint文件,里面描述得很详细。
注意:
比如打印vector:
1.(gdb) p vec
$1 = {
<std::_Vector_base<int,std::allocator<int> >> = {
_M_impl = {
<std::allocator<int>> = {
<__gnu_cxx::new_allocator<int>> = {<No data fields>}, <No data fields>},
members of std::_Vector_base<int,std::allocator<int> >::_Vector_impl:
_M_start = 0x92ec040,
_M_finish = 0x92ec058,
_M_end_of_storage = 0x92ec060
}
}, <No data fields>}
2.(gdb) p_stl_vector vec->_M_impl(_M_start和_M_finish位于_M_impl具体情况可能不同)
Vector Element 0: $2 = 0
Vector Element 1: $3 = 1
Vector Element 2: $4 = 2
Vector Element 3: $5 = 3
Vector Element 4: $6 = 4
Vector Element 5: $7 = 100
/u/9861/showart_1888226.html
Debugging STL code with GDB: /weblogs/arhuaco/debugging-stl-code-with-gdb
通向 UNIX 天堂的 10 个阶梯(使用 STL 和 gdb, 通过结合使用 gdb 与 Valgrind 和 Electric-Fence 解决内存错误)
/developerworks/cn/aix/library/au-aixnirvana/
GDB的自定义命令非常有用,通过自定义命令,直接操作容器中的数据,可以方便的查看STL容器中的数据。
这个链接dbinit_stl_views是Dan C Marinescu写的查看STL容器的自定义命令(如果不适合你的STL版本的话,可以自行修改)。把它添加到你的.gdbinit中,就可以方便的查看STL容器了。它提供了查看vector,list,map,multimap,set,multiset,deque,stack,queue,priority_queue,bitset,string,widestring等对象的方法,非常好用!
- #include <vector>
- using namespace std;
- int main()
- {
- vector<int> vec;
- vec.push_back(2);
- vec.push_back(3);
- vec.push_back(4);
- return 0;
- }
编译:
- #g++ -o bugging -g
- # gdb bugging
- GNU gdb 6.8
- Copyright (C) 2008 Free Software Foundation, Inc.
- License GPLv3+: GNU GPL version 3 or later <http:///licenses/>
- This is free software: you are free to change and redistribute it.
- There is NO WARRANTY, to the extent permitted by law. Type "show copying"
- and "show warranty" for details.
- This GDB was configured as "i486-slackware-linux"...
- (gdb) help 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
- (gdb) break main
- Breakpoint 1 at 0x80485c6: file , line 6.
- (gdb) run
- Starting program: /root/learn/c++/bugging
- Breakpoint 1, main () at :6
- 6 vector<int> vec;
- (gdb) n
- 7 vec.push_back(2);
- (gdb)
- 8 vec.push_back(3);
- (gdb) 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
- (gdb) pvector vec
- elem[0]: $1 = 2
- Vector size = 1
- Vector capacity = 1
- Element type = int *
- (gdb) n
- 9 vec.push_back(4);
- (gdb)
- 10 return 0;
- (gdb) pvector vec
- elem[0]: $2 = 2
- elem[1]: $3 = 3
- elem[2]: $4 = 4
- Vector size = 3
- Vector capacity = 4
- Element type = int *
- (gdb)
- <span style="font-size:16px;">(gdb) print vec[0]
- One of the arguments you tried to pass to operator[] could not be converted to what the function wants.</span>
一些常用内置的命令
Data type GDB command
std::vector<T> pvector stl_variable
std::list<T> plist stl_variable T
std::map<T,T> pmap stl_variable
std::multimap<T,T> pmap stl_variable
std::set<T> pset stl_variable T
std::multiset<T> pset stl_variable
std::deque<T> pdequeue stl_variable
std::stack<T> pstack stl_variable
std::queue<T> pqueue stl_variable
std::priority_queue<T> ppqueue stl_variable
std::bitset<n>td> pbitset stl_variable
std::string pstring stl_variable
std::widestring pwstring stl_variable