为什么我无法调试?

Why can't I debug?

提问人:MainID 提问时间:2/12/2009 最后编辑:Steve RoweMainID 更新时间:7/4/2013 访问量:68553

问:

当我准备在VS2005中调试C++程序时,程序并没有停在 断点。

VS 说:“任何调用堆栈帧都不会加载任何符号。源代码无法显示”。

我能做些什么?

Visual-Studio 调试 visual-studio-2005

评论

0赞 Steve Rowe 2/12/2009
您正在调试 exe 还是 dll?
0赞 Liviu 9/8/2014
它发生在我不小心杀死“mspdbsrv.exe”之后。杀死 devenv.exe 的子级是我有时用来停止 monstruos 构建的一种方法,当“取消构建”无响应时。
1赞 Erdinc Ay 4/22/2015
尝试找出另一个实例(例如应用程序的发布版本)是否在后台运行!

答:

1赞 jpoh 2/12/2009 #1

这听起来像是附加到一个进程,而不是运行一个传统的调试会话?如果确实要附加到进程,请务必确保尝试调试的二进制文件是使用当前在 IDE 中打开的相同源代码生成的。

评论

0赞 Steve Rowe 2/12/2009
错误的源代码仍然应该中断,只是在源代码中的奇怪位置。如果没有中断,则可能是符号问题,而不是源代码问题。
0赞 2/12/2009
如果源代码与源代码不相同,它不会中断(我自己也注意到了这种行为)
3赞 Steve Rowe 2/12/2009 #2

无论出于何种原因,符号路径中没有正确的符号(.pdb 文件)。这可能有几个原因:

1) 二进制文件的编译时间比 .pdb 文件更新。尝试重新编译所有内容。

2)您正在尝试调试.dll,但忘记复制.pdb文件。也复制这些文件。

也有可能你的代码没有像你想象的那样被执行。

1赞 annakata 2/12/2009 #3

完全清理和重建,确保创建 .pdb?

4赞 Steve Rowe 2/12/2009 #4

尝试几个步骤:

  1. 调试->单步执行(这将确保在启动后立即停止)
  2. 调试 >Windows->模块
  3. 在列表中查找您的 foo.exe。
  4. 检查符号状态。它说它已加载吗?
  5. 如果没有,请转到路径并确保: a) 那里有一个名为 foo.pdb 的文件 b) foo.pdb 上的时间戳与 foo.exe 匹配(或非常接近)

评论

0赞 MainID 2/14/2009
@Steve:Debug目录下没有*.pdb。
0赞 Steve Rowe 2/14/2009
这就是你问题的根源。它可能是在某个地方生成的。去找它,把它放在正确的位置。
0赞 Stephen Curial 2/14/2009 #5

我在尝试调试单元测试时遇到了这个问题(在 VS 中使用 c#)。

可以添加以下代码,这些代码将启动调试器的新实例,使你能够像往常一样单步执行代码:

System.Diagnostics.Debugger.Launch();
System.Diagnostics.Debugger.Break();

评论

0赞 MainID 2/14/2009
但是我正在调试一个 C++ 程序,有帮助吗?
0赞 Stephen Curial 2/14/2009
是的,你可以在 C++ 中使用它。以下是 MSDN 上的文档:msdn.microsoft.com/en-us/library/...
20赞 MainID 2/14/2009 #6

谢谢大家。

最后,我在这里找到了解决方案。

要启用调试,请执行以下操作:

1) 转到 Project->HelloWorld 属性

2) 在左侧展开“配置属性”

3) 扩展“C/C++”

4) 在左侧,选择“常规”

5) 在右侧,将“调试信息格式”更改为“Program Database For Edit And Continue (/ZI)”

5)在左侧,选择“优化”

6) 在右侧,将“优化”更改为“禁用 (/Od)”

7) 在左侧,展开“链接器”

8) 在左侧,选择“调试”

9) 在右侧,将“生成调试信息”更改为“是”

10) 单击确定

11) 设置断点

12) 重新构建应用程序

此外,在运行应用程序时,请使用 Ctrl+F5 生成并运行它,这将使控制台窗口保持打开足够长的时间,以便你能够看到输出。

评论

1赞 Steve Rowe 2/14/2009
您可能希望将它们放在此处的帖子中,以防该链接移动。
0赞 John 10/19/2011
我一直在尝试这个,/ZI 与 /clr 和 /clr:pure 不兼容。因此,对于基于WinForms或.NET的应用程序没有好处。
0赞 mort 8/2/2012 #7

只是为了添加 MainID 尚未涵盖的另一种可能性:

调试时,我实际上启动了一些程序,这些程序会调用我想要调试的类(它是某种附加组件)。被调用的程序部分是用非托管 C++ 编写的。当我选中“启用非托管代码调试”时,会出现错误(随后程序崩溃),因为程序没有任何调试信息。

0赞 creativemujahid 7/4/2013 #8

我通过这样做在WP7中解决了这个问题:

  1. 右键单击“解决方案资源管理器”(Ctrl+W+S)
  2. 选择“重新生成”。
  3. 再次选择项目,右键单击它,然后选择 Deploy。
  4. 开始调试 (F5)

希望对您有所帮助!