繁体   English   中英

gdb:你如何得到std :: vector的最大值 <float> ?

[英]gdb: how do you get the max value of a std::vector<float>?

我正在调试一些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".收到错误消息No symbol "max_element" in namespace "std".

有没有办法在gdb获取向量的最大值?

我还要理解为什么我尝试使用std::max_element不起作用的原因(也许std::max_element是一个仅限头文件或内联函数)。

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

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

(gdb) p std::max⭾⭾⭾

(没有来自gdb的回复)

 (gdb) p std::max_element(v.begin(), v.end())
 No symbol "max_element" in namespace "std".

以下是如何从gdb调用未实例化的函数模板,而不会破坏您的会话并重新编译您的程序。

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

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

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

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

     g++ -fPIC -shared -ggdb -O0 -o /tmp/libtmpsource.so /tmp/tmpsource.cpp 
  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") 
  4. 我们现在试试吧。

     (gdb) p std::max_element(v.begin(), v.end()) No symbol "max_element" in namespace "std". 
  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> > >) 

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM