VS2017 блокирует несуществующие объектные файлы при отладке с помощью файла pdb

Мы находимся в процессе переключения проектов Visual C ++ на набор инструментов vc141 (VS 2017). Мы столкнулись с проблемой, когда Visual Studio не может использовать файл .pdb, источник которого .obj файлы больше не существуют (например, потому что они были скомпилированы на сервере сборки).

Давайте возьмем очень простой исполняемый проект:

#include <iostream>

int main() {
    std::cout << "Hello world\n";
    std::cin.ignore();
}

Файл .vcxproj используется по умолчанию, кроме <GenerateDebugInformation>true</GenerateDebugInformation> для создания файла pdb.

Шаги воспроизведения, всегда с использованием VS2017:

  • Компиляция проекта
  • Размещение точки останова внутри main
  • Удаление промежуточного каталога Debug/, содержащего .obj files
  • Отключение сборки при запуске через менеджер конфигурации (чтобы он не создавал их заново)
  • Начало сеанса отладки

Это прекрасно работает с цепочкой инструментов vc100 (VS 2010), и точка останова работает, но она немедленно вызывает следующую ошибку с vc141:

  

Ошибка: невозможно открыть файл
  & Lt; & путь GT; \ Debug \ main.obj. Код ошибки = 0x80070003.

Этот очень общий код ошибки действительно соответствует FACILITY_WIN32/ERROR_PATH_NOT_FOUND. Путь к main.obj можно найти в обеих версиях .pdb, поэтому нам неясно, почему VS внезапно выходит из строя, когда не находит его.

Представление «Модули» показывает, что файл .pdb загружен правильно. Кроме того, во всплывающей подсказке точки останова отображается следующая ошибка:

  

Точка останова в настоящее время не будет достигнута. Неожиданная ошибка чтения символов при обработке MyUser_141.exe.

Что может быть решением или обходным путем для этой проблемы, учитывая, что мы не можем отлаживать на машине, которая компилирует двоичные файлы в нашем приложении реального случая?

Вот полный файл .vcxproj:

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup Label="ProjectConfigurations">
    <ProjectConfiguration Include="Debug|Win32">
      <Configuration>Debug</Configuration>
      <Platform>Win32</Platform>
    </ProjectConfiguration>
  </ItemGroup>
  <PropertyGroup Label="Globals">
    <VCProjectVersion>15.0</VCProjectVersion>
    <RootNamespace>MyUser_141</RootNamespace>
    <WindowsTargetPlatformVersion>10.0.17134.0</WindowsTargetPlatformVersion>
    <ProjectGuid>{90982029-29B8-4C9B-AFB7-B8F555F15C1E}</ProjectGuid>
  </PropertyGroup>
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
    <ConfigurationType>Application</ConfigurationType>
    <UseDebugLibraries>true</UseDebugLibraries>
    <PlatformToolset>v141</PlatformToolset>
    <CharacterSet>MultiByte</CharacterSet>
  </PropertyGroup>
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
  <ImportGroup Label="ExtensionSettings">
  </ImportGroup>
  <ImportGroup Label="Shared">
  </ImportGroup>
  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
  </ImportGroup>
  <PropertyGroup Label="UserMacros" />
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
    <Link>
      <GenerateDebugInformation>true</GenerateDebugInformation>
    </Link>
  </ItemDefinitionGroup>
  <ItemGroup>
    <ClCompile Include="main.cpp" />
  </ItemGroup>
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
  <ImportGroup Label="ExtensionTargets">
  </ImportGroup>
</Project>

Дальнейшие исследования:

  • Мы пробовали другие версии набора инструментов. Ошибка отсутствует в v14.0 (VS 2015), но присутствует, как только 14.11 (VS2017 15.3).

  • Использование v141_xp, которое, насколько мы можем судить, использует тот же набор инструментов, но более старые системные библиотеки, работает .

4 голоса | спросил Quentin 23 Maypm18 2018, 16:11:23

1 ответ


0
Чтобы это исправить, внесите следующие изменения в страницы свойств проектов, в которых собраны исполняемые файлы и библиотеки DLL:Свойства конфигурации -> Компоновщик -> Отладка -> Создать отладочную информацию Создать отладочную информацию, оптимизированную для совместного использования и публикацииСтраница свойств Visual StudioСтатические библиотеки, не имеющие шага ссылки, не нуждаются в этом.DLL делают.
ответил Paul Sanders 24 Mayam18 2018, 11:36:24

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132