我想检查std::vectorGDB中的内容,我该怎么做?让我们说这是std::vector<int>为了简单起见.
假设有这样的事情:
#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/boost的c ++代码仍然是一场噩梦.任何使用过STL的gdb的人都知道这一点.例如,请参阅此处代码中的一些调试会话的示例运行.
我试图通过收集提示来减轻疼痛.您能否对我在下面收集的提示发表评论(特别是您使用过的提示以及您建议的任何更改) - 我列出的提示是技术性的降序.
更新:GDB有一个新的C++分支.
我按照以下说明安装了GDB 7.0和python .在同一本手册中,提到了这个文件stl-views-1.0.3.gdb.让我感到困惑的是它应该放在哪里以便能够漂亮地打印stl容器.有人还会向我解释所有这些工作吗?
谢谢
说我有代码:
std::string str = "random";
function(str);
void function (std::string str)
{
std::cout << str << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
如果我在gdb中单步执行此代码,然后进入该函数并执行p str此操作将打印出类似这样的内容,\362\241但cout将在屏幕上打印正确的字符串random.有没有人见过这个,如果是这样我该怎么办?我在gdb中使用错误的print命令还是与编译器如何解释字符串有关?
在调试C ++应用程序时,是否有一些“默认函数”在GDB上打印类似字符串的对象?类似于:toString();
还是我的课必须实现类似的东西?
我希望能够使用GDB从STL容器中获取地址并打印一对.
IE:鉴于以下玩具计划:
#include <map>
int main()
{
std::map<int,int> amap;
amap.insert(std::make_pair(1,2));
}
Run Code Online (Sandbox Code Playgroud)
当我尝试检查地图的单个元素时(例如p amap.begin()),我得到:
"无法评估功能 - 可能是内联的"
删除优化并启用完整调试模式,即(-O0和-g3)不起作用.
为什么会发生这种情况,我该如何解决?