【问题标题】:Why is Debugging Including External Library Code为什么调试包括外部库代码
【发布时间】:2018-10-20 18:24:47
【问题描述】:

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

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

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

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

有人找到解决办法了吗?

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

谢谢。

【问题讨论】:

  • 我不完全确定你在这里问什么。您是说,如果您为所有启用的异常保留“抛出时中断”,Visual Studio 会中断所有异常,并且您正在寻求解决此问题的方法?你能澄清一下吗?
  • 您是否在第 3 段中切换了启用/禁用?我希望调试器在“Just My Code”关闭并且“Break When Thrown”为该异常打开时中断外部代码。但是,如果“仅我的代码”处于启用状态,则还有一个附加选项可以“在用户代码中未处理时继续”。是这样设置的吗?有关详细信息,请参阅此doc page
  • @Lasse Vågsæther Karlsen - 我说错了。更新并包含图片
  • “在用户代码中未处理时继续”不应该是必要的@mikez - 这不是我的代码,也不是未处理

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


【解决方案1】:

原因很简单,在Microsoft docs 文章中进行了说明指定是否在 Visual Studio 中使用 Just My Code 仅调试用户代码。请注意:

异常行为

如果在非用户代码中发生未处理的异常, 调试器在异常所在的用户代码行中断 生成。

如果为异常启用了首次机会异常,则 用户代码行以绿色突出显示。调用堆栈显示 标记为 [外部代码] 的注释框架。

在 C++ 中也是如此:

异常行为

当调试器遇到异常时,它会在异常处停止 无论它是在用户代码还是非用户代码中。这 “例外”对话框中用户未处理的选项将被忽略。

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

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

关于你的陈述:

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

确实如此,因为 Visual Studio 必须再次编写 .pdb 符号,因此您最多可以使用一两次,然后再返回不需要的行为。

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

【讨论】:

  • 那么有没有办法在不重新启动Visual Studio或删除整个pdb缓存的情况下清除pdb符号?
  • 很遗憾没有。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-28
相关资源
最近更新 更多