为什么我的C#调试器跳过断点?

25

我的C#调试器无法正常工作,有时会跳过断点和部分代码行。我已检查了配置管理器,甚至尝试将我的项目添加到新的解决方案文件中。请问有人可以帮我吗?


优化是否被禁用?调试版还是发布版? - Guillaume
如何检查优化?有时候意味着每次使用调试器后,它都会跳过一些行。 - Yasar
我知道这听起来很蠢,但你确定这个方法被添加到调用堆栈中了吗? - Woot4Moo
11个回答

32

我的调试清单:

  • 确保使用正确的代码类型连接到进程 - 如果您的进程同时具有非托管和托管代码,请不要依赖“自动”功能,明确声明您要调试的代码类型
  • 转到模块窗口(调试-> 窗口-> 模块,您可能需要在“自定义...”菜单中启用它)
  • 检查您要调试的程序集是否已加载,并且是否已加载符号 - 如果它们未加载,则右键单击该模块并选择“加载符号”
  • 打开您的代码文件并设置断点 - 如果它显示为带有小警告符号,则查看并确定其内容
  • 您可能需要前往“工具->选项->调试->常规”,取消选中“仅调试我的代码(仅托管)”
  • 如果您认为您的源文件可能略有不同,您还可以取消选中“要求源文件与原始版本完全匹配”,但要注意,这可能会导致您使用完全错误的源代码进行调试,这可能非常令人困惑。

在某些情况下,您可能会发现在附加调试器时没有加载您的模块(例如,如果您具有某种插件体系结构,并且只有在首次使用插件程序集时才会加载插件程序集)。 在这些情况下,您只能尝试确保一切准备就绪,以便在加载模块时使用调试器。


谢谢您提供如此详细的答案。我已经尝试了所有方法,但仍然遇到了同样的问题。 - Yasar
5
禁用“仅限我的代码”对我有用。谢谢。 - Ray
在模块窗口中右键单击一个模块,然后单击“加载符号”。这将显示它试图在我的服务器上查找PDB的位置。一旦我将其复制回我的工作站,符号立即加载。 - northben
您可能希望将“验证您是否实际处于调试模式”添加到此列表中,尽管我从未在这样的问题上浪费过一小时并怀疑自己的整个职业生涯。 - Al Baker
1
@northben“模块”窗口是什么?我在使用VS 2015时没有看到标记为“模块”的东西。 - clamum

13

确保优化功能已禁用(这是调试配置的默认设置,但在发布配置中启用)。编译器优化可能会干扰调试器...


我应该如何调整编译器优化。 - Yasar
如果您使用的是Visual Studio:在“解决方案资源管理器”中右键单击项目,然后选择“生成”选项卡。那里应该有一个名为“优化代码”的复选框。(至少在VS 2005和2008中适用。我不知道早期版本的情况)。 - Odrade

5

你确定编译成功了吗?听起来像是你正在调试之前的版本,这可能是由于构建失败(可能是代码错误,也可能是文件只读)导致的。


我正在编译解决方案中的各个项目,但仍然存在同样的问题。 - Yasar

3

如果整个方法都被跳过了,查看源代码是否存在System.Diagnostics.DebuggerStepThroughAttribute属性。

尽管名称如此,但它会防止调试器逐步执行该方法。


有时候会跳过方法中间的一些部分,有时候会完整执行整个方法。 - Yasar
1
太棒了!当我为一个从XSD生成的类添加自定义方法时,它不想调试时,我以为我疯了。原因是xsd.exe用这个属性装饰了它生成的代码。在F5之前创建的断点有时会被触发,但新的断点并不总是会被触发。 - ajeh

2

这对我在VS 2017中有效,进入工具 > 选项,然后在选项窗口下,转到调试部分。启用 - "启用.NET Framework源代码步进"


1
如果至少有时断点被触发,这意味着所有设置很可能都没问题。
缺失的断点可能是由某些副作用引起的,例如:调试器对属性的评估(至少VS在调试器的属性评估期间跳过断点)或一些监视工具(但这些通常会被调试器捕获)。
如果您认为可能是这种情况,请关闭监视工具并禁用调试器的属性评估disable the property evaluation by the debugger
有时这可能还不够,例如:如果您的属性返回一个集合,显示例如Count()将评估该属性 - 因此还需从监视窗口中删除所有属性引用等。

1

@Justin的回答非常有帮助。我想在列表中添加一件事。

  • 检查是否在调试模式下运行,并确保您的调试偏好设置中未选中“优化代码”。请参见下面:

General run setting Debug SettingsRelease Settings


1

同时确保您要调试的代码在与主可执行文件相同的进程中运行。我浪费了半个小时才弄清楚这一点-断点没有被触发,因为感兴趣的代码已经在子进程中启动,而不是直接调用(所涉及的程序有两种不同的操作模式)。


1

这听起来像是您的源代码与PDB文件不同步。最简单的解决方法是清理解决方案(删除bin文件夹中的所有dll)。重新编译,然后尝试再次调试。

如果仍然失败,请尝试关闭解决方案并删除“obj”文件夹。然后再试一次。

还要检查是否在调试模式下编译 - 这是我经常遇到的问题(“为什么它不能逐步执行?!”)未获取断点。


1

对我来说,禁用“项目属性/构建/优化代码”起作用了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接