在调试器中查看 DLL 中的 pimpl

2024-01-05

我使用 pimpl 习惯用法来隐藏接口的实现细节,以便我可以采取某种 ABI 保护措施。我不太熟悉 MS 的来龙去脉……我的大部分开发生涯都使用 Linux。

我无法从调试器检查窗口查看 pimpl 的内部。我的类型仅扩展至 impl 的原始指针(它使用智能指针)。我尝试过导出符号,但这似乎不起作用。我想我实际上想要查看的符号没有被导入或其他什么。

我该如何补救?可视化工具可以调用函数吗?

编辑——也许我把人们与导出的事情混淆了。

我正在尝试这个:

对象.h:

struct EXPORT object {
    struct EXPORT impl;
    impl * pimpl;
};

对象.cpp

struct EXPORT object::impl {
    char member;
};

我认为解决该问题的唯一方法是将 impl 放入库的调试版本中包含的标头中。希望有更好的解决方案。


我无法使用此设置复制它:

CMakeLists.txt

cmake_minimum_required(VERSION 3.8.0)

project(test)
set(DLL_SRCS thing.cpp)
set(DLL_HDRS thing.h)
add_library(Thing SHARED ${DLL_SRCS} ${DLL_HDRS})

set(Headers_dir ${CMAKE_CURRENT_BINARY_DIR}/dll_public_headers)
configure_file(${DLL_HDRS} ${Headers_dir} COPYONLY)

set(APP_SRCS main.cpp)

add_executable(App ${APP_SRCS})

target_link_libraries(APP Thing)
include_directories(${Headers_dir})

thing.h

#pragma once

struct thing
{
private:
  struct Private;
public:
  thing();
  Private * impl
};

东西.cpp

#include "thing.h"

struct thing::Private
{
  char member;
}

thing::thing()
{
  impl = new Private;
  impl->member = 'a';
}

main.cpp

#include "thing.h"

int main(int argc, char * argv[])
{
  thing thing_from_dll;
  return 0;
}

如果您无法正常工作,我建议您提供类似的mcve https://stackoverflow.com/help/mcve。我对此不太敏感,所以别担心。我还是会帮你的。

这在 Visual Studio 2017 上有效。我在 return 0 上放置了一个断点,可以看到该成员的值为“a”。

我认为您的设置中可能缺少的唯一内容是调试器的源文件。也许它可以加载您的调试数据库,但实际上找不到您定义私有实现的文件。看here https://learn.microsoft.com/en-us/visualstudio/debugger/specify-symbol-dot-pdb-and-source-files-in-the-visual-studio-debugger?view=vs-2019了解更多详情。

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

在调试器中查看 DLL 中的 pimpl 的相关文章

