Просмотр 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".
Единственное, что я могу подумать, что может отсутствовать в вашей настройке, это исходные файлы для отладчика. Возможно, он может загрузить вашу базу данных отладки, но на самом деле не находит файлы, в которых вы определили, какова ваша частная реализация. Посмотрите здесь для более подробной информации об этом.