代码之家  ›  专栏  ›  技术社区  ›  Quentin

使用pdb文件调试时对不存在的对象文件进行VS2017阻塞

  •  4
  • Quentin  · 技术社区  · 7 年前

    我们正在将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的以下错误:

    错误:无法打开文件
    <path>\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中(与2015年相比),但最快在14.11(vs2017 15.3)中出现。

    • 使用 v141_xp ,据我们所知,它使用相同的工具链,但使用较旧的系统库, 作品 .

    2 回复  |  直到 7 年前
        1
  •  4
  •   catnip    6 年前

    要解决此问题,请在生成可执行文件和dll的项目的属性页中进行以下更改:

    配置属性->链接器->调试->生成调试信息-> 生成为共享和发布而优化的调试信息

    Visual Studio Property Page

    静态库没有链接步骤,不需要这样做。.exes和dlls可以。

        2
  •  0
  •   Umakanta Singha    6 年前

    如果不使用其他选项指定/debug,则对于命令行和makefile生成、Visual Studio IDE中的发布版本以及Visual Studio 2015和早期版本中的调试和发布版本,链接器默认为/debug:full。从Visual Studio 2017开始,当您为调试生成指定/debug选项时,IDE中的生成系统默认为/debug:fastlink。其他默认值不变以保持向后兼容性。 资料来源: https://developercommunity.visualstudio.com/content/problem/259283/error-unable-to-open-file-mainobj-error-code-0x800.html