VS2017 блокирует несуществующие объектные файлы при отладке с помощью файла pdb - PullRequest
0 голосов
/ 23 мая 2018

Мы находимся в процессе переключения проектов 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
  • Отключениесборка при запуске через менеджер конфигурации (чтобы он не воссоздает их)
  • Запуск сеанса отладки

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

Ошибка: невозможно открыть файл
\ 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, что, насколько мы можем судитьиспользует тот же набор инструментов, но более старые системные библиотеки, работает .

Ответы [ 2 ]

0 голосов
/ 07 августа 2019

Когда вы указываете / DEBUG без дополнительных параметров, компоновщик по умолчанию равен / DEBUG: FULL для сборок командной строки и сборок сборки, для сборок выпусков в Visual Studio IDE, а также для сборок отладки и выпусков в Visual Studio 2015 и более ранних версияхверсии.Начиная с Visual Studio 2017, система сборки в IDE по умолчанию имеет значение / DEBUG: FASTLINK, когда вы указываете параметр / DEBUG для отладочных сборок.Другие значения по умолчанию неизменны для обеспечения обратной совместимости.Источник: https://developercommunity.visualstudio.com/content/problem/259283/error-unable-to-open-file-mainobj-error-code-0x800.html

0 голосов
/ 24 мая 2018

Чтобы это исправить, внесите следующие изменения в страницы свойств проектов, в которых строятся ваши исполняемые файлы и библиотеки DLL:

Свойства конфигурации -> Компоновщик -> Отладка ->Создать отладочную информацию -> Создать отладочную информацию, оптимизированную для совместного использования и публикации

Visual Studio Property Page

Статические библиотеки, не имеющие шага ссылки, неэто не нужно.EXE и DLL делают.

...