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

时间:2018-06-18 13:22:04

标签: c++ vector gdb

我正在调试一些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只有标题或内联函数)。

3 个答案:

答案 0 :(得分:13)

std::max_element是一个函数模板,而不是函数。您要求GDB进行模板参数推导,并且整个shebang涉及调用模板函数而不指定参数。它无法做到这一点,当然,它不是一个完整的编译器。

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

答案 1 :(得分:5)

yourMapName.setMapType(GoogleMap.MAP_TYPE_HYBRID);

(gdb没有回应)

(gdb) p std::max⭾⭾⭾

以下是如何在不中断会话和重新编译程序的情况下从 (gdb) p std::max_element(v.begin(), v.end()) No symbol "max_element" in namespace "std". 调用未实例化的函数模板。

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

    gdb

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

  2. 从源代码构建共享库/ DLL。

    // /tmp/tmpsource.cpp
    #include <algorithm>
    #include <vector>
    using T = std::vector<int>::iterator;
    template T std::max_element<T>(T, T);
    
  3. 在调试会话中加载库。

    g++ -fPIC -shared -ggdb -O0 -o /tmp/libtmpsource.so /tmp/tmpsource.cpp
    
  4. 让我们现在试试这个功能。

    load /tmp/libtmpsource.so
    # if this doesn't work
    p dlopen("/tmp/libtmpsource.so", 2)
    # or perhaps even
    p LoadLibraryA("c:/temp/libtmpsource.so")
    
  5. 什么?不用担心,一切都在掌控之中。 gdb不是C ++编译器,它不能做模板演绎的事情。您需要自己指定(gdb) p std::max_element(v.begin(), v.end()) No symbol "max_element" in namespace "std". 。幸运的是,自动完成工作(有时)。

    <...>

答案 2 :(得分:2)

由于std :: max_elemente是一个函数模板,因此不能直接在gdb中使用它。 你可以做什么,在它上面创建一个包装器。

float my_max_element(std::vector<float>& vec) 
{
    return *(std::max_element(vec.begin(), vec.end());
}

现在你可以在gdb中调用my_max_element。