【问题标题】:Detect if Debugger is Attached in VB6检测是否在 VB6 中附加了调试器
【发布时间】:2012-02-29 20:00:56
【问题描述】:

我正在对我们用 Visual Basic 6 编写的旧应用程序之一进行一些维护工作,由于各种原因,我们有一部分代码只有在通过VB6 IDE(即附加调试器)。

在 VB.NET 中,您可以使用 System.Diagnostics.Debugger.IsAttached() 属性来执行此操作,但我在 Google 上的 VB6 中找不到类似的东西。

有没有一些简单的方法可以找出这些信息?

【问题讨论】:

  • 另见问题debug mode in vb6
  • 在IDE中运行和附加调试器是不一样的,当然也可以,但是是另外一回事。

标签: debugging vb6


【解决方案1】:

这是我的函数,类似于 Josh 的函数,但更易于阅读(参见里面的 cmets)。

用了这么久都忘了从哪里借来的……

Public Function InDesign() As Boolean
' Returns TRUE if in VB6 IDE
Static CallCount    As Integer
Static Res          As Boolean

    CallCount = CallCount + 1
    Select Case CallCount
    Case 1  ' Called for the 1st time
        Debug.Assert InDesign()
    Case 2  ' Called for the 2nd time: that means Debug.Assert 
            ' has been executed, so we're in the IDE
        Res = True
    End Select
    ' When Debug.Assert has been called, the function returns True
    ' in order to prevent the code execution from breaking
    InDesign = Res

    ' Reset for further calls
    CallCount = 0

End Function

【讨论】:

    【解决方案2】:

    这是我们使用的没有任何副作用的产品

    Public Property Get InIde() As Boolean
        Debug.Assert pvSetTrue(InIde)
    End Property
    
    Private Function pvSetTrue(bValue As Boolean) As Boolean
        bValue = True
        pvSetTrue = True
    End Function
    

    【讨论】:

    • 没有副作用,海报意味着如果您打开了“所有错误中断”,这不会像@Jay Riggs 接受的答案那样停止程序的执行(这可能非常如果你到处使用 InIde,这很烦人。
    • @Kris:如果使用 On Error Resume Next + Err.Number <> 0 错误检查样式,则不会重置 Err 对象。顺便说一句,除了Break On Unhandled Errors 之外,从未见过任何人使用任何东西(除非对这些 IDE 设置一无所知)。
    • @Kris:在您最初发表评论两年后,我确信“Break On All Errors”是进行任何远程专业项目的方式。重构我所有的“代码”花了我一只手和一条腿,但这是值得的。感谢大开眼界!
    【解决方案3】:

    这是我一直在使用的一个函数:

    Private Function RunningInIde() As Boolean
        On Error GoTo ErrHandler
        Debug.Print 1 / 0
    ErrHandler:
        RunningInIde = (Err.Number <> 0)
    End Function            ' RunningInIde
    

    【讨论】:

    • 看起来很棒!一个问题,不过。如果我们在此函数之外还有其他 On Error GoTo 语句,我是否需要重置此函数之外的那些?还是错误处理程序的作用域在函数内部?
    • @galador 此函数中抛出的所有错误都将在此函数内部处理,您无需重置。
    • 这个函数重置Err对象作为副作用
    • 这里提到了更好的解决方案,因此不应将其标记为答案。
    【解决方案4】:

    我不久前写了这样的东西,但找不到它,又需要它。所以我又写了一遍,我认为我没有错:

    Public Function IsRunningInIde() As Boolean
        Static bFlag As Boolean
        bFlag = Not bFlag
        If bFlag Then Debug.Assert IsRunningInIde()
        IsRunningInIde = Not bFlag
        bFlag = False
    End Function
    

    没有出现错误。

    不重置 Err。

    只有一个功能。

    第 1 行:“bFlag”的“静态”声明导致 bFlag 的值在多次调用“IsRunningInIde”时保持不变。我们想要这个,因为我在它自身内部调用了这个函数,并且我不想在函数中乱扔用户不需要的输入参数。

    第 3 行:“Debug.Assert”在 IDE 中未运行时不会被调用。因此,只有在 IDE 中,“IsrunningInIde”才会被递归调用。

    第 2 行:如果不在递归调用中,bFlag 开始为 false,然后设置为 true。如果在递归调用中(仅在 IDE 中运行时发生),它以 true 开始,然后设置回 false。

    第 3 行:如果“IsRunningInIde”尚未在此函数中,则仅调用它,通过检查 bFlag 是否为真。

    第 4 行:如果在递归调用中,总是返回 True,这并不重要,但不会导致 Assert 失败。如果不在递归调用中,则返回“Not bFlag”,如果 IsRunningInIde 被递归调用,则 bFlag 现在为“False”,如果未递归调用,则 bFlag 为“True”。所以基本上,如果 Not bFlag 在 IDE 中运行,它会返回“True”。

    第 5 行:清除 bFlag,使其在下次调用此函数开始时始终为“False”。

    这很难解释,在这两种情况下,最好在脑海中逐步完成。

    如果您想更简单地理解代码,请不要使用它。

    如果此代码有问题,我深表歉意并告诉我,以便我修复它。

    【讨论】:

    • 好的,我更新了解释。我意识到这是令人困惑的逻辑。
    【解决方案5】:
    Public Function InIDE() As Boolean
    On Error GoTo ErrHandler
    
        Debug.Print 1 \ 0 'If compiled, this line will not be present, so we immediately get into the next line without any speed loss
    
        InIDE = False
    
    Exit Function
    ErrHandler:
    InIDE = True 'We'll get here if we're in the IDE because the IDE will try to output "Debug.Print 1 \ 0" (which of course raises an error).
    End Function
    

    【讨论】:

      【解决方案6】:
      Public Function InIDE(Optional ByRef bool As Boolean = True) As Boolean
          If bool Then Debug.Assert Not InIDE(InIDE) Else bool = True
      End Function
      

      用法:

      If InIDE() Then
          '- Yes
      End If
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-18
        • 1970-01-01
        • 2011-07-20
        • 1970-01-01
        • 2014-09-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多