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

Why is Debugging Including External Library Code

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

有时我会禁用 "Just My Code"(这些天与启用 SourceLink 一起使用)并为 Visual Studio 中的所有 "Common Language Runtime Exceptions" 打开 "Break When Thrown",因为我想要检查异常被第三方库吞没的问题。

完成并重新启用 "Just My Code" 并为所有 "Common Language Runtime Exceptions" 启用保留 "Break When Thrown" 后,有时当第三方库抛出 HANDLED 异常时我仍然会中断。意思是,第三方库有一个我不想看到的静默异常,但 Visual Studio 无论如何都会中断。例如,库可能有预期的 TCP 连接超时,但 Visual Studio 无论如何都会中断。我只希望在禁用“仅我的代码”时发生这种情况。

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

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

更新:查看演示意外行为的屏幕截图。 Just My Code 已启用,Break When Thrown 已选中,无论如何都会弹出第三方代码中已处理的异常。如果我重新启动 Visual Studio(有时也清除缓存),我将不再收到使用相同设置的提示。即使在我禁用 Source Link.

之后,似乎有什么东西让外部库被认为是 "My Code"

谢谢。

原因很简单,在Microsoft docs文章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' 时,调试器知道它不会在你的任何 'un-managed 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 希望您在调试时收到未处理异常的通知,即使在第三方库中也是如此,除非您明确指定其他内容,以便您了解代码中的问题。