调试信息无法找到或与visual studio不匹配

时间:2010-02-24 00:36:38

标签: c++ c visual-studio visual-studio-2008

我复制了一个现有项目并重命名了该文件夹。现在,当我尝试编译应用程序时,我收到此错误

debugging information cannot be found or does not match. No symbols loaded. 
Do you want to continue debugging ?

如果我单击是,它会编译并运行正常。但现在我必须处理这个消息。只是好奇我在项目属性中改变了什么来让它停下来。

14 个答案:

答案 0 :(得分:64)

您可能已停用项目的调试信息:

  • 右键点击您的项目 - >特性
  • 配置属性 - >链接器 - >调试
  • 将“生成调试信息”从“否”转换为“是”

重建您的项目并重试,它现在应该在没有消息的情况下运行:)

答案 1 :(得分:29)

主要原因是你没有匹配的pdb和exe。

一些可能的解决方案:

  • 您正在编译而不是调试
  • 您需要清理/构建或重建
  • 您没有在与exe
  • 相同的目录中生成pdb文件
  • 你有一个不匹配的pdb,也许复制的源比今天的日期更新,而且某些东西没有正确构建。
  • 尝试清除所有调试对象文件
  • 您附加到从构建exe和pdb存在的其他位置开始的进程
  • 重新启动Visual Studio

答案 2 :(得分:10)

这种情况经常发生在我身上,在调试代码和进行更改时,似乎visual studio缓存了pdb信息,有时它会卡住。执行重建解决方案,删除pdb并创建新解决方案并不能解决问题。

当然,我确实有生成调试信息及其所需的全部内容,特别是因为在调试代码时会发生这种情况。

Visual Studio似乎对内存中的pdb感到满意,并拒绝更新它,无论时间戳或pdb中的大小更改如何。

重置此方法的唯一方法是退出Visual Studio(IDE)并重新启动它。

在极少数情况下,IDE可能仍在后台运行(进程资源管理器在那里显示)并且可能保持文件句柄处于打开状态。您可以在重新启动IDE之前终止该进程。

祝你好运

答案 3 :(得分:7)

