在调试器中查看DLL中的pimpl

时间:2013-05-30 18:19:13

标签: c++ visual-studio-2010 dll pimpl-idiom

我正在使用pimpl成语来隐藏接口的实现细节,以便我可以有一些ABI保护措施。我不太了解MS的细节......在我的大部分开发生涯中使用Linux。

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

我该如何解决这个问题?可视化工具可能会调用函数吗?

编辑 - 也许我把人们与出口事物搞混了。

我正在尝试这个:

object.h:

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

object.cpp

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

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

1 个答案:

答案 0 :(得分: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})

thing.h

#pragma once

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

thing.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。我对此不那么感兴趣,所以不用担心。我仍然会帮助您。

这在Visual Studio 2017上有效。我在返回0处设置了一个断点,可以看到该成员的值为'a'。

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