调试 AutoIt 脚本或获取当前执行的脚本行号

Debugging an AutoIt script or get currently executed script line number

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

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

来自工具的 SciTE select“跟踪:添加跟踪线”。如果没有 selected,这将向每一行添加一个 ConsoleWrite。如果您先 select 一些代码,它将向您 select 编辑的内容添加 ConsoleWrite 行。

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

#Au3Stripper_Parameters=/mo

How can I debug AutoIt code?

语法

Au3Check

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

Checks the script for syntax errors.

示例:

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

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

运行时间

当前行

… show me which code is executed in real time …

根据Documentation - Function Reference - AutoItSetOption()

TrayIconDebug If enabled shows the current script line in the tray icon tip to help debugging.

示例:

AutoItSetOption("TrayIconDebug", 1)

编译脚本

#AutoIt3Wrapper_Run_Debug_Mode=Y 使用控制台调试运行脚本。

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

If there are no errors, run Au3Stripper to create an Stripped source file Scriptname_Stripped in the same folder containing all the source (the script and any #include files)

示例:

#AutoIt3Wrapper_Run_Au3Stripper=y

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

错误代码和 return 值

  • 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、return 值和 @error 代码。为它的 return 值(可能不需要)再次执行原始行。
  • VarGetType() returns .
  • _ArrayDisplay() 查看数组变量的结构和内容。
  • 如果需要远程调试,可能log to file or
  • 为了简化而记录 UDF (example) 时出错。

断言

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

Display a message if assertion fails

。对于回归测试和验证边缘情况和假设很有用(或者在意外情况下简单地中止)。相关函数包括:

错误处理

通常函数 return -(或组合)return value or -error code。非 0 错误代码值(有时为负)表示失败。 Return 值(如果这样使用)在 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

Return 值启用如下构造:

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

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