具有 C++ 虚函数时的 GDB 不完整类型

2023-12-14

我刚刚注意到一些奇怪的事情,当我在类中添加“虚拟关键字”(除构造函数之外的任何函数)时,我无法在 GDB 中显示对象的内容。 GDB 说“不完整类型”

这是代码:

////////////////reco.h //////////////

#ifndef RECO_H
#define RECO_H

#include <iostream>
#include <string>

class reco {
    public:
        reco(float weight);
        ~reco(void);

        float getWeight();

    private:
        float weight;
};

#endif

/////////////////reco.cpp //////////////

#include <iostream>
#include <string>

#include "reco.h"

using namespace std;

reco::reco(float weight) {
    weight = weight;
}

reco::~reco(void) {
    cout << "destructor reco" << endl;
}

float reco::getWeight() {
    return weight;
}

////////////// main.cpp //////////////

#include <iostream>
#include <string>

#include "reco.h"

using namespace std;


int main() {
    reco* s = new reco(5.0);
    cout << s->getWeight() << endl;

    delete s;

    return 0;
}

然后使用GDB:

gdb main.exe
breakpoint main.cpp:11 <---- (cout)
run
print *s
$1 = { weight = 5 }

然后,如果我将其中一个函数设为“虚拟”,然后我重新尝试打印我的*sGDB 的指针,它说: “不完整类型”

看起来 VTABLE 发生了一些事情,就好像“virtual”关键字隐藏了我的 Reco 类的实现。我知道编译器会进行后期绑定,然后 VTABLE 查找是在运行时完成的,但是当 GDB 调试它时程序已经在运行,对吗?

将“set print vtbl”设置为“on”。

如果我使用ptype s,我得到<incomplete type>再次留言。

如果我检查地址x/540f80,它说“无法访问内存”

我不知道为什么仅仅添加这个关键字就会使我的对象的类型不完整?

非常感谢你的帮助 !

我注意到的最后一件事:

虚拟:

 reco.cpp -> g0 and main.cpp -> g = incomplete type
 reco.cpp -> g and main.cpp ->g = ok

没有虚拟

 reco.cpp -> g0 and main.cpp -> g = ok
 reco.cpp -> g and main.cpp ->g = ok

reco.cpp -> g and main.cpp ->g = ok

假设由-> g你的意思是你编译reco.cpp-g旗帜,是的do那个,和don't做这个:

g++ -c -g0 reco.cpp

您发现 GCC 可以优化它必须发出的调试信息量if它知道你有一个关键方法.

Without virtual,没有关键方法,GCC必须发出多余的调试信息到every编译单位。这会使您的目标文件更大(它对最终的可执行文件影响很小或没有影响),但即使只有部分目标文件使用调试信息进行编译,您也可以进行调试。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

