我想检查std::vectorGDB中的内容,我该怎么做?让我们说这是std::vector<int>为了简单起见.
我按照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.
使用gdb进行调试,任何使用STL/boost的c ++代码仍然是一场噩梦.任何使用过STL的gdb的人都知道这一点.例如,请参阅此处代码中的一些调试会话的示例运行.
我试图通过收集提示来减轻疼痛.您能否对我在下面收集的提示发表评论(特别是您使用过的提示以及您建议的任何更改) - 我列出的提示是技术性的降序.
更新:GDB有一个新的C++分支.
我有一个C++代码,我在实例化一个unordered_map,然后使用cout打印它的值.这很好用.但是,当我尝试在gdb中运行它并打印unordered_map的值时,这给了我错误.下面是代码片段:
std::unordered_map<std::string,int> mymap = {
{ "Mars", 3000},
{ "Saturn", 60000},
{ "Jupiter", 70000 } };
std::cout<< mymap.at("Mars");
std::cout<< mymap["Mars"];
Run Code Online (Sandbox Code Playgroud)
上面的两个cout语句都打印了密钥"Mars"的unordered_map值.但是,当我使用gdb然后尝试使用以下语句在关键字"Mars"上打印mymap的值时,我会收到错误.
(gdb) print mymap.at("Mars")
Cannot resolve method std::unordered_map<std::basic_string<char,
std::char_traits<char>, std::allocator<char> >, int,
std::hash<std::basic_string<char, std::char_traits<char>,
std::allocator<char> > >, std::equal_to<std::basic_string<char,
std::char_traits<char>, std::allocator<char> > >,
std::allocator<std::pair<std::basic_string<char, std::char_traits<char>,
std::allocator<char> > const, int> > >::at to any overloaded instance
(gdb) print mymap["Mars"]
Cannot resolve function operator[] to any overloaded instance
Run Code Online (Sandbox Code Playgroud)
我使用gdb时没有出错.
我已经尝试在gdb中使用whatis mymap来查看mymap是否存在于当前上下文中并且它表示它存在.此外,我尝试初始化一个int变量并在gdb中打印它并打印它.我不明白unordered_map有什么问题.
我使用下面的语句来生成可执行文件
gsrivas4@TitanX01:~/lcode1$ g++ -std=gnu++11 -O0 -g test1.cpp -o test1.out
Run Code Online (Sandbox Code Playgroud) 您好,我目前正在通过 GDB 在 Linux 机器上调试我的代码库。我目前面临着从类的对象 ptr 获取数据成员的值的问题。要打印对象 ptr 的位置,我们可以使用“p”(打印)或“显示”命令。
例如:我有这样的课程
class abc
{
string a;
};
Run Code Online (Sandbox Code Playgroud)
因此,在我的代码中,如果我使用类 abc 的指针,那么
abc* objPtr = new abc();
Run Code Online (Sandbox Code Playgroud)
因此,在上面的行中断之后,我将得到 objPtr,现在我想检查数据成员 a (abc::a) 值的值。我怎么能这么做呢?
(gdb) p objPtr
$2 = {px = 0x3ba6430690, pn = {pi_ = 0x3ba6430698}}
Run Code Online (Sandbox Code Playgroud)
此外,是否有不同的方法来检查作为列表/向量的数据成员?
我希望能够使用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)不起作用.
为什么会发生这种情况,我该如何解决?
我正在研究一种使用大地图的算法。我正在尝试按照算法和 GDB 进行操作,同时在纸上进行操作以查看哪里出错了。但是随着地图变大,GDB 将其缩写并停止显示我需要的下一个值:
(gdb) p R
$1 = std::map with 140 elements = {[0] = "", [1] = "e", [2] = "", [3] = "", [4] = "", [5] = "", [6] = "", [7] = "", [8] = "a", [9] = "a", [10] = "", [11] = "", [12] = "", [13] = "", [14] = "",
[15] = "", [16] = "a", [17] = "b", [18] = "", [19] = "", [20] = "", [21] = "", …Run Code Online (Sandbox Code Playgroud)