我刚刚在VS2012中遇到此错误。它肯定是由Visual Studio中的一个错误引起的,当主项目的本地PDB文件与整个可执行文件的最终PDB文件同名时(即使这两个文件位于不同的目录中!

考虑这个例子。

解决方案包含三个项目:mainabmain是可执行文件的顶级项目,而ab是链接到main的库。

在所有三个项目中$(IntDir)变量都设置为$(SolutionDir)\$(Configuration)\$(ProjectName)\。这意味着项目main将其中间文件转储到Debug\main\,将项目a转储到Debug\a\,依此类推。

C/C++ -> Output Files设置中,所有三个项目的Program Database File Name值设置为$(IntDir)$(TargetName).pdb。这意味着项目main会将其本地PDB文件生成为Debug\main\main.pdb,将b生成为Debug\b\b.pdb,依此类推。

最后,在项目Linker -> Debugging的{​​{1}}设置中,main值设置为Generate Program Database File。这意味着整个可执行文件的全局PDB文件将生成为$(OutDir)$(TargetName).pdb

请注意,在此设置中,每个PDB文件都在其自己的单独目录中生成。

在此设置中,如果尝试在调试器下运行程序,则会出现无法找到调试信息或错误错误。如果您查看Debug\main.pdb文件(将存在),您会注意到它与Debug\main.pdb文件完全相同!即某种程度上,Debug\main\main.pdb的本地PDB设法覆盖了应该是最终可执行文件的全局PDB。即调试者抱怨PDB文件错误"是正确的。这确实是错误的。

同样,在上面的设置中,最终的全局PDB以某种方式被顶级项目的本地PDB覆盖。我不知道为什么会这样。这似乎是一个错误。 (请注意,即使这些PDB文件具有相同的名称,它们也会在不同的目录中生成,即它们不应该冲突。)

解决此问题的解决方法是为项目main的本地PDB指定一个不同的名称。例如,只需转到main项目的C/C++ -> Output Files,然后将main值更改为Program Database File Name(如果您愿意,则更改为$(IntDir)$(TargetName)_local.pdb)。这将消除冲突并解决问题。

答案 4 :(得分:3)

通过以下方式启用PDB创建:

右键点击MyProject > Properties > Debugging

  • C/C++ > General > Debug Information Output = Program Database (/Zi)
  • Linker > Debugging > Generate Debug Info = Yes (/DEBUG)

清理MyProject,重新启动Visual Studio(只是为了确定),重建MyProject。 然后输出文件夹应包含* .pdb文件。

如果您调试优化/发布代码,请考虑通过

关闭优化
  • C++ > Optimization > Optmization = Disabled (/Od)

答案 5 :(得分:2)

我遇到了同样的问题并尝试了上述所有解决方案,但它无法帮助我。 然后我随机找到了一个新的解决方案,它起作用了。

解决方案是,如果您在解决方案中有许多项目,那么您应该将任何一个项目(您必须决定的项目)标记为“设置为启动项目”。 右键单击该特定项目,然后单击“设置为启动项目”。

它对我有用。

答案 6 :(得分:1)

pdb或程序数据库文件似乎缺失(基本上,路径已更改,编译器无法再找到)。有关其他信息,请参阅this相关帖子。

答案 7 :(得分:0)

我遇到了类似的问题,原因是我在不同的流程中运行了我的解决方案中的一个项目,并且该流程无法被杀死。我没想太多。因此,当我在一个单独的环境中构建解决方案时,其中一个pdb文件不匹配,所以最后我无法加载任何pdb文件。我刚刚重新启动计算机并修复了它。

祝你好运

答案 8 :(得分:0)

重新启动Visual Studio可以修复此问题的一个实例。

答案 9 :(得分:0)

在解决方案浏览器中右键单击您的项目=>清洁=>建立。 也就是说,如果您的构建生成一个.pdb(查看目标目录) 如果没有,您应该通过其他帖子中提到的步骤启用调试

答案 10 :(得分:0)

最有可能还有其他原因,例如.pdb / .exe文件不匹配,某些内容未构建/重建,但我在Visual Studio 2013中有类似的情况 -

与虚拟内联功能有关 - 所以我怀疑。

在我的情况下,调试器在另一个C ++函数的中间跳转,而不是被调用的函数。跳过11个源代码行的源代码,但我无法解释为什么会发生多少错误计算。通过简单的重新排列功能,我摆脱了这个问题。

可能需要更详细的分析为什么最初发生11次换班。

Haven在任何其他视觉工作室都没有看到过这种行为。

答案 11 :(得分:0)

这个问题困扰了我很长一段时间。 AnT的anwser非常有帮助。主要思想是没有任何两个pdb文件具有相同名称,即使它们不在同一目录中。

这是我的情况:我有两个项目名称“FooBar”和“FooBarDll”,第一个是exe,第二个是dll。我将两个项目目标名称设置为“FooBar”,以便它们分别生成“FooBar.exe”和“FooBar.dll”。

然后我设置

  1. “常规 - >中间目录”为“$(OutDir)\ $(ProjectName)\”
  2. “C / C ++ - >输出文件 - >程序数据库文件名”为“$(IntDir)$(TargetName).pdb”
  3. “链接器 - >调试 - >生成程序数据库文件”为“$(OutDir)$(TargetName).pdb”
  4. 所以我得到这些文件:

    1. 调试\ FooBar.exe
    2. Debug \ FooBar.pdb // C ++ pdb
    3. Debug \ FooBar \ FooBar.pdb //链接器pdb

    4. 调试\ FooBar.dll

    5. Debug \ FooBar.pdb // C ++ pdb 再次!
    6. Debug \ FooBarDll \ FooBar.pdb // Linker pdb
    7. 我的解决方案是用“ProjectName”替换每个“TargetName”,然后我会得到:

      1. 调试\ FooBar.exe
      2. Debug \ FooBar.pdb // C ++ pdb
      3. Debug \ FooBar \ FooBar.pdb //链接器pdb

      4. 调试\ FooBar.dll

      5. Debug \ FooBarDll.pdb // C ++ pdb
      6. Debug \ FooBarDll \ FooBarDll.pdb // Linker pdb
      7. 然后没有冲突!

        给C / C ++ pdb后缀可能更好,例如:“C / C ++ - >输出文件 - >程序数据库文件名”为“$(IntDir)$(ProjectName)_C.pdb”

答案 12 :(得分:0)

我有同样的问题,这个link帮我解决了这个问题,在VS IDE文件夹中将“symsrv.no”重命名为“symsrv.yes”。

答案 13 :(得分:-1)

好奇,我发现我需要更改文件夹名称:

...\Custom Librarry (MyDll.dll(

...\Custom Librarry (MyDll.dll)

只需关闭它有效的括号!