Elias Posted June 6, 2012 Share Posted June 6, 2012 (edited) This is only a example PopUp window, the error I'm getting is: variable must be of type Object AutoIt Error Line 12467 "(File: D:\AutoIt_Teste\GetFileLineError.exe") Error: Arrary variable has incorrect number of subscripts or subscript dimension rage exceeded.How can a find the Source Code line that caused this error?I tried to make a program that count the lines of the Include files, but it didn't work.I'm attaching the program code, I used to find the line error on the fileExecutable Error in Line12452In the test program the error is in line 110 but my program report Line 834 the program and the test program are the same.the line to make the error occur is: If @Compiled And $as[uBound($as)] = "" Then $i=$i ; PopUp ERROR wen compiledexpandcollapse popup; IS NOT WORKING if includes present ;=============================================================================== ; ; Program Name: GetFileLineError ; Description: Find the line of File given the error line reported by the compiled program ; Ueses a Recursive call Sistem ; ; Parameter(s): $Path Program full path of Sorce program Ex. $path="C:\users\jony\autoit test\teste.au3" ; $Errorline Ex. $Errorline = 6551 ; Executable reported error Line ; $Debug Debug level, Defulat 0 No trce ; 1- Start and End File Lines, ; 2- File #include line Format:>(ident space)(FileName):(File Line) (Line text) ; 3- #include-once List ; ; Requirement(s): Source code used to create the executable ; $includePath Path of Include files with "\" Ex. $includePath="C:\Program Files (x86)\AutoIt3\Include\" ; ; Return Value(s): ConsoleWrite with de Program ou Mudule name and da file line of the error And MsgBox ; ; Author(s): Elias Assad Neto ; Date Created: June 6 2012 ; ;=============================================================================== ; Parameters Input $ProgramPath = "GetFileLineError.au3" $Errorline = 12452; Executable error Line $Debug = 2 ; Debug Level ; Includ Path ended with "\" $includePath="C:\Program Files (x86)\AutoIt3\Include\" If Not FileExists($includePath) Then $includePath="C:\Program Files\AutoIt3\Include\" If Not FileExists($includePath) Then MsgBox(0x10,"GetFileLineError"," Include File Directory Not Found") Exit EndIf ; Var initialization ======================================== $i = StringInStr($ProgramPath,"\",0,-1) ; Last "\" position $dir = StringLeft($ProgramPath,$i) ; Path Dir with "\" $file = StringMid($ProgramPath,$i+1) ; Program name $includeOnce = "" ; Include-Once File List $line = 0 $RecursionLevel = 0 ; Recursion Level used to ident debug lines ; Program Start ============================================= #include <INet.au3> ; Para enviar e-Mail em caso de *ERRO #include <IE.au3> #include <File.au3> #include <Array.au3> #include <GuiStatusBar.au3> #include <GUIConstants.au3> #include <GUIConstantsEx.au3> #include <GuiListView.au3> #include <ProgressConstants.au3> ;3.3.0.0 #include <WindowsConstants.au3> ;3.3.0.0 #include <StaticConstants.au3> #include <Timers.au3> $S = ProcessFile($file,$Debug) ConsoleWrite(@CRLF & @CRLF & $S & @CRLF) If $S <> "" Then MsgBox(0x40,"GetFileLineError",$S) Else MsgBox(0x40,"GetFileLineError","Executable Line " & $Errorline & " Not Found in: " & $file) EndIf ; Program End =============================================== ; Function Decalration ====================================== Func ProcessFile($FileName, $Trace=0) ; Recursive fuction to find Line, Debug Level 0,1,2,3 $ph = $dir; $s = FileRead($ph & $FileName) ; Search File in the source directory If $s = "" Then $ph = $includePath $s = FileRead($ph & $FileName) ; Search File in the Include directory EndIf $phf = $ph & $FileName If $s = "" Then Return "ERROR File " & $FileName & " NOT Found Search for Error line Aborted" $t = "" For $i=1 To $RecursionLevel ; Ident formating $t &= @TAB Next If StringInStr(StringLeft($s,16),"#include-once")=1 Then ; File #include-once detectaed If StringInStr($includeOnce,$FileName) Then Return ; Return file already processed $includeOnce &= $FileName & ";"; Adds the name of the File in the includeOnce list If $Trace >=3 Then ConsoleWrite($t & '$includeOnce="' & $includeOnce & '"' & @CRLF) ; Debug level 3 EndIf If $RecursionLevel = 0 Then If $Trace Then ConsoleWrite("+" & $t & "Programa Start( " & $FileName & " ) line " & $line+1 & @CRLF) ; Debug level >=1 Else If $Trace Then ConsoleWrite("+" & $t & "Include Start( " & $FileName & " ) line " & $line+1 & @CRLF) ; Debug level >=1 EndIf $RecursionLevel +=1 $s1 = "" Do ; ExitLoop Block $as = StringSplit($s,@CRLF,1) ; String to Array If @Compiled And $as[UBound($as)] = "" Then $i=$i ; PopUp ERROR wen compiled For $i=1 to UBound($as)-1 ; $i File Line $line+=1 ; Incrementa a linha Global If $line = $Errorline Then ; Achou a Linha terminou $s1 = "ERROR Line Found in " & $phf & " at File Line: " & $i ; Nome do Modulo mais linha local Return $s1 ; Retorna com o dado e termina a recursividade EndIf If StringInStr(StringStripWS($as[$i],3),'#include ')=1 then $as1 = StringRegExp($as[$i],"(?i)\#include (<(.*)>|""(.*?)""|''(.*?)'')",3) ; pega o nome do modulo <xxx>, "xxx" ou 'xxx' If UBound($as1)>1 Then ; Ok $s1 = $as1[UBound($as1)-1] ; takes the last item that is the file name If $Trace >=2 And StringInStr($includeOnce,$s1)=0 Then ConsoleWrite(">" & $t & $FileName & ":" & $i & " " & $as[$i] & @CRLF) ; Debug level >=2 $s1 = ProcessFile($s1,$Trace) ; Here comes recursion If $s1 <> "" Then ExitLoop ; Get out of the recursion cascading exiting all levels EndIf EndIf Next Until 1 $RecursionLevel -=1 If $s1 = "" Then If $RecursionLevel = 0 Then If $Trace Then ConsoleWrite("-" & $t & "Programa End( " & $FileName & " ) line " & $line & " Program File Lines: " & UBound($as)-1 & @CRLF) ; Debug level >=1 Else If $Trace Then ConsoleWrite("-" & $t & "Include End( " & $FileName & " ) line " & $line & " Include File Lines: " & UBound($as)-1 & @CRLF) ; Debug level >=1 EndIf EndIf Return $s1 ; Return "" if Includ end, or is $s1 <> "" is da result exiting all recursion levels EndFuncTks.GetFileLineError.au3 Edited June 6, 2012 by Elias Link to comment Share on other sites More sharing options...
Moderators Melba23 Posted June 6, 2012 Moderators Share Posted June 6, 2012 Elias,The line numbers are different because of all the #include files that are added at the top of your script. The way to get round this is to compile the script using Obfuscator and the /Strip Only parameter - you need the full SciTE4AutoIt3 package to do this which you can download from here. This provides you with a ScriptName_Obfuscated.au3 file where the line numbers match those in the executable. But if you are sure that the error occurs in that line, you can add some errorchecking like this:If (Not IsArray($as)) Or (@Compiled And $as[UBound($as)] = "") Then $i=$iNow you will error if the array does not exist and you will not try to read a non-existent element. M23  Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind Open spoiler to see my UDFs: Spoiler ArrayMultiColSort ---- Sort arrays on multiple columnsChooseFileFolder ---- Single and multiple selections from specified path treeview listingDate_Time_Convert -- Easily convert date/time formats, including the language usedExtMsgBox --------- A highly customisable replacement for MsgBoxGUIExtender -------- Extend and retract multiple sections within a GUIGUIFrame ---------- Subdivide GUIs into many adjustable framesGUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView itemsGUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeViewMarquee ----------- Scrolling tickertape GUIsNoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxesNotify ------------- Small notifications on the edge of the displayScrollbars ----------Automatically sized scrollbars with a single commandStringSize ---------- Automatically size controls to fit textToast -------------- Small GUIs which pop out of the notification area  Link to comment Share on other sites More sharing options...
clicked Posted June 6, 2012 Share Posted June 6, 2012 I have not managed to get the obfuscator approach to work for me because half of my functions are invoked as "CALL" commands, i.e. they look like dead code and I think Obfuscator removes them. This might be tweakable with a setting, but I've always managed to find these occurrences by running the script under ScITE. If your script requires command line parameters, there is a ScITE menu to provide this. If your script will run with F5, this is by far the most convenient way to find these errors. Link to comment Share on other sites More sharing options...
Moderators Melba23 Posted June 6, 2012 Moderators Share Posted June 6, 2012 clicked,Just out of interest, why do you use Call so often? M23  Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind Open spoiler to see my UDFs: Spoiler ArrayMultiColSort ---- Sort arrays on multiple columnsChooseFileFolder ---- Single and multiple selections from specified path treeview listingDate_Time_Convert -- Easily convert date/time formats, including the language usedExtMsgBox --------- A highly customisable replacement for MsgBoxGUIExtender -------- Extend and retract multiple sections within a GUIGUIFrame ---------- Subdivide GUIs into many adjustable framesGUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView itemsGUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeViewMarquee ----------- Scrolling tickertape GUIsNoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxesNotify ------------- Small notifications on the edge of the displayScrollbars ----------Automatically sized scrollbars with a single commandStringSize ---------- Automatically size controls to fit textToast -------------- Small GUIs which pop out of the notification area  Link to comment Share on other sites More sharing options...
clicked Posted June 6, 2012 Share Posted June 6, 2012 I have a networked set of participants, where one instance reads a command file that describes what command to run where, it marshals the command and sends it to the correct participant, which unpacks the command and CALLs it. I had a lot of trouble early on with array bounds problems, and tried Obfuscator with no success. However, the script runs great under ScITE and it never fails to find the exact failure line. Link to comment Share on other sites More sharing options...
Moderators Melba23 Posted June 6, 2012 Moderators Share Posted June 6, 2012 clicked,Thanks for that - I do the same thing from time to time but I wanted to make sure that you had a good reason for using Call as we see a lot of people using it unnecessarily. I quite agree that trying to find the error by running SciTE is the best idea - but at times it just does not work. Have you tried the #Obfuscator_Ignore_Funcs directive to prevent Obfuscator from stripping those functions from your script? It might be a solution if ever you need it. M23  Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind Open spoiler to see my UDFs: Spoiler ArrayMultiColSort ---- Sort arrays on multiple columnsChooseFileFolder ---- Single and multiple selections from specified path treeview listingDate_Time_Convert -- Easily convert date/time formats, including the language usedExtMsgBox --------- A highly customisable replacement for MsgBoxGUIExtender -------- Extend and retract multiple sections within a GUIGUIFrame ---------- Subdivide GUIs into many adjustable framesGUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView itemsGUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeViewMarquee ----------- Scrolling tickertape GUIsNoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxesNotify ------------- Small notifications on the edge of the displayScrollbars ----------Automatically sized scrollbars with a single commandStringSize ---------- Automatically size controls to fit textToast -------------- Small GUIs which pop out of the notification area  Link to comment Share on other sites More sharing options...
clicked Posted June 6, 2012 Share Posted June 6, 2012 Thanks Melba, #Obfuscator_Ignore_Funcs is new to me and I will try it. Link to comment Share on other sites More sharing options...
Elias Posted June 6, 2012 Author Share Posted June 6, 2012 Elias, The line numbers are different because of all the #include files that are added at the top of your script. The way to get round this is to compile the script using Obfuscator and the /Strip Only parameter - you need the full SciTE4AutoIt3 package to do this which you can download from here. This provides you with a ScriptName_Obfuscated.au3 file where the line numbers match those in the executable. But if you are sure that the error occurs in that line, you can add some errorchecking like this: If (Not IsArray($as)) Or (@Compiled And $as[UBound($as)] = "") Then $i=$i Now you will error if the array does not exist and you will not try to read a non-existent element. M23 Thanks Elias Link to comment Share on other sites More sharing options...
Elias Posted June 6, 2012 Author Share Posted June 6, 2012 Elias, The line numbers are different because of all the #include files that are added at the top of your script. The way to get round this is to compile the script using Obfuscator and the /Strip Only parameter - you need the full SciTE4AutoIt3 package to do this which you can download from here. This provides you with a ScriptName_Obfuscated.au3 file where the line numbers match those in the executable. But if you are sure that the error occurs in that line, you can add some errorchecking like this: If (Not IsArray($as)) Or (@Compiled And $as[UBound($as)] = "") Then $i=$i Now you will error if the array does not exist and you will not try to read a non-existent element. M23 I've got a lot of errors, I use a lot of CALL do to Removable/Addable #includes my Call works like a Swich -### StripOnly Error: Found Call() statement using unsolvable Func, which will/could lead to removal of Funcs that are used by the Call() statement. >### current Func: ProcessaMatriz D:PROGRAMMMSC_ConsultaSiscargaConsultaSisCargaConsultaSisCarga.au3(2758,1) Warning for line:If $IDENTBusy Then Call($IDENT & "_Timer") -############################################################################################# -#### Obfuscator Found 32 Error(s)!!!! This means your script could have problems running properly. #### -############################################################################################# - Iteration 1 Strip Functions result: Output 8418 lines and stripped 15749 lines - Iteration 2 Strip Variables result: Output 0 lines and stripped 0 lines Is there another way to get a continuous code .au3 ? tks Link to comment Share on other sites More sharing options...
Elias Posted June 6, 2012 Author Share Posted June 6, 2012 I have not managed to get the obfuscator approach to work for me because half of my functions are invoked as "CALL" commands, i.e. they look like dead code and I think Obfuscator removes them.This might be tweakable with a setting, but I've always managed to find these occurrences by running the script under ScITE. If your script requires command line parameters, there is a ScITE menu to provide this. If your script will run with F5, this is by far the most convenient way to find these errors.Thanksis what I'm doing now the problem is that the error is quit difficult to happen, is a system that automatize several secure pages for input an output data whit different uses of certificates in IE and communicates with a SQL server. Link to comment Share on other sites More sharing options...
Moderators Melba23 Posted June 6, 2012 Moderators Share Posted June 6, 2012 Elias,Did you see my comment to clicked above about using #Obfuscator_Ignore_Funcs? I admit I have not used it myself, but it should work if I understand the directive correctly. Other than that, did you try running the script from within SciTE on the same data to see if you can reproduce the error? That way you would get the correct line returned. M23  Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind Open spoiler to see my UDFs: Spoiler ArrayMultiColSort ---- Sort arrays on multiple columnsChooseFileFolder ---- Single and multiple selections from specified path treeview listingDate_Time_Convert -- Easily convert date/time formats, including the language usedExtMsgBox --------- A highly customisable replacement for MsgBoxGUIExtender -------- Extend and retract multiple sections within a GUIGUIFrame ---------- Subdivide GUIs into many adjustable framesGUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView itemsGUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeViewMarquee ----------- Scrolling tickertape GUIsNoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxesNotify ------------- Small notifications on the edge of the displayScrollbars ----------Automatically sized scrollbars with a single commandStringSize ---------- Automatically size controls to fit textToast -------------- Small GUIs which pop out of the notification area  Link to comment Share on other sites More sharing options...
Elias Posted June 6, 2012 Author Share Posted June 6, 2012 Elias,Did you see my comment to clicked above about using #Obfuscator_Ignore_Funcs? I admit I have not used it myself, but it should work if I understand the directive correctly. Other than that, did you try running the script from within SciTE on the same data to see if you can reproduce the error? That way you would get the correct line returned. M23Tried, didn´t workPlaces as #Obfuscator_Ignore_Funcs in the first colum Link to comment Share on other sites More sharing options...
Moderators Melba23 Posted June 6, 2012 Moderators Share Posted June 6, 2012 Elias,I have now tested the directive and it worked perfectly for me. You need these lines at the top of the script:#AutoIt3Wrapper_Run_Obfuscator=y #Obfuscator_Parameters=/so #Obfuscator_Ignore_Funcs=_Func_1,_Func_2,_Func_3,_Func_4Just replace the _Func_# names with the function names you do not want Obfuscator to strip. And have you tried running from within SciTE? M23  Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind Open spoiler to see my UDFs: Spoiler ArrayMultiColSort ---- Sort arrays on multiple columnsChooseFileFolder ---- Single and multiple selections from specified path treeview listingDate_Time_Convert -- Easily convert date/time formats, including the language usedExtMsgBox --------- A highly customisable replacement for MsgBoxGUIExtender -------- Extend and retract multiple sections within a GUIGUIFrame ---------- Subdivide GUIs into many adjustable framesGUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView itemsGUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeViewMarquee ----------- Scrolling tickertape GUIsNoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxesNotify ------------- Small notifications on the edge of the displayScrollbars ----------Automatically sized scrollbars with a single commandStringSize ---------- Automatically size controls to fit textToast -------------- Small GUIs which pop out of the notification area  Link to comment Share on other sites More sharing options...
Elias Posted June 6, 2012 Author Share Posted June 6, 2012 Elias, I have now tested the directive and it worked perfectly for me. You need these lines at the top of the script: #AutoIt3Wrapper_Run_Obfuscator=y #Obfuscator_Parameters=/so #Obfuscator_Ignore_Funcs=_Func_1,_Func_2,_Func_3,_Func_4 Just replace the _Func_# names with the function names you do not want Obfuscator to strip. And have you tried running from within SciTE? M23 Yes I'm using SciTE now to find the problem, I had to install the System at the client ans stay watching remotely. Link to comment Share on other sites More sharing options...
Elias Posted June 22, 2012 Author Share Posted June 22, 2012 Yes I'm using SciTE now to find the problem, I had to install the System at the client ans stay watching remotely.Hello, I run with SciTE, but the memory of the system overflew before , the problem occurred, is there a way to make the memory Buffer STDOUT rotating for de debug window?tks Link to comment Share on other sites More sharing options...
Elias Posted July 5, 2012 Author Share Posted July 5, 2012 Error Resolved, AutoIt Error: variable must be of type ObjectThis error was occurring in the AutoItScript 3.3.6.1 #include <IE.au3> in:Func __IEInternalErrorHandler() $IEComErrorScriptline = $oIEErrorHandler.scriptline ; <<< Error here : : If $_IEErrorNotify Or $__IEAU3Debug Then ConsoleWrite($IEComErrorOutput & @CRLF) SetError($_IEStatus_ComError) Return EndFunc ;==>__IEInternalErrorHandle ; Solution Func __IEInternalErrorHandler() If isObject($oIEErrorHandler) Then $IEComErrorScriptline = $oIEErrorHandler.scriptline ;: ;: Else $IEComErrorOutput = "$IEComErrorOutput is Not Object" EndIf If $_IEErrorNotify Or $__IEAU3Debug Then ConsoleWrite($IEComErrorOutput & @CRLF) SetError($_IEStatus_ComError) Return EndFunc ;==>__IEInternalErrorHandle Link to comment Share on other sites More sharing options...
Elias Posted July 5, 2012 Author Share Posted July 5, 2012 Error Solved, AutoIt Error: variable must be of type ObjectThis error was occurring in the AutoItScript 3.3.6.1 #include <IE.au3>Func __IEInternalErrorHandler() $IEComErrorScriptline = $oIEErrorHandler.scriptline ; <<< Error here ; ; If $_IEErrorNotify Or $__IEAU3Debug Then ConsoleWrite($IEComErrorOutput & @CRLF) SetError($_IEStatus_ComError) Return EndFunc ;==>__IEInternalErrorHandle ; Solution Func __IEInternalErrorHandler() If isObject($oIEErrorHandler) Then ; Solution is to test if is rely an Object $IEComErrorScriptline = $oIEErrorHandler.scriptline ; ; Else $IEComErrorOutput = "$IEComErrorOutput is Not Object" EndIf If $_IEErrorNotify Or $__IEAU3Debug Then ConsoleWrite($IEComErrorOutput & @CRLF) SetError($_IEStatus_ComError) Return EndFunc ;==>__IEInternalErrorHandle Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now