10

我正在使用 pimpl 习惯用法来隐藏接口的实现细节,这样我就可以对 ABI 进行一定程度的保护。我对 MS 的来龙去脉不是很精通……在我的大部分开发生涯中都使用 Linux。

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

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

编辑——也许我把人们和出口的事情搞混了。

我正在尝试这个:

对象.h:

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

对象.cpp

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

我能想到解决问题的唯一方法是将 impl 放在库的调试版本中包含的标头中。希望有更好的解决方案。

4

2 回答 2

0

如果您尝试查看在与当前正在调试的 DLL 不同的 DLL 中实现的 pimpl,则似乎会弹出此问题。一种解决方法是在值上添加一个监视,在其中将其“强制转换”到正确的 DLL,即(DllThatContainsTheImpl.dll!object::impl*)myinstance.pimpl.

于 2021-09-27T07:22:17.157 回答
0

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

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})

东西.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';
}

主文件

#include "thing.h"

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

如果你不能让它工作,我会敦促你提供一个类似的mcve。我对这个没那么敏感,所以别担心。我还是会帮你的。

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

我认为您的设置中唯一可能缺少的是调试器的源文件。也许它可以加载您的调试数据库,但实际上并没有找到您定义私有实现的文件。在此处查看更多详细信息。

于 2019-04-09T10:03:21.023 回答