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等对象的方法,非常好用!
1. 下载 http://www.yolinux.com/TUTORIALS/src/dbinit_stl_views-1.03.txt
2. #cat dbinit_stl_views-1.03.txt >> ~/.gdbinit
3. 若正处于gdb中,运行命令:
(gdb) source ~/.gdbinit
4. 例如,如下代码:
bugging.cpp
[cpp] view plaincopy
- #include <vector>
- using namespace std;
- int main()
- {
- vector<int> vec;
- vec.push_back(2);
- vec.push_back(3);
- vec.push_back(4);
- return 0;
- }
编译:
[cpp] view plaincopy
- #g++ -o bugging -g bugging.cpp
gdb调试:.
[cpp] view plaincopy
- # gdb bugging
- GNU gdb 6.8
- Copyright (C) 2008 Free Software Foundation, Inc.
- License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
- 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 bugging.cpp, line 6.
- (gdb) run
- Starting program: /root/learn/c++/bugging
- Breakpoint 1, main () at bugging.cpp: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)
5. 默认情况下gdb不能用[]查看stl容器的数据元素,提示如下错误:
[cpp] view plaincopy
- <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
dbinit_stl_views-1.03.txt 下载地址 :http://download.csdn.net/detail/dearwind153/9562875