gpt4 book ai didi

c++ - 无法为 dynamic_cast 确定值的最派生类型

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:27:38 24 4
gpt4 key购买 nike

最近在做gdb7的python扩展,只是想用它写一个小工具,在调试的时候友好的显示C++容器(比如list)的内容,但是在处理list的时候遇到了麻烦。这是我用于测试的 C++ 代码:

int main() {
list<int> int_lst;
for (int i = 0; i < 10; ++i)
int_lst.push_back(i);

for(list<int>::const_iterator citer = int_lst.begin();
citer != int_lst.end(); ++citer)
cout << *citer << " ";
cout << endl;

return 0;
}

我按照“使用 gdb 调试”教程编写了一个小的 python 代码,只是尝试显示 int_lst 的内容

import gdb
class Hello(gdb.Command):

def __init__(self):
super(Hello, self).__init__("plist", gdb.COMMAND_OBSCURE)

def invoke(self, arg, from_tty):
cpp_lst = gdb.parse_and_eval("int_lst")
header = cpp_lst['_M_impl']['_M_node']
next = header['_M_next']
# next is _List_node_base, I have to cast it to its derived type for data
next.dynamic_cast(gdb.lookup_type("std::_List_node<``int>").pointer())
Hello()

在 C++ STL 中,std::_List_node_base 是列表中节点的基类,但是只有派生模板类 std::_List_node 具有包含值的数据成员“_M_data”,所以我必须对其进行 dynamic_cast,但是gdb 提示:

Error occurred in Python command: Couldn't determine value's most derived type for dynamic_cast

我已经花了几个小时解决这个问题,有经验的人能给我一些关于这个问题的提示,或者对我完成这个小工具有什么建议吗?非常感谢您的帮助,谢谢!

最佳答案

如果没有更多信息,很难说出了什么问题。

GDB 正在尝试使用 RTTI 信息来查找该字段的完整对象。这在某种程度上是失败的。您可以尝试使用“set print object on”从 CLI 重现该问题,然后打印有问题的字段。

或者,您想使用 dynamic_cast 有什么特别的原因吗?只需使用普通的“cast”方法即可。我认为这将绕过这些检查。

请注意,对于这种特定情况,您可能应该只选择现有的 libstdc++ pretty-print 。它们与 gdb 中现有的“打印”命令集成,并且已经处理了 libstdc++ 中的每个复杂数据结构。许多发行版以一种在您的程序使用 libstdc++ 时自动启用它的方式提供所有这些代码。

关于c++ - 无法为 dynamic_cast 确定值的最派生类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16737496/

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