随机推荐

  • 如何让 jQueryUI 对话框动态加载内容

    我喜欢 jQueryUI 的对话框 但是 似乎没有一种方法可以动态加载内置内容 我想我必须使用其他方法来实现这一目标 iframe 仅在可见时才加载内容吗 这是正确的方法吗 如果其他对话框机制更适合仅在首次打开时加载内容 我愿意接受 这并不
  • 将 PySpark 数组列乘以标量

    我正在尝试将数组类型列乘以标量 该标量也是来自同一 PySpark 数据帧的值 例如 我有这个数据框 df sc parallelize 1 2 3 toDF l factor l factor 1 2 3 我想要实现的是 l factor
  • XMonad:有没有办法绑定同时触发的键和弦?

    Is there a way to make simultaneous key presses into a keybinding e g for the keys w e f when pressed within 0 05 second
  • 检测 CKEditor 5 中文本何时发生更改并且编辑器失去焦点

    我正在尝试在 CKEditor 5 中实现自动保存功能 只有在进行更改且编辑器失去焦点后才会进行保存 我怎么能这样做呢 该文档让我非常困惑 这是我得到的最接近的 function onChange el editor editor docu
  • 如何隐藏 dired 中的链接数量?

    99 9 的情况下 我并不关心有多少链接指向一个文件 如何让 dired 或者 ls 不显示链接数量 作为参考 ls l 的输出类似于 rw rw rw 1 root dir 104 Dec 25 19 32 file 在本例中 链接数为
  • PL/SQL 触发器从一张表上的 INSERT 更新另一张表

    我正在使用 SQL 和 Oracle 数据库 需要一些帮助 触发器是我很难理解的东西 当我向表 A 中插入一行时 我需要一个触发器 以便它更新表 B 上的行 特别是其主键与刚刚添加到表 A 的行的相应外键匹配的行 例如 表 A 中的 X 列
  • Carrierwave、雾、Amazon S3、Rails 4

    我正在尝试让 Carrierwave 与我的 Amazon S3 存储桶配合使用 但我的运气有点差 在我的config initializers文件夹 我有一个名为 carrierwave rb 该文件包含以下内容 CarrierWave
  • AngularJS 智能感知不适用于 Visual Studio 2015

    根据这个post http blogs msdn com b visualstudio archive 2015 02 05 using angularjs in visual studio 2013 aspxintellisense 也应
  • 如何将库安装到 Azure Web App 上的“antenv”venv?

    我正在尝试使用 FTP 将 Flask 应用程序部署到 Azure Web 应用程序 Linux python3 7 运行时 我复制了 application py 和 requirements txt 但我可以在日志中看到没有安装任何内容
  • SharedPreferences.getStringSet() 未找到?

    我对 SharedPreference 有一些不明白的地方 In 这个文件 http developer android com reference android content SharedPreferences html它说 API
  • 使用带有 lxml 前缀的 fromstring()

    我有一个变量 ele 我试图将一个子节点附加到 ele 上 该节点的标签中包含名称空间前缀 称为 style ele 似乎知道这个前缀 如以下行 print ele nsmap style outputs urn oasis names t
  • 在哪里可以找到 SimpleITK 文档和参考信息?

    我有兴趣尝试使用 SimpleITK 来解决我的成像问题 您能告诉我文档和培训材料在哪里吗 SimpleITK 已记录here http www itk org SimpleITKDoxygen html annotated html 并且
  • JavaScript 正则表达式 URL 仅提取域

    目前我可以使用以下正则表达式从任何 URL 中提取 域 https n www n im 不过 我也得到了我想避免的子域名 例如 如果我有网站 www google com yahoo com 某事 freds meatmarket co
  • 为什么“sail up”命令没有构建我的 laravel docker 容器?

    我正在尝试 Laravel Sail 因为我已经成功使用 Laradock 几年了 并希望简化我的开发环境设置 我使用的是 Windows 10 64 使用 WSL 2 安装了 Docker Desktop 3 0 并且我的 Laravel
  • 如何在刷新后让用户保持登录到 Firebase 应用程序?

    我有一个内置于 firebase 和 Angular 的应用程序 并且希望能够在刷新页面后保持用户登录 现在我有一个登录屏幕 其中有两个绑定到控制器的基本输入字段 this email this pass this emessage thi
  • Spring Security有Ip地址问题

    我在控制器中有一个使用以下配置的方法 RequestMapping value encore userName token method RequestMethod GET ResponseBody PreAuthorize hasIpAd
  • 使用新的 Google Jetpack 组件的最低 Android API 级别是多少

    我已经开始学习 RxJava 我知道有一些新的 Google 组件 如 LiveData 数据绑定等 我想知道使用它们的最低 Android API 级别是多少 我可以在 21 或 23 等较旧的 API 中利用它们吗 直接从文档中http
  • 无法使用 EPPlus 删除工作表

    我正在使用这段代码 ExcelPackage pck new ExcelPackage newFile var wk pck Workbook Worksheets SingleOrDefault x gt x Name Content p
  • jquery validate 添加方法来验证日期时间

    我正在使用我找到的日期时间选择器插件here http trentrichardson com examples timepicker 效果很好 现在唯一的问题是它破坏了包含的标准日期验证jquery 验证插件 http docs jque
  • 在调试器中查看 DLL 中的 pimpl

    我使用 pimpl 习惯用法来隐藏接口的实现细节 以便我可以采取某种 ABI 保护措施 我不太熟悉 MS 的来龙去脉 我的大部分开发生涯都使用 Linux 我无法从调试器检查窗口查看 pimpl 的内部 我的类型仅扩展至 impl 的原始指