具有 C++ 虚函数时的 GDB 不完整类型 的相关文章

  • 调用 McAfee 病毒扫描引擎

    我收到客户的请求 要求使用他们服务器上的 McAfee 病毒扫描将病毒扫描集成到应用程序中 我做了一些调查 发现 McScan32 dll 是主要的扫描引擎 它导出各种看起来有用的函数 我还发现提到了 McAfee Scan Engine
  • 在 xaml 中编写嵌套类型时出现设计时错误

    我创建了一个用户控件 它接受枚举类型并将该枚举的值分配给该用户控件中的 ComboBox 控件 很简单 我在数据模板中使用此用户控件 当出现嵌套类型时 问题就来了 我使用这个符号来指定 EnumType x Type myNamespace
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • 传递给函数时多维数组的指针类型是什么? [复制]

    这个问题在这里已经有答案了 我在大学课堂上学习了 C 语言和指针 除了多维数组和指针之间的相似性之外 我认为我已经很好地掌握了这个概念 我认为由于所有数组 甚至多维 都存储在连续内存中 因此您可以安全地将其转换为int 假设给定的数组是in
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • 需要帮助优化算法 - 两百万以下所有素数的总和

    我正在尝试做一个欧拉计划 http projecteuler net问题 我正在寻找 2 000 000 以下所有素数的总和 这就是我所拥有的 int main int argc char argv unsigned long int su
  • 访问外部窗口句柄

    我当前正在处理的程序有问题 这是由于 vista Windows 7 中增强的安全性引起的 特别是 UIPI 它阻止完整性级别较低的窗口与较高完整性级别的窗口 对话 就我而言 我想告诉具有高完整性级别的窗口进入我们的应用程序 它在 XP 或
  • 方程“a + bx = c + dy”的积分解

    在等式中a bx c dy 所有变量都是整数 a b c and d是已知的 我如何找到整体解决方案x and y 如果我的想法是正确的 将会有无限多个解 由最小公倍数分隔b and d 但我只需要一个解决方案 我可以计算其余的 这是一个例
  • IntelliJ - 调试模式 - 在程序内存中搜索文本

    我正在与无证的第三方库合作 我知道有一定的String存储在库深处的某个字段中的某处 我可以预测的动态值 但我想从库的 API 中获取它 有没有一种方法可以通过以下方式进行搜索 类似于全文搜索 full程序内存处于调试模式并在某个断点处停止
  • 为什么这个字符串用AesCryptoServiceProvider第二次解密时不相等?

    我在 C VS2012 NET 4 5 中的文本加密和解密方面遇到问题 具体来说 当我加密并随后解密字符串时 输出与输入不同 然而 奇怪的是 如果我复制加密的输出并将其硬编码为字符串文字 解密就会起作用 以下代码示例说明了该问题 我究竟做错
  • 如何定义一个可结构化绑定的对象的概念?

    我想定义一个concept可以检测类型是否T can be 结构化绑定 or not template
  • 为什么 C# 2.0 之后没有 ISO 或 ECMA 标准化?

    我已经开始学习 C 并正在寻找标准规范 但发现大于 2 0 的 C 版本并未由 ISO 或 ECMA 标准化 或者是我从 Wikipedia 收集到的 这有什么原因吗 因为编写 审查 验证 发布 处理反馈 修订 重新发布等复杂的规范文档需要
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • 复制目录下所有文件

    如何将一个目录中的所有内容复制到另一个目录而不循环遍历每个文件 你不能 两者都不Directory http msdn microsoft com en us library system io directory aspx nor Dir
  • C 函数 time() 如何处理秒的小数部分?

    The time 函数将返回自 1970 年以来的秒数 我想知道它如何对返回的秒数进行舍入 例如 对于100 4s 它会返回100还是101 有明确的定义吗 ISO C标准没有说太多 它只说time 回报 该实现对当前日历时间的最佳近似 结
  • 在OpenGL中,我可以在坐标(5, 5)处精确地绘制一个像素吗?

    我所说的 5 5 正是指第五行第五列 我发现使用屏幕坐标来绘制东西非常困难 OpenGL 中的所有坐标都是相对的 通常范围从 1 0 到 1 0 为什么阻止程序员使用屏幕坐标 窗口坐标如此严重 最简单的方法可能是通过以下方式设置投影以匹配渲
  • 类型或命名空间“MyNamespace”不存在等

    我有通常的类型或命名空间名称不存在错误 除了我引用了程序集 using 语句没有显示为不正确 并且我引用的类是公共的 事实上 我在不同的解决方案中引用并使用相同的程序集来执行相同的操作 并且效果很好 顺便说一句 这是VS2010 有人有什么
  • 使用 WGL 创建现代 OpenGL 上下文?

    我正在尝试使用 Windows 函数创建 OpenGL 上下文 现代版本 基本上代码就是 创建窗口类 注册班级 创建一个窗口 choose PIXELFORMATDESCRIPTOR并设置它 创建旧版 OpenGL 上下文 使上下文成为当前

