gdb:你怎么得到std :: vector <float>的最大值?

Tre*_*ith 6 c++ gdb vector

我正在调试一些C++代码,我有一个非常大std::vector<floating_point_type>(floatdouble).在C++代码中,当我想要std::vector我可以使用的最大值时std::max_element().所以在gdb我尝试使用相同的代码,但我收到了一个错误.

gdb我使用call std::max_element(x)并得到一个错误消息No symbol "max_element" in namespace "std".

有没有办法获得矢量的最大值gdb

我还要感谢解释为什么我的使用尝试std::max_element不起作用(可能std::max_element只是一个标题或内联函数).

Sto*_*ica 13

std::max_element是一个功能模板,而不是一个功能.您要求GDB进行模板参数推导,并且整个shebang涉及调用模板函数而不指定参数.它不能那样做,当然,它不是一个完整的编译器.

据我所知,任何解决方案,从最简单到最复杂,都需要您以std::max_element向量的迭代器类型实例化的方式修改源代码.所以你也可以添加"仅调试"代码来计算最大元素并将其存储到局部变量中.


n. *_* m. 5

(gdb) p std::max???
Run Code Online (Sandbox Code Playgroud)

(没有来自gdb的回复)

 (gdb) p std::max_element(v.begin(), v.end())
 No symbol "max_element" in namespace "std".
Run Code Online (Sandbox Code Playgroud)

以下是如何在gdb不破坏会话和重新编译程序的情况下调用未实例化的函数模板.

  1. 打开编辑器并创建一个C++源文件,其中包含所需函数的显式实例化.例如:

    // /tmp/tmpsource.cpp
    #include <algorithm>
    #include <vector>
    using T = std::vector<int>::iterator;
    template T std::max_element<T>(T, T);
    
    Run Code Online (Sandbox Code Playgroud)

    这可以通过shell脚本以某种方式自动化.给它一个函数和模板参数的名称,它将生成一个完整的可构建C++源代码.可能不值得麻烦.

  2. 从源构建共享库/ DLL.

    g++ -fPIC -shared -ggdb -O0 -o /tmp/libtmpsource.so /tmp/tmpsource.cpp
    
    Run Code Online (Sandbox Code Playgroud)
  3. 在调试会话中加载库.

    load /tmp/libtmpsource.so
    # if this doesn't work
    p dlopen("/tmp/libtmpsource.so", 2)
    # or perhaps even
    p LoadLibraryA("c:/temp/libtmpsource.so")
    
    Run Code Online (Sandbox Code Playgroud)
  4. 我们现在试试吧.

    (gdb) p std::max_element(v.begin(), v.end())
    No symbol "max_element" in namespace "std".
    
    Run Code Online (Sandbox Code Playgroud)
  5. 什么?不用担心,一切都在掌控之中.gdb不是C++编译器,它不能做模板演绎的事情.你需要指定你<...>自己.幸运的是,自动完成工作(有时).

    (gdb) p std::max?
    (gdb) p std::max_element<__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> > >)
    
    Run Code Online (Sandbox Code Playgroud)