【问题标题】:How can I force VB6 to enter the debugger from the execution of a program without a break point?如何在没有断点的情况下强制 VB6 从程序执行进入调试器?
【发布时间】:2010-09-22 05:38:52
【问题描述】:

我正在尝试查看 VB6 应用程序的执行,但我遇到了一个问题,因为一旦我进入调试器然后点击 Continue,它就不再允许我单步执行代码,直到我再次中断观点。我希望能够在不单步执行某个程序的情况下执行程序,直到达到我想要观看它执行的地步。理想情况下,这将是在我按下按钮以“进入”该功能时按住一个键的效果。

提前致谢!

[编辑]:我知道我可以使用断点来停止执行。说得更清楚一点,问题是我不知道执行到哪里去,所以不能在那里设置断点(因为不知道在哪里)。这就是为什么我本质上想要能够说,'在我做的下一件事之后,无论如何都要打破'。听起来这个功能不存在,但我仍然在祈祷。

【问题讨论】:

    标签: vb6 debugging


    【解决方案1】:

    您可以按 F8 键逐行浏览代码。或者,您可以按 SHIFT-F8 逐行浏览。

    F8 将带您进入一个函数,其中 SHIFT-F8 将带您跳过该函数。如果您在 VB IDE 中单击 DEBUG 菜单,您还会看到其他选项。

    编辑:

    您还可以使用以下方法在代码中设置永久断点:

    Debug.Assert False
    

    通过这种方式,“断点”将保存在您的代码中。编译应用时,调试代码会被忽略。

    【讨论】:

      【解决方案2】:

      在 VB6 中有一个可用的 Stop 语句,当从通过 IDE 运行的代码执行该语句时,该语句将被放到调试器中。 (请确保在编译发布版本时从代码中删除所有 Stop 语句。)

      【讨论】:

      • 我认为你被标记了,因为你不需要在编译之前删除 Stop 语句,因为它们被忽略了。
      • 我希望这不是原因,因为根据我在 VB6 中的经验,在已编译的 32 位可执行文件的发布版本中留下 Stop 语句会导致该可执行文件在该代码时显示一个消息框击中说“遇到停止语句”,然后终止程序。
      【解决方案3】:

      在代码运行时,按 ctrl+break(或 IDE 中的“VCR 暂停”按钮),然后按 F8(或从 IDE 的“调试”菜单中选择“步入”)继续运行应用程序。下一个动作将导致执行中断。

      请注意,导致中断的原因并不总是您希望的那样。特别烦人的是 _MouseOver 事件,它阻止您执行鼠标按下或计时器触发比您执行操作更快。在运行您的应用程序时,一些中断甚至可能是致命的,例如Windows 消息已被挂钩(子类化)的地方。还要考虑代码中可能没有事件处理程序(尚未)用于您的操作可能会中断。但通常这种技术会确定您应该在哪里设置断点。

      【讨论】:

        【解决方案4】:

        您可以使用多种技术。

        这两个都提到了

        使用 F8 和 Shift-F8 单步执行程序

        添加止损(以及稍后删除)

        其他

        使用全局变量创建集合。将其用作堆栈并拥有您对推送和弹出字符串感兴趣的子例程。相反,不要弹出任何东西,你会得到一个踪迹。

        使用 Watches 在选择条件下进行监控和中断。您几乎可以设置任何要中断的条件。

        创建一个全局字符串并在输入时设置您的程序。通过 Watch 对其进行监控。

        在您的代码中使用 Debug.Print。与 Stop 不同的是,您可以将这些保留在不影响生产代码的情况下。

        使用文件系统对象创建一个文本文件作为日志。

        有时问题只出现在编译版本中,那么你需要使用 MsgBox 或登录到文本文件。 MsgBox 可以改变复杂的用户与表单交互的行为。

        这些都是我在调试应用程序时使用的技术。如果我必须监视应用程序,我会使用 Debug.Print。如果这不能解决问题,请编译然后记录到文本文件。

        如果您正在处理一些非常复杂的事情,那么我建议您将所有代码从事件中移出到实现命令模式的类中。您的命令类应该通过和接口与表单交互。

        在命令类的 Execute 方法中,您将类似于

        <save the current state>
        <Do your original code>
        <save the modified state>
        <push the command onto a stack>
        

        最后会出现一个列表,其中列出了所有已执行的命令(甚至是鼠标悬停之类的命令)以及它们遇到的状态和修改后的状态。然后,您可以依次检查每个对象以查看发生了什么。这几乎相当于创建 Undo/Redo

        请注意,但是像 MouseOver 这样的东西可以将许多类推送到命令堆栈上,因此您必须仔细构建测试,否则信息会过载。请记住,您始终可以跳过将命令压入堆栈。

        使用命令的缺点是您超出了调试范围,而是进行了重新设计。你将决定这个问题是否值得这样做。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-02-02
          相关资源
          最近更新 更多