我的AutoIt脚本会发送一个点击和按键列表,以自动化旧的闭源应用程序。
它有bug,所以我想知道如何调试AutoIt脚本。或者至少输出脚本的行号(以显示实时执行的代码)。
答案 0 :(得分:4)
在SciTE from Tools中选择“Trace:Add trace lines”。如果未选择任何内容,则会向每行添加ConsoleWrite。如果您首先选择一些代码,它会将ConsoleWrite行添加到您选择的内容中。
如果在编译的代码中出现错误,可以在编译之前将其添加到脚本的顶部。当它出错时,它会在你的脚本中为你提供正确的行号。
#Au3Stripper_Parameters=/mo
答案 1 :(得分:4)
如何调试AutoIt代码?
根据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
中的行号匹配(编译后出现)。
#AutoIt3Wrapper_Change2CUI=y
。
ConsoleWrite()
包括@error
,@extended
和@ScriptLineNumber
SciTE4AutoIt3
> Tools
> Trace: Add Trace Lines
为每一行插入这样的命令。显示当前@error
代码(以及相关行)。SciTE4AutoIt3
> Tools
> Debug to Console
( Alt + D )为当前选定的行插入此类命令。显示@ScriptLineNumber
,返回值和@error
代码。第二次执行原始行以获得其返回值(可能不合需要)。VarGetType()
。_ArrayDisplay()
或log to file。根据example:
断言失败时显示消息
Documentation - User Defined Function Reference - _Assert()
。用于回归测试和验证边缘情况和假设(或在意外情况下简单地中止)。相关功能包括:
IsBinary()
IsBool()
IsDllStruct()
IsFloat()
IsHWnd()
IsInt()
IsNumber()
IsPtr()
IsString()
IsDeclared()
IsFunc()
IsKeyWord()
通常,函数返回 - (或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
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()
)。