?? pijl.txt
字號:
Debugging Standard Containers with GDB
by Herman Pijl
Listing 1
#include <vector>
#include <set>
#include <map>
#include <string>
using namespace std;
int main()
{
vector<int> l_vec;
l_vec.push_back(1);
l_vec.push_back(2);
set<int> l_set; // breakpoint 1
l_set.insert(3);
l_set.insert(4);
map<int, string> l_map;// breakpoint 2
l_map[5] = "five";
l_map[6] = "six";
return 0; // breakpoint 3
}
Listing 2:
template <typename T>
class vector
{
private:
T *end_of_storage;
T *start;
T *finish;
... // other implementation details not relevant
};
Listing 3:
#########################################
define veclen
set $veclen = $arg0.finish - $arg0.start
end
document veclen
Set the variable $veclen to the length of the vector
end
#########################################
define pveclen
veclen $arg0
output $veclen
echo \n
end
document pveclen
Print the length of a vector
end
Listing 4:
#########################################
define pvecidx
output *($arg0.start + $arg1)
echo \n
end
document pvecidx
Print the i-th element of a vector
end
#########################################
define pvec
veclen $arg0
set $lloop = 0
while ($lloop < $veclen)
pvecidx $arg0 $lloop
set $lloop = $lloop + 1
end
end
document pvec
pvec varname
Print all the elements of a vector varname
example:
09 vector<int> l_vec;
10 l_vec.push_back(1);
11 l_vec.push_back(2);
(gdb) pvec l_vec
1
2
end
Listing 5:
struct rb_tree_node_base
{
enum color_type {red, black};
color_type color;
rb_tree_node_base *parent;
rb_tree_node_base *left;
rb_tree_node_base *right;
};
template <typename T>
struct rb_tree_node: rb_tree_node_base
{
T value_field;
};
template <typename T>
class rb_tree
{
private:
rb_tree_node<T> *header;
// and much more
};
Listing 6:
#########################################
define setlen
set $setlen = $arg0.t.node_count
end
document setlen
Set the variable $setlen to the length of the set
end
#########################################
define psetlen
setlen $arg0
output $setlen
echo \n
end
document psetlen
Print the length of a set
end
#########################################
# support functions to navigate through nodes
# parent 4
# left 8
# right 12
# value 16
set $cParentOffset = 4
set $cLeftOffset = 8
set $cRightOffset = 12
set $cValueOffset = 16
# definitions of setleft, setright, setparent
# setbegin, setend, setminimum and setnext
# are left out to save space
#########################################
define pset
setbegin $arg0
set $setloop = $setbegin
setend $arg0
while ($setloop != $setend)
output ($arg1 &)($setloop + $cValueOffset)
echo \n
setnext $setloop
set $setloop = $setnext
end
end
document pset
pset varname type
Print the elements of a set varname
example:
13 set<int> l_set;
14 l_set.insert(3);
15 l_set.insert(4);
(gdb) pset l_set int
3
4
end
Listing 7:
/* set */
template <typename T>
class set
{
public:
iterator begin();
// ...
};
/* set.cpp */
template <typename T>
iterator set<T>::begin()
{
// some implementation
}
/* mysource.cpp */
#include <set>
void f()
{
set<int> l_set;
// ...
}
#include "set.cpp"
template class set<int>;
Listing 8:
#########################################
define pset
set $settype = &$arg0.t.header->value_field
set $settypep = &$settype
setbegin $arg0
set $setloop = $setbegin
setend $arg0
while ($setloop != $setend)
set *$settypep = $setloop + $cValueOffset
output **$settypep
echo \n
setnext $setloop
set $setloop = $setnext
end
end
1
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -