我正在调试一些C++代码,我有一个非常大std::vector<floating_point_type>(float或double).在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向量的迭代器类型实例化的方式修改源代码.所以你也可以添加"仅调试"代码来计算最大元素并将其存储到局部变量中.
(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不破坏会话和重新编译程序的情况下调用未实例化的函数模板.
打开编辑器并创建一个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++源代码.可能不值得麻烦.
从源构建共享库/ DLL.
g++ -fPIC -shared -ggdb -O0 -o /tmp/libtmpsource.so /tmp/tmpsource.cpp
Run Code Online (Sandbox Code Playgroud)在调试会话中加载库.
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)我们现在试试吧.
(gdb) p std::max_element(v.begin(), v.end())
No symbol "max_element" in namespace "std".
Run Code Online (Sandbox Code Playgroud)什么?不用担心,一切都在掌控之中.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)