代码之家  ›  专栏  ›  技术社区  ›  Jeff

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

  •  3
  • Jeff  · 技术社区  · 7 年前

    这已经存在了很久,但我想知道是否有人找到了解决办法。。。

    有时我会禁用“仅我的代码”(现在与启用SourceLink结合使用),并在visualstudio中为所有“公共语言运行时异常”启用“抛出时中断”,因为我想检查异常是否被第三方库吞没的问题。

    在我完成并重新启用“仅我的代码”,并为所有“公共语言运行时异常”保留“抛出时中断”启用后,有时在第三方库抛出已处理的异常时仍会中断。也就是说,第三方库有一个无声的异常,我不想看到,但visualstudio还是会崩溃。例如,库可能有预期的TCP连接超时,但VisualStudio仍会中断。我只希望在我的代码被禁用时发生这种情况。

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

    有人找到办法了吗?

    更新:查看演示意外行为的屏幕截图。只启用了“我的代码”,选中了“抛出时中断”,第三方代码中出现了一个已处理的异常。如果我重新启动visualstudio(有时也清除缓存),我将停止使用相同的设置得到提示。似乎有什么东西使外部库被视为“我的代码”,即使我禁用了源代码链接。

    enter image description here

    谢谢。

    1 回复  |  直到 7 年前
        1
  •  2
  •   Barr J    7 年前

    原因很简单,在 Microsoft docs 文章 . 请注意:

    如果非用户代码中发生未处理的异常, 生成。

    如果为异常启用了第一次机会异常,则 用户代码行以绿色突出显示。调用堆栈显示

    这也是C++中的:

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

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

    有一种方法可以超越它 i、 e.),您可以指定.pdb文件中将包含哪些模块。这也许能解决你的问题,我还没亲自测试呢。

    调试信息会减慢其他东西的速度。

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

    推荐文章