Просмотр pimpl из DLL в отладчике

Я использую идиому 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 в заголовки, включенные в отладочные версии библиотеки. Надеясь на лучшее решение.

2 ответа

Эта проблема, кажется, появляется, если вы пытаетесь посмотреть на pimpl, который реализован в другой DLL, чем та, которую вы в настоящее время отлаживаете. Обходной путь состоит в том, чтобы добавить наблюдение за значением, где вы «приводите» его к правильной DLL, т. Е. (DllThatContainsTheImpl.dll!object::impl*)myinstance.pimpl.

Я не мог повторить это с этой настройкой:

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. Я установил точку останова на return 0 и увидел, что член имеет значение "a".

Единственное, что я могу подумать, что может отсутствовать в вашей настройке, это исходные файлы для отладчика. Возможно, он может загрузить вашу базу данных отладки, но на самом деле не находит файлы, в которых вы определили, какова ваша частная реализация. Посмотрите здесь для более подробной информации об этом.

Другие вопросы по тегам