gpt4 book ai didi

c++ - GDB:我们如何从 std::tuple 中提取值

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:34:56 29 4
gpt4 key购买 nike

我们如何提取/打印 std::tuple 中的单个值?

这是名为 test.cc 的文件中的示例程序。

#include <tuple>
#include <iostream>

using namespace std;

int main() {
auto t = make_tuple(111, 222);
cout << std::get<0>(t) << endl
<< std::get<1>(t) << endl;
return 0;
}

编译它

g++ --std=c++11 -g test.cc

在gdb中运行

gdb --args ./a.out
...
(gdb) start
Temporary breakpoint 1 at 0x400836: file test.cc, line 7.
Starting program: /home/fmlheureux/a.out

Temporary breakpoint 1, main () at test.cc:7
7 auto t = make_tuple(111, 222);
(gdb) n
9 << std::get<1>(t) << endl;
(gdb) p t
$1 = std::tuple containing = {[1] = 111, [2] = 222}

最后一条命令打印了整个元组。我怎样才能提取个人值(value)?我天真的尝试失败了。

(gdb) p get<0>(t)
No symbol "get<0>" in current context.
(gdb) p std::get<0>(t)
No symbol "get<0>" in namespace "std".

最佳答案

不幸的是,gdb 中的 pretty-print 代码是一个仅供显示的功能——因此虽然它有助于以一种很好的方式显示元组,但它不允许您进一步访问它。

类似 t.get<0> 的正常问题是这些微小的访问器方法通常被编译器完全优化掉——所以没有拷贝可以调用。而且,虽然 gdb 具有可用于提供这些访问器的 gdb 端 Python 实现的“xmethod”功能,info xmethods显示(至少对我而言)没有人为 std::tuple 这样做过还没有。

那么您几乎只剩下一个选择:检查实现。因此,从打印原始元组开始:

(gdb) p/r t
$3 = {<std::_Tuple_impl<0ul, int, int>> = {<std::_Tuple_impl<1ul, int>> = {<std::_Head_base<1ul, int, false>> = {
_M_head_impl = 222}, <No data fields>}, <std::_Head_base<0ul, int, false>> = {_M_head_impl = 111}, <No data fields>}, <No data fields>}

在这里你可以看到元组的“真实”结构,并直接访问字段:

(gdb) print ((std::_Head_base<1ul, int, false>) t)._M_head_impl
$7 = 222

转换为中间类型有点痛苦,是吗?需要让 gdb 选择正确的 _M_head_impl field 。如果这是你计划做的很多事情,我建议写下 xmethod .或者您也可以轻松地编写一个 Python 便利函数来自动化访问;使用 Python API 可以更简单地进行这种自省(introspection)。

关于c++ - GDB:我们如何从 std::tuple 中提取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38527975/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com