【问题标题】:Hiding code from a DLL while debugging调试时隐藏 DLL 中的代码
【发布时间】:2013-07-05 08:08:12
【问题描述】:

我创建了一个带有类库项目的 DLL,其中包含一些类。在另一个项目中将此 DLL 作为参考添加并进行调试时,当逐步进行或当类返回异常时,会显示该类的代码。

我怎样才能隐藏这个?我希望在类指令中显示异常,而不是在内部并允许查看所有代码。并且在逐步调试时,我想在不进入方法代码的情况下执行这些方法。

例如,就像您通过str.Split() 一样。您看不到代码和所有步骤。您只是在该行看到错误或跳转到下一行。

例如:

Dim myObj As New myClass.SomeObj()

myObj.MyMethod()

我不想显示MyMethod 中的代码。

【问题讨论】:

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


    【解决方案1】:

    在指定方法上添加DebuggerStepThrough 属性以防止步入。如果发生异常,调试器会在方法调用处中断,而不是在方法内部。 See MSDN

    【讨论】:

    • 类很多,方法也很多。我应该把这个加到每一个上吗?逐个?也许有更通用的选择?
    • 是的。你可以直接在你的类上设置属性。
    • 测试过了。工作完美,即使是整个班级,谢谢。我会记住这种可能性,尽管在这种情况下我更喜欢 Code Gray 解决方案。 +1
    • 我实际上更喜欢这个解决方案,并希望本机 C++ 调试器可以使用类似的东西... :-) 但令人困惑的是,您提到了 DebuggerStepThrough 属性并链接到 @ 的文档987654324@ 属性。
    • 链接现在正确,谢谢,抱歉。 DebuggerNonUserCode 更具限制性。抛出异常时,调试符号可以为您提供更多信息。所以,如果你禁用它,你会得到更少的细节。
    【解决方案2】:

    您描述的行为是一种方便。它允许调用者通过查看他尝试使用的代码的详细信息来准确地看到出了什么问题。 Microsoft even supports this for the .NET Framework source,在我看来它相当有用。我不确定你为什么要禁用它。在调试时,您始终可以只使用 F10(Step Over)而不是 F11(Step Into),以便 DLL 的代码在您需要时仍然可用。

    但是,如果您确定不希望能够从 DLL 单步执行任何代码,则需要确保调试符号对客户端应用程序不可用。 Visual Studio 以a PDB file 的形式生成这些符号,其中包含源文件的位置以及生成的代码与源代码行之间的映射。

    与其他一些答案相反,调试符号的生成与代码是否经过优化(例如,“发布”构建)无关。 I've written about this before 在为什么您可能需要符号来优化构建的上下文中,但重点是这是两个正交设置。您可以打开优化并关闭符号生成,反之亦然。我只想说我强烈建议为 all 构建生成调试符号。

    您可以在项目的属性中禁用调试符号的生成(它隐藏在“高级...”按钮下),或者您可以移动 PDB 文件以确保客户端应用程序在调试时无法找到它们。默认情况下,构建将它们放置在与二进制输出相同的目录中,因此当您添加对 DLL 的引用时,Visual Studio 可以轻松找到它们。如果您移动符号或二进制文件,它将无法找到它们。 (调试器也会搜索符号路径,但您的符号可能不会在那里结束。)

    【讨论】:

    • 我使用的 dll 文件没有 .pbd 文件,将 dll 单独复制到新项目文件夹中。似乎它看起来有点像原始图书馆项目的 .pdb 文件或其他东西。无论如何,将库项目设置为不生成调试符号就像我想要的那样工作。非常感谢您的建议。
    • @SysDragon 嗯嗯,想想看,我认为当构建设置为生成符号时,它实际上将符号路径的路径写入二进制输出。当然,如果您仍然希望符号可用,那么打破这种关系是微不足道的。
    猜你喜欢
    • 1970-01-01
    • 2017-03-27
    • 2012-05-26
    • 2015-12-30
    • 2013-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-13
    相关资源
    最近更新 更多