C++ 如何在gdb中打印'std::array'内容?

C++ 如何在gdb中打印'std::array'内容?,c++,c++11,gdb,stdarray,C++,C++11,Gdb,Stdarray,我对gdb不是很熟悉,也不知道如何在gdb手册中查找这个场景 我正试图在gdb中打印std::array的内容。下面是我试图在gdb中调试的用例 template<unsigned int N> double dotprod(const std::array<double, N> &v1, const std::array<double, N> &v2) { ... } 模板 双点Prod(常数标准::数组和v1,常数标准::数组和

我对gdb不是很熟悉,也不知道如何在gdb手册中查找这个场景

我正试图在gdb中打印
std::array
的内容。下面是我试图在gdb中调试的用例

template<unsigned int N>
double dotprod(const std::array<double, N> &v1, const std::array<double, N> &v2)
{
     ...
}
模板
双点Prod(常数标准::数组和v1,常数标准::数组和v2)
{
...
}

在这个函数中,我试图打印
pv1
的内容。它打印
(const mosp::Point*)0x7fffffffc150
。如何打印
v1
的内容?

我在gdb中使用的一个技巧是定义自己的打印功能

例如:

void print_int_array(array<int> *a) {
    for (auto it = a->begin(); it != a->end(); ++it)
        cout << *it << endl;
}

问题是,这需要您定义几个函数(注意:gdb可能有更好的模板支持,您可以使用带有显式实例化的模板,但我很保守)

gdb 7.6没有这个问题

[root@localhost ~]# gdb ./a.out 
GNU gdb (GDB) Fedora (7.6-30.fc19)
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it. 
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i686-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /root/a.out...done.
(gdb) b main
Breakpoint 1 at 0x80485b9: file a.cpp, line 11. 
(gdb) r
Starting program: /root/a.out 

Breakpoint 1, main () at a.cpp:11
11              std::array<double, 5> a = {0, 1.1, 2.2, 3.3, 4.4};
Missing separate debuginfos, use: debuginfo-install glibc-2.17-4.fc19.i686 libgcc-
4.8.1-1.fc19.i686 libstdc++-4.8.1-1.fc19.i686
(gdb) n
12              std::array<double, 5> b = {5.5, 6.6, 7.7, 8.8, 9.9};
(gdb) 
13              dotprod(a, b); 
(gdb) s
dotprod<5u> (v1=..., v2=...) at a.cpp:7
7               return 0;
(gdb) p v1
$1 = (const std::array<double, 5u> &) @0xbffff640: {_M_elems = {0, 1.1000000000000001, 2.2000000000000002, 
    3.2999999999999998, 4.4000000000000004}}
(gdb)
[root@localhost~]#gdb./a.out
GNU gdb(gdb)软呢帽(7.6-30.fc19)
版权所有(C)2013免费软件基金会。
许可证GPLv3+:GNU GPL版本3或更高版本
这是自由软件:您可以自由更改和重新发布它。
在法律允许的范围内,不存在任何担保。键入“显示复制”
和“显示保修”了解详细信息。
此GDB配置为“i686 redhat linux gnu”。
有关错误报告说明,请参阅:
...
从/root/a.out读取符号…完成。
(gdb)b干管
0x80485b9处的断点1:文件a.cpp,第11行。
(gdb)r
启动程序:/root/a.out
断点1,main()位于a.cpp:11
11 std::数组a={0,1.1,2.2,3.3,4.4};
缺少单独的调试信息,请使用:debuginfo安装glibc-2.17-4.fc19.i686 libgcc-
4.8.1-1.fc19.i686 libstdc++-4.8.1-1.fc19.i686
(gdb)n
12 std::数组b={5.5,6.6,7.7,8.8,9.9};
(gdb)
13 dotprod(a,b);
(gdb)s
a.cpp:7处的dotprod(v1=…,v2=…)
7返回0;
(gdb)p v1
$1=(const std::array&)@0xbffff640:{M_elems={0,1.10000000000001,2.20000000000000002,
3.2999999999999998, 4.4000000000000004}}
(gdb)

您的gdb版本是什么?GNU gdb(gdb)7.5.91.20130417-cvs-ubuntuIt可能是此特定版本gdb中的一个bug,也可能是某种合并二进制相同函数的链接器。通常,它应该只打印一个人类可读的值。请注意,
mosp::Point
在您的源代码中找不到,这可能意味着gdb被混淆了。尝试
p*((std::vector*)(v1))
尽管我不能保证它会有帮助。@n.m.s/vector/array/或者它肯定不会有帮助:)它听起来有点像这个bug:。请尝试更新的gdb。谢谢您的更新。它起作用了。但是,除非在我的代码中至少有一个对该函数的调用,否则该方法似乎不起作用。尽管如此,通过禁用“打印对象”可解决此问题。
[root@localhost ~]# gdb ./a.out 
GNU gdb (GDB) Fedora (7.6-30.fc19)
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it. 
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i686-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /root/a.out...done.
(gdb) b main
Breakpoint 1 at 0x80485b9: file a.cpp, line 11. 
(gdb) r
Starting program: /root/a.out 

Breakpoint 1, main () at a.cpp:11
11              std::array<double, 5> a = {0, 1.1, 2.2, 3.3, 4.4};
Missing separate debuginfos, use: debuginfo-install glibc-2.17-4.fc19.i686 libgcc-
4.8.1-1.fc19.i686 libstdc++-4.8.1-1.fc19.i686
(gdb) n
12              std::array<double, 5> b = {5.5, 6.6, 7.7, 8.8, 9.9};
(gdb) 
13              dotprod(a, b); 
(gdb) s
dotprod<5u> (v1=..., v2=...) at a.cpp:7
7               return 0;
(gdb) p v1
$1 = (const std::array<double, 5u> &) @0xbffff640: {_M_elems = {0, 1.1000000000000001, 2.2000000000000002, 
    3.2999999999999998, 4.4000000000000004}}
(gdb)