如Element at index in a std::set?所述,
我最终想做的是在我的实际问题中使用 dprintf 类型的断点-我不想更改代码,因此不添加额外的迭代器变量。由于使用格式说明符,其中
问题是,我找不到访问第一个元素的正确语法:
在类似这样的上下文中,使用GDB的printf,是否可以打印出std :: set的第一个值,而无需更改代码(例如添加迭代器变量)?
std::set
没有直接的随机访问索引方式。因此,在这里我尝试使用它的.begin()
方法返回一个迭代器...下面是一个简单的最小示例:// g++ --std=c++11 -g test.cpp -o test.exe
#include <iostream>
#include <set>
int main()
{
std::set<std::string> my_set;
my_set.insert("AA");
my_set.insert("BB");
std::cout << "Hello World!" << std::endl;
return 0;
}
我最终想做的是在我的实际问题中使用 dprintf 类型的断点-我不想更改代码,因此不添加额外的迭代器变量。由于使用格式说明符,其中
%s
用于C样式字符串,因此我最终不仅需要引用的第一个元素,而且还需要在其上调用.c_str()
-并且所有这些都需要在一行中完成(在我的实际问题中,我有一个自定义String类的,它具有用于获取C样式字符串的自定义方法)。问题是,我找不到访问第一个元素的正确语法:
$ gdb --args ./test.exe
GNU gdb (Ubuntu 7.7.1-0ubuntu5~14.04.2) 7.7.1
...
Reading symbols from ./test.exe...done.
(gdb) b test.cpp:11
Breakpoint 1 at 0x8048bf8: file test.cpp, line 11.
(gdb) r
Starting program: /tmp/test.exe
Breakpoint 1, main () at test.cpp:11
11 std::cout << "Hello World!" << std::endl;
(gdb) p my_set
$1 = std::set with 2 elements = {[0] = "AA", [1] = "BB"}
(gdb) p my_set.begin()
Cannot evaluate function -- may be inlined
(gdb) p my_set->begin()
Cannot resolve method std::set<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >::begin to any overloaded instance
(gdb) printf "%s", my_set.begin()
Cannot evaluate function -- may be inlined
在类似这样的上下文中,使用GDB的printf,是否可以打印出std :: set的第一个值,而无需更改代码(例如添加迭代器变量)?
std::set<std::string>::iterator my_iter; my_iter = my_set.begin(); cout << &my_iter;
,这确实使my_set.begin()
在gdb
中打印出来了!但这似乎需要代码更改,我想避免... - sdaau