c# - 为什么调试包括外部库代码

标签 c# .net visual-studio visual-studio-debugging

这一直存在,但我想知道是否有人找到了解决方案...

有时我会禁用“仅我的代码”(这些天与启用 SourceLink 一起使用)并为 Visual Studio 中的所有“公共(public)语言运行时异常”打开“抛出时中断”,因为我想检查异常被吞没的问题由第三方图书馆提供。

在我完成并重新启用“仅我的代码”,并为所有启用的“公共(public)语言运行时异常”保留“抛出时中断”之后,有时当第三方库抛出 HANDLED 异常时我仍然会中断。意思是,第三方库有一个我不想看到的静默异常,但无论如何 Visual Studio 都会中断。例如,库可能有预期的 TCP 连接超时,但 Visual Studio 无论如何都会中断。我只希望在禁用“仅我的代码”时发生这种情况。

通常我必须重新启动 Visual Studio 并且有时会清除所有缓存的调试信息,这会降低其他东西的速度。

有没有人找到解决这个问题的方法?

更新:查看演示意外行为的屏幕截图。 Just My Code 已启用,Break When Thrown 已选中,无论如何都会弹出第三方代码中已处理的异常。如果我重新启动 Visual Studio(有时也清除缓存),我将不再收到使用相同设置的提示。即使在我禁用源链接之后,似乎有什么东西使该外部库被视为“我的代码”。

enter image description here

谢谢。

最佳答案

原因很简单,在Microsoft docs中说明。 article 指定是否使用 Visual Studio 中的 Just My Code 仅调试用户代码。注意这一点:

Exception behavior

If an unhandled exception occurs in non-user code, the debugger breaks at the line in user code where the exception was generated.

If first chance exceptions are enabled for the exception, the user-code line is highlighted in green. The call stack displays an annotated frame labeled [External Code].

在 C++ 中也是这样:

Exception behavior

When the debugger hits an exception, it stops on the exception regardless of whether it is in user or non-user code. The User-unhandled options in the Exceptions dialog box are ignored.

当您引用第三方库时,它会嵌入到您的 .pdb symbol 中 因此,使其成为代码的一部分。当你调试“Just My Code”时,调试器知道它不会中断你的任何“非托管代码”,但当第三方库发生未处理的异常时它会中断。

有一种方法可以超越它(参见文章 .pdb symbol 即),您可以指定您的哪个模块将包含在您的 .pdb 文件中。这可能会解决您的问题,但我自己还没有测试过。

关于您的陈述:

Usually I have to restart Visual Studio and sometimes clear all cached debugging information which slows down other stuff.

没错,因为那时 visual studio 必须再次写入 .pdb 符号,因此您最多可以使用一两次,然后再回到不需要的行为。

我的猜测是,Microsoft 希望您在调试时收到未处理异常的通知,即使在第三方库中也是如此,除非您明确指定其他内容,以便您了解代码中的问题。

关于c# - 为什么调试包括外部库代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52908798/

相关文章:

c# - 嵌入式 Mysql (libmysql.dll) 和 C# & Asp.Net

c# - 如何将字符串转换为具有 unix 行结尾的字节?

c# - 如何使用时区信息解析日期时间

C# 单元测试列表

c# - 用正则表达式解析key=value

c# - "Fixed"/"Load Balanced"C# 线程池?

c# - 是否有一种通用方法可以通过主键获取 Linq2SQL 实体?

c# - 有没有办法在 Visual Studio 中的 "break all"之后保留在当前文档上?

c++ - 我需要遵循哪个标准?

c# - directx/directshow preparesurface 失败/无法呈现图像