随机推荐

  • “{Binding Path=.}”和“{Binding}”真的相等吗

    在我的 WPF 项目中 我有一个列表框 用于显示来自List
  • 无法移出 Rust 中借用的内容

    pub struct Character name String hp i32 level i32 xp i32 xp needed i32 gold i32 impl Character pub fn new name String gt
  • 使用 Azure Powershell 或 Azure CLI 创建 Log Analytics 警报

    我正在尝试在 azure 门户的 LogAnlytics 中创建警报 需要为 5 个数据库创建 6 个警报 因此必须手动创建 30 个警报 并且非常耗时 因此需要一种自动化方法 尝试通过创建使用 Azure PowerShell 创建警报
  • 在批处理作业中创建文件名作为时间戳

    我们有一个每天运行的批处理作业 并将文件复制到拾取文件夹 我还想获取该文件的副本并将其放入具有文件名的存档文件夹中 yyyy MM dd log 在 Windows 批处理作业中执行此操作的最简单方法是什么 我基本上是在寻找与此 Unix
  • 检测 HTML5 Video 元素是否正在播放 [重复]

    这个问题在这里已经有答案了 我浏览了几个问题来了解 HTML5 元素是否正在播放 但找不到答案 我查看了 W3 文档 它有一个名为 playing 的事件 但我似乎无法让它工作 这是我当前的代码 var stream document ge
  • Mockito 通过,但代码覆盖率仍然较低

    package com fitaxis test import java sql SQLException import org junit Assert import org junit Test import org mockito M
  • 在 Vue 项目中创建和操作 SVG

    我是 Vue js 新手 需要创建一个 Vue 组件来创建和操作 SVG 根据我的理解 在 Vue 组件中使用 JQuery 并不是最好的选择 不过我愿意 因为选择元素非常简单 这是我的 Vue 组件 但我不确定如何使其发挥作用 注意 SV
  • 如何通过jquery将点击更改为鼠标悬停或悬停?

    我想在鼠标悬停或悬停时显示日期 现在是 onclick 我已经使用工具提示来显示数据 但我想在鼠标悬停时显示数据 我尝试了很多但没有成功 任何机构都可以提供帮助 我们将不胜感激 提前致谢 这是我的代码 它想在单击鼠标悬停 悬停时进行更改
  • 按修改日期排序该数组?

    我有一个 php 文件 它在我的用户目录中创建一个包含所有内容的数组 然后该数组被发送回 iPhone 我的 php 创建的数组按字母顺序排序 我希望它按文件创建日期排序 这是我的 php 文件的样子 我该怎么做 谢谢 Using usor
  • 将泛型集合 List<> 绑定到属性网格

    我尝试绑定通用集合列表联系方式 to propGrid但输出与我的预期不符 我想列表联系方式显示为ListBox in propGrid 我该怎么做 谢谢 class Contact public string Name get set p
  • 如何获取执行查询的表名? (蟒蛇/sqlite)

    我正在运行一个简单的查询并将结果转换为 json 我想动态地执行此操作 以便我可以使用一个函数来处理所有查询 query INSERT INTO Tests name start end VALUES params name start e
  • 如何使用项目的哈希值检查 HashSet 是否包含该项目?

    我想检查 HashSet 是否包含特定元素 我已经有了int元素的哈希码 但不是对元素本身的引用 是否可以在不迭代整个集合的情况下做到这一点 没有为什么 哈希码与对象之间没有一对一的映射 鸽子原理 Net HashSet Dictionar
  • 嵌套并行和折叠 for 循环之间有区别吗?

    我知道启用嵌套并行性将允许嵌套 omp 并行 for 循环也被并行化 但我在嵌套的 for 循环 for 内部 中使用塌陷 2 有区别吗 为什么或者为什么不 假设最好的情况 循环索引之间没有依赖性并且其他条件相同 是的 有很大的区别 使用c
  • Asp.net Core azure Web 应用程序日志记录

    我有一个 asp net core 部署到 azure 我正在尝试使用以下命令配置日志记录到我的应用程序Microsoft Extentions Logging接口 目前我的应用程序正在将日志写入网络应用程序存储中的日志文件文件夹 这似乎是
  • 如何为 React 路由设置 apache 服务器?

    我的 React 应用程序在本地开发服务器上运行良好 但当我将生产就绪文件直接转储到 Apache 的 htdocs 目录时 它不起作用 这是我所拥有的 var www index html var www bundle js 我有 Doc
  • 如何使用 Zend 2 保存处理程序 DbTableGateway?

    The Zend Session 保存处理程序本教程提供了 DbTableGateway 的示例 其中使用未定义的 adapter 变量创建 TableGateway 我想使用处理程序来绑定会话管理器 来自教程的上一页 到我的数据库中的会话
  • 默认情况下使用多个字段进行多重搜索

    所以 有一个 jqGrid 带有声明 如下所示 grid jqGrid bunch of stuff searchGrid multipleSearch true 这很好 当我单击 搜索 按钮时 它会为我带来模式形式 我猜是第一列和 sop
  • 执行 C# 交互式 powershell 脚本

    假设我使用 C 执行 powershell 脚本 脚本执行的结果是请求凭据才能继续 Example Pipeline pipeline runspace CreatePipeline pipeline Commands AddScript
  • 如何在 WXP(和更新的 MSWindows)上使用 C# 终止所有[大]子进程

    问题 如何确定子进程中的所有进程流程树杀掉他们 我有一个用 C 编写的应用程序 它将 从服务器获取一组数据 生成第 3 方实用程序来处理数据 然后 将结果返回给服务器 这工作正常 但由于跑步消耗a lotCPU 和may需要长达一个小时 我
  • 具有 C++ 虚函数时的 GDB 不完整类型

    我刚刚注意到一些奇怪的事情 当我在类中添加 虚拟关键字 除构造函数之外的任何函数 时 我无法在 GDB 中显示对象的内容 GDB 说 不完整类型 这是代码 reco h ifndef RECO H define RECO H include