假设有这样的事情:
#include <map>
int main(){
std::map<int,int> m;
m[1] = 2;
m[2] = 4;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我希望能够从gdb检查运行该程序的地图的内容.
如果我尝试使用下标运算符,我得到:
(gdb) p m[1]
Attempt to take address of value not located in memory.
Run Code Online (Sandbox Code Playgroud)
使用find方法不会产生更好的结果:
(gdb) p m.find(1)
Cannot evaluate function -- may be inlined
Run Code Online (Sandbox Code Playgroud)
有没有办法实现这个目标?
我按照GDB维基上的说明安装了用于查看STL容器的python pretty-printers.我~/.gdbinit现在看起来像这样:
python
import sys
sys.path.insert(0, '/opt/gdb_prettyprint/python')
from libstdcxx.v6.printers import register_libstdcxx_printers
register_libstdcxx_printers (None)
end
Run Code Online (Sandbox Code Playgroud)
但是,当我运行GDB并尝试打印STL类型时,我得到以下内容:
print myString
Python Exception <class 'gdb.error'> No type named std::basic_string<char>::_Rep.:
$3 =
Run Code Online (Sandbox Code Playgroud)
任何人都可以对此有所了解吗?我正在运行Ubuntu 12.04,它带有GDB 7.4.
double var1, var2;
std::vector<double *> x;
var1 = 1;
var2 = 2;
x.push_back(&var1);
x.push_back(&var2);
Run Code Online (Sandbox Code Playgroud)
当我在gdb中调试此代码并尝试print x [0]或*x [0]时,我得到:找不到operator [].现在如果我在push_back之后包含这一行:
x[0] = &var1;
Run Code Online (Sandbox Code Playgroud)
我可以访问gdb中的任何特定元素.其他成员也会发生同样的事情,例如front(),at()等.我的理解是编译器/链接器只包含源代码中存在的成员函数,而那些是我可以在gdb中使用的成员函数.有没有办法包含std :: vector的每个成员函数,所以我可以在gdb中访问它们?
我正在调试一些C++代码,我有一个非常大std::vector<floating_point_type>(float或double).在C++代码中,当我想要std::vector我可以使用的最大值时std::max_element().所以在gdb我尝试使用相同的代码,但我收到了一个错误.
在gdb我使用call std::max_element(x)并得到一个错误消息No symbol "max_element" in namespace "std".
有没有办法获得矢量的最大值gdb?
我还要感谢解释为什么我的使用尝试std::max_element不起作用(可能std::max_element只是一个标题或内联函数).
例如,我在模板类中有这样的结构:
struct Foo{
int data;
vector<Foo*> children;
}
Run Code Online (Sandbox Code Playgroud)
要打印出数据值,我可以简单地执行以下操作:(设为bar指向 a 的指针Foo)
print bar->data
Run Code Online (Sandbox Code Playgroud)
这很好用。不过我还想关注children另一个Foo。我试过:
print bar->children[0]->data
Run Code Online (Sandbox Code Playgroud)
但它不起作用。我应该如何访问向量中的项目并在中使用它print?