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

时间:2015-12-05 18:26:51

标签: autoit script-debugging

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

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

2 个答案:

答案 0 :(得分:4)

在SciTE from Tools中选择“Trace:Add trace lines”。如果未选择任何内容,则会向每行添加ConsoleWrite。如果您首先选择一些代码,它会将ConsoleWrite行添加到您选择的内容中。

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

#Au3Stripper_Parameters=/mo

答案 1 :(得分:4)

  

如何调试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文件不匹配。根据{{​​3}}:

  

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

示例:

#AutoIt3Wrapper_Run_Au3Stripper=y

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

错误代码和返回值

断言

根据example

  

断言失败时显示消息

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

错误处理

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

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

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

-error code

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()$ERR_PAGELOAD依赖关系返回LoadPage())。