Debugging an AutoIt script or get currently executed script line number
Asked Answered
B

2

5

My AutoIt script sends a list of clicks and key-presses to automate an old closed source application.

It has bugs so I want to know how I can debug AutoIt scripts. Or at least output the script's line number (to show code executed in real time).

Blackboard answered 5/12, 2015 at 18:26 Comment(0)
G
4

In SciTE from Tools select “Trace: Add trace lines”. This will add a ConsoleWrite to each line if nothing is selected. If you select some code first it will add ConsoleWrite lines to what you have selected.

If you are getting an error in your compiled code you can add this to the top of your script before compiling it. When it errors out it will give you the right line number in your script.

#Au3Stripper_Parameters=/mo
Grandpapa answered 5/12, 2015 at 19:46 Comment(4)
The trace lines work good most of the time for debugging. If it gives you an error check to see if your code has any Select or Switch statements. You will want to remove any ConsoleWrite it might have added between the Select/Switch and the first Case.Grandpapa
My question was bad formulated, i was meaning i sometime dont have the right behavior in my code (a complex automation with synchronisation and blind windows (no text inside ...) ) so your answer is perfect.Blackboard
https://mcmap.net/q/2029631/-how-to-implement-error-handling/…Blackboard
Make sure you are using the SciTE editor that has the extra utilities. The standard AutoIt install does not install it. Here is the download page.Grandpapa
G
7

How can I debug AutoIt code?

Syntax

Au3Check

As per Documentation - Intro - AutoIt Syntax Checker (Au3Check):

Checks the script for syntax errors.

Example:

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

Reports (almost) every non-runtime error, prior to execution and compile.

Runtime

Current line

… show me which code is executed in real time …

As per Documentation - Function Reference - AutoItSetOption():

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

Example:

AutoItSetOption("TrayIconDebug", 1)

Compiled scripts

#AutoIt3Wrapper_Run_Debug_Mode=Y runs script with console debugging.

Due to prepended include files, line numbers (in error messages) of compiled scripts do not match original .au3 file. As per 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)

Example:

#AutoIt3Wrapper_Run_Au3Stripper=y

Line numbers in error messages of compiled scripts match those in scriptname_stripped.au3 now (present after compile).

Error codes and return values

  • ConsoleWrite(). Add #AutoIt3Wrapper_Change2CUI=y if to be read from compiled script.
    • Macros of use include @error, @extended and @ScriptLineNumber
    • SciTE4AutoIt3 > Tools > Trace: Add Trace Lines inserts such a command for every line. Displays current @error code (and concerning line).
    • SciTE4AutoIt3 > Tools > Debug to Console (Alt + D) inserts such a command for currently selected line. Displays @ScriptLineNumber, return value and @error code. Executes original line a second time for its return value (may be undesired).
  • VarGetType() returns the internal type representation of a variant.
  • _ArrayDisplay() to view structure and content of array variables.
  • Possibly log to file or database in case of remote debugging requirement.
  • Error logging UDF's (example) for simplification.

Assertions

As per Documentation - User Defined Function Reference - _Assert():

Display a message if assertion fails

Related. Useful for regression tests and to verify edge cases and assumptions (or to simply abort in case of unexpected circumstances). Related functions include:

Error handling

Generally functions return either- (or a combination of) return value or -error code. Non 0 error code values (sometimes negative) signify failure. Return values (if used as such) alternate between 0 (failure) and 1 (success).

Handle errors as they appear. Scripts debug themselves provided for correct error handling. Avoid progressively nesting If -statements. Example:

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

Or 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 values enable constructs like:

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

Correlating error codes to text messages may help. Especially useful if shared among multiple related functions that call upon each other transparently returning encountered error codes (some FindOnPage() returning $ERR_PAGELOAD from a LoadPage() dependency for example).

Gene answered 26/5, 2018 at 3:55 Comment(0)
G
4

In SciTE from Tools select “Trace: Add trace lines”. This will add a ConsoleWrite to each line if nothing is selected. If you select some code first it will add ConsoleWrite lines to what you have selected.

If you are getting an error in your compiled code you can add this to the top of your script before compiling it. When it errors out it will give you the right line number in your script.

#Au3Stripper_Parameters=/mo
Grandpapa answered 5/12, 2015 at 19:46 Comment(4)
The trace lines work good most of the time for debugging. If it gives you an error check to see if your code has any Select or Switch statements. You will want to remove any ConsoleWrite it might have added between the Select/Switch and the first Case.Grandpapa
My question was bad formulated, i was meaning i sometime dont have the right behavior in my code (a complex automation with synchronisation and blind windows (no text inside ...) ) so your answer is perfect.Blackboard
https://mcmap.net/q/2029631/-how-to-implement-error-handling/…Blackboard
Make sure you are using the SciTE editor that has the extra utilities. The standard AutoIt install does not install it. Here is the download page.Grandpapa

© 2022 - 2024 — McMap. All rights reserved.