我正在使用gdb
,我想知道我正在检查的迭代器在std::string
的哪个点。
例如it
是在字符串的第 2 位还是第 3 位?
我试图打电话给std::distance
但它不起作用。
const std:string &cs;
std::string::const_iterator it;
(gdb) call std::distance(cs.begin(), it);
No Symbol "distance" in namespace "std"
您知道如何实现这一目标吗?
std::distance
是模板化函数,它的模板参数在C++代码中推导,但 gdb 无法做到这一点,您必须在 gdb 中使用显式模板参数调用std::distance
。
这是如何使用std::vector
执行此操作的示例:
#include <iostream>
#include <iterator>
#include <vector>
int main()
{
std::vector<int> v{ 3, 1, 4 };
auto distance = std::distance(v.begin(), v.end());
std::cout << distance << 'n';
}
示例 gdb 会话(使用 Tab 完成自动完成实际迭代器类型(:
:$ gdb -q a.out
Reading symbols from a.out...done.
(gdb) start
Temporary breakpoint 1 at 0x40096d: file t.cpp, line 7.
Starting program: /home/asemenov/git-cpp/programs/ecpmd/a.out
Trying host libthread_db library: /home/asemenov/libthread_db.so.1.
td_ta_new failed: application not linked with libthread
thread_db_load_search returning 0
Temporary breakpoint 1, main () at t.cpp:7
7 std::vector<int> v{ 3, 1, 4 };
(gdb) n
9 auto distance = std::distance(v.begin(), v.end());
(gdb) call 'std::distance<__gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > > >(__gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >, __gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >)'(v.begin(), v.end())
$1 = 3
(gdb)
如果你用g++
或clang++
编译,你可以这样做:
p it._M_current - cs.begin()._M_current
对于其他编译器,您可以通过键入来查找内部布局
p it.<TAB><TAB>
以及保存数据的逆向工程。