我正在调试一些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
只有标题或内联函数)。
答案 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".
调用未实例化的函数模板。
打开编辑器并创建一个C ++源文件,其中包含所需函数的显式实例化。例如:
gdb
这可以通过shell脚本以某种方式自动化。给它一个函数和模板参数的名称,它将生成一个完整的可构建C ++源代码。可能不值得这么麻烦。
从源代码构建共享库/ DLL。
// /tmp/tmpsource.cpp
#include <algorithm>
#include <vector>
using T = std::vector<int>::iterator;
template T std::max_element<T>(T, T);
在调试会话中加载库。
g++ -fPIC -shared -ggdb -O0 -o /tmp/libtmpsource.so /tmp/tmpsource.cpp
让我们现在试试这个功能。
load /tmp/libtmpsource.so
# if this doesn't work
p dlopen("/tmp/libtmpsource.so", 2)
# or perhaps even
p LoadLibraryA("c:/temp/libtmpsource.so")
什么?不用担心,一切都在掌控之中。 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。