【问题标题】:Debugging an AutoIt script or get currently executed script line number调试 AutoIt 脚本或获取当前执行的脚本行号
【发布时间】:2015-12-05 18:26:50
【问题描述】:

我的 AutoIt 脚本会发送一个点击和按键列表来自动化一个旧的闭源应用程序。

它有错误,所以我想知道如何调试 AutoIt 脚本。或者至少输出脚本的行号(以显示实时执行的代码)。

【问题讨论】:

    标签: autoit script-debugging


    【解决方案1】:

    如何调试 AutoIt 代码?

    语法

    Au3Check

    根据Documentation - Intro - AutoIt Syntax Checker (Au3Check)

    检查脚本的语法错误。

    例子:

    #AutoIt3Wrapper_Au3Check_Parameters=-q -d -w 1 -w 2 -w 3 -w- 4 -w 5 -w 6 -w 7
    

    在执行和编译之前报告(几乎)每个非运行时错误。

    运行时

    当前行

    …告诉我哪些代码是实时执行的…

    根据Documentation - Function Reference - AutoItSetOption()

    TrayIconDebug 如果启用,则在托盘图标提示中显示当前脚本行以帮助调试。

    例子:

    AutoItSetOption("TrayIconDebug", 1)
    

    编译脚本

    #AutoIt3Wrapper_Run_Debug_Mode=Y 运行带有控制台调试的脚本。

    由于前置包含文件,已编译脚本的行号(在错误消息中)与原始 .au3 文件不匹配。根据Documentation - SciTE4AutoIt3 - Au3Stripper

    如果没有错误,运行 Au3Stripper 以在包含所有源(脚本和任何#include 文件)的同一文件夹中创建一个剥离的源文件 Scriptname_Stripped

    例子:

    #AutoIt3Wrapper_Run_Au3Stripper=y
    

    编译脚本的错误消息中的行号现在与scriptname_stripped.au3 中的行号匹配(编译后出现)。

    错误代码和返回值

    • ConsoleWrite()。如果要从已编译的脚本中读取,请添加 #AutoIt3Wrapper_Change2CUI=y
      • Macros of use 包括 @error@extended@ScriptLineNumber
      • SciTE4AutoIt3 > Tools > Trace: Add Trace Lines 为每一行插入这样一个命令。显示当前的@error 代码(以及相关行)。
      • SciTE4AutoIt3 > Tools > Debug to Console (Alt + D) 为当前选定的行插入这样的命令。显示@ScriptLineNumber、返回值和@error 代码。再次执行原始行以获取其返回值(可能不需要)。
    • VarGetType() 返回the internal type representation of a variant
    • _ArrayDisplay() 查看数组变量的结构和内容。
    • 如果需要远程调试,可能是log to filedatabase
    • 为了简化而记录 UDF (example) 时出错。

    断言

    根据Documentation - User Defined Function Reference - _Assert()

    断言失败时显示消息

    Related。用于回归测试和验证边缘情况和假设(或在意外情况下简单地中止)。相关功能包括:

    错误处理

    通常函数返回return value-error code 之一(或两者的组合)。非0 错误代码值(有时为负)表示失败。返回值(如果这样使用)在0(失败)和1(成功)之间交替。

    处理出现的错误。为正确的错误处理提供脚本自己调试。避免逐步嵌套If -statements。示例:

    Global Enum  $RANDOM_FLT, _
                 $RANDOM_INT
    
    Global Enum  $ERROR_OK, _
                 $ERROR_AIR, _
                 $ERROR_WATER, _
                 $ERROR_FOOD, _
                 $ERROR_ENUM
    
    Global       $g_aError[$ERROR_ENUM]
                 $g_aError[$ERROR_OK]    = 'survived'
                 $g_aError[$ERROR_AIR]   = 'no air'
                 $g_aError[$ERROR_WATER] = 'no water'
                 $g_aError[$ERROR_FOOD]  = 'no food'
    
    Global Const $g_sMsgConsole          = 'error:%i - %s\n'
    
    While True
        Live()
    
        If @error Then
            ConsoleWrite(StringFormat($g_sMsgConsole, @error, $g_aError[@error])); And one of following:
            ContinueLoop
    ;       ExitLoop
    ;       Return; If in Local scope.
    ;       Exit @error
        EndIf
    
        ; Continuation conditional to successful execution of Live():
        ConsoleWrite(StringFormat($g_sMsgConsole, @error, $g_aError[@error]))
    WEnd
    
    Func Live()
        Local Const $iError    = Random($ERROR_OK, $ERROR_ENUM - 1, $RANDOM_INT), _
                    $iExtended = 0, _
                    $iReturn   = $iError ? 0 : 1
    
        Return SetError($iError, $iExtended, $iReturn)
    EndFunc
    

    more specifically:

    Live()
    
    Switch @error
    
        Case $ERROR_AIR
            ; Handle specific error here.
    
        Case $ERROR_WATER
            ; Handle specific error here.
    
        Case $ERROR_FOOD
            ; Handle specific error here.
    
    EndSwitch
    

    返回值启用如下结构:

    If Not SomeFunction() Then
        ; Handle here.
    EndIf
    ; Continuation of script here.
    

    将错误代码与短信相关联可能会有所帮助。如果在相互调用的多个相关函数之间共享时特别有用,这些函数透明地返回遇到的错误代码(例如,一些 FindOnPage()LoadPage() 依赖项返回 $ERR_PAGELOAD)。

    【讨论】:

      【解决方案2】:

      在 SciTE 的工具中选择“Trace: Add trace lines”。如果未选择任何内容,这将向每一行添加一个 ConsoleWrite。如果您先选择一些代码,它将向您选择的内容添加 ConsoleWrite 行。

      如果您在编译的代码中遇到错误,您可以在编译之前将其添加到脚本的顶部。当它出错时,它会在您的脚本中为您提供正确的行号。

      #Au3Stripper_Parameters=/mo
      

      【讨论】:

      • 跟踪线在大多数情况下都可以很好地进行调试。如果它给你一个错误检查,看看你的代码是否有任何 Select 或 Switch 语句。您需要删除它可能在 Select/Switch 和第一个 Case 之间添加的任何 ConsoleWrite。
      • 我的问题表述不当,我的意思是有时我的代码中没有正确的行为(具有同步和盲窗的复杂自动化(内部没有文本......))所以你的答案是完美的.
      • 确保您使用的是具有额外实用程序的 SciTE 编辑器。标准 AutoIt 安装不会安装它。 Here是下载页面。
      猜你喜欢
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-07
      • 2014-02-15
      • 2011-01-12
      • 2018-09-20
      相关资源
      最近更新 更多