获取 GDB 中字符串中的迭代器位置



我正在使用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>

以及保存数据的逆向工程。

最新更新