Что нового

Как узнать что находится в скрипте в строке №?

inververs

AutoIT Гуру
Сообщения
2 135
Репутация
462
У меня скомпилированный скрипт выдает ошибку в строке 20362, мне нужно как то узнать что там? Как узнать? Нужно как то собрать все includes вместе в один большой файл.
 

veretragna

Как писал, так и работает.
Сообщения
140
Репутация
10
inververs, вот к примеру я всегда использую в своих проектах AU3Stripper. После компиляции в таком случае получается один большой скрипт со всеми includes (который будет лежать под тем же именем, только с суффиксом _Stripped), который можно потом пропустить через Tidy и получить тот же удобочитаемый код, но подходящий по списку строк к скомпилированному скрипту.
Ошибка на строке 10459? Нет проблем, идем в script_Stripped.au3 на строку 10459 и смотрим, на что ругается.
Скомпилированный экзешник и stripped скрипт я ложу в архив версий, чтобы можно было легко отследить ошибки.
Не уверен, что получилось хорошо, но, возможно, Вам это будет полезно.
 
Автор
inververs

inververs

AutoIT Гуру
Сообщения
2 135
Репутация
462
Исходник проверил с опцией Opt('MustDeclareVars', 1), нашел одно место где переменная не объявлена, поправил. Но не уверен что это то место.


Добавлено:
Сообщение автоматически объединено:

veretragna да, кажется подойдет, как AU3Stripper запускать, с какими параметрами?


Добавлено:
Сообщение автоматически объединено:

Я его запустил без параметров, он кажется повырезал не нужное и всего строк получилось 6660, явно не то
 

veretragna

Как писал, так и работает.
Сообщения
140
Репутация
10
inververs, можно вообще без параметров, или с параметром "/so" -оба эти варианта дают один и тот же результат. Все includes включаются в один файл, лишние пробелы и переносы строк убираются, лишние функции и переменные выбрасываются.

Для полностью отлаженной программы (релиз) я рекомендую использовать ключи "/so /rm" - в этом случае всем переменным и функциям скрипта присваиваются краткие 1- или 2-символьные имена, что порой очень серьезно повышает быстродействие.

Примеры:
До прохода AU3Stripper:
Код:
#include <Inet.au3>

$sFileHandle = FileOpen(@ScriptDir & "\ip.txt", 0)
;~ в файле ip.txt указано множество адресов сайтов (каждый с новой строки)
$array_IP = StringSplit(FileRead($sFileHandle), @CRLF)
FileClose($sFileHandle)

$sOpenHandle = FileOpen("Open.txt", 1)
For $i = 1 to $array_IP[0]
  If NOT(_INetGetSource($array_IP[$i]) = "") Then FileWrite($sOpenHandle, $array_IP[$i] & " доступен." & @CRLF)
Next
FileClose($sOpenHandle)


После прохода AU3Stripper (с ключом "/so")
Код:
Global Const $tagRECT = "struct;long Left;long Top;long Right;long Bottom;endstruct"
Global Const $tagREBARBANDINFO = "uint cbSize;uint fMask;uint fStyle;dword clrFore;dword clrBack;ptr lpText;uint cch;" & "int iImage;hwnd hwndChild;uint cxMinChild;uint cyMinChild;uint cx;handle hbmBack;uint wID;uint cyChild;uint cyMaxChild;" & "uint cyIntegral;uint cxIdeal;lparam lParam;uint cxHeader" &((@OSVersion = "WIN_XP") ? "" : ";" & $tagRECT & ";uint uChevronState")
Global Const $HGDI_ERROR = Ptr(-1)
Global Const $INVALID_HANDLE_VALUE = Ptr(-1)
Global Const $KF_EXTENDED = 0x0100
Global Const $KF_ALTDOWN = 0x2000
Global Const $KF_UP = 0x8000
Global Const $LLKHF_EXTENDED = BitShift($KF_EXTENDED, 8)
Global Const $LLKHF_ALTDOWN = BitShift($KF_ALTDOWN, 8)
Global Const $LLKHF_UP = BitShift($KF_UP, 8)
Global Const $tagOSVERSIONINFO = 'struct;dword OSVersionInfoSize;dword MajorVersion;dword MinorVersion;dword BuildNumber;dword PlatformId;wchar CSDVersion[128];endstruct'
Global Const $__WINVER = __WINVER()
Func __WINVER()
Local $tOSVI = DllStructCreate($tagOSVERSIONINFO)
DllStructSetData($tOSVI, 1, DllStructGetSize($tOSVI))
Local $aRet = DllCall('kernel32.dll', 'bool', 'GetVersionExW', 'struct*', $tOSVI)
If @error Or Not $aRet[0] Then Return SetError(@error, @extended, 0)
Return BitOR(BitShift(DllStructGetData($tOSVI, 2), -8), DllStructGetData($tOSVI, 3))
EndFunc
Global Const $INET_FORCERELOAD = 1
Func _INetGetSource($sURL, $bString = True)
Local $sString = InetRead($sURL, $INET_FORCERELOAD)
Local $iError = @error, $iExtended = @extended
If $bString = Default Or $bString Then $sString = BinaryToString($sString)
Return SetError($iError, $iExtended, $sString)
EndFunc
$sFileHandle = FileOpen(@ScriptDir & "\ip.txt", 0)
$array_IP = StringSplit(FileRead($sFileHandle), @CRLF)
FileClose($sFileHandle)
$sOpenHandle = FileOpen("Open.txt", 1)
For $i = 1 to $array_IP[0]
If NOT(_INetGetSource($array_IP[$i]) = "") Then FileWrite($sOpenHandle, $array_IP[$i] & " доступен." & @CRLF)
Next
FileClose($sOpenHandle)


После прохода AU3Stripper (с ключами "/so /rm")
Код:
Global Const $0 = "struct;long Left;long Top;long Right;long Bottom;endstruct"
Global Const $1 = "uint cbSize;uint fMask;uint fStyle;dword clrFore;dword clrBack;ptr lpText;uint cch;" & "int iImage;hwnd hwndChild;uint cxMinChild;uint cyMinChild;uint cx;handle hbmBack;uint wID;uint cyChild;uint cyMaxChild;" & "uint cyIntegral;uint cxIdeal;lparam lParam;uint cxHeader" &((@OSVersion = "WIN_XP") ? "" : ";" & $0 & ";uint uChevronState")
Global Const $2 = Ptr(-1)
Global Const $3 = Ptr(-1)
Global Const $4 = 0x0100
Global Const $5 = 0x2000
Global Const $6 = 0x8000
Global Const $7 = BitShift($4, 8)
Global Const $8 = BitShift($5, 8)
Global Const $9 = BitShift($6, 8)
Global Const $a = 'struct;dword OSVersionInfoSize;dword MajorVersion;dword MinorVersion;dword BuildNumber;dword PlatformId;wchar CSDVersion[128];endstruct'
Global Const $b = _7m()
Func _7m()
Local $c = DllStructCreate($a)
DllStructSetData($c, 1, DllStructGetSize($c))
Local $d = DllCall('kernel32.dll', 'bool', 'GetVersionExW', 'struct*', $c)
If @error Or Not $d[0] Then Return SetError(@error, @extended, 0)
Return BitOR(BitShift(DllStructGetData($c, 2), -8), DllStructGetData($c, 3))
EndFunc
Global Const $e = 1
Func _ah($f, $g = True)
Local $h = InetRead($f, $e)
Local $i = @error, $j = @extended
If $g = Default Or $g Then $h = BinaryToString($h)
Return SetError($i, $j, $h)
EndFunc
$k = FileOpen(@ScriptDir & "\ip.txt", 0)
$l = StringSplit(FileRead($k), @CRLF)
FileClose($k)
$m = FileOpen("Open.txt", 1)
For $n = 1 to $l[0]
If NOT(_ah($l[$n]) = "") Then FileWrite($m, $l[$n] & " доступен." & @CRLF)
Next
FileClose($m)



Добавлено:
Сообщение автоматически объединено:

Добавлено: AU3Stripper с ключами /so /rm распознает привязку функций также и в таких функциях, как Call, HotKeySet и прочих, которые принимают название функции в качестве аргумента, поэтому его использование в этих случаях полностью безопасно.
По крайней мере, у меня за более года использования проблем не возникало.
 

veretragna

Как писал, так и работает.
Сообщения
140
Репутация
10
inververs сказал(а):
Я его запустил без параметров, он кажется повырезал не нужное и всего строк получилось 6660, явно не то
Если теперь запустить скомпилированный скрипт и он будет выбрасывать ошибку, окно покажет обновленную информацию о положении ошибки, и Вы ничего не теряете.
 
Автор
inververs

inververs

AutoIT Гуру
Сообщения
2 135
Репутация
462
Ясно, нужно скомпилировать _stripped версию. Как вариант да, должно работать, но не очень удобно, нужно же как то повторить эту ошибку..
А есть у него ключ, который соберет в _stripped все, так же, как это делает компилятор?


Добавлено:
Сообщение автоматически объединено:

InnI да, вообщем как я понимаю, перед сборкой сперва запустится stripper, уберет все не нужное и в таком виде будет exe, а этот exe дополнительно ничего не повыкидывает? Не нужные функции, директивы итп?


Добавлено:
Сообщение автоматически объединено:

Ага, проверил, директивы убираются
Такой скомпилированный скрипт:
Код:
#cs ----------------------------------------------------------------------------

 AutoIt Version: 3.3.15.0 (Beta)
 Author:         myName

 Script Function:
	Template AutoIt script.

#ce ----------------------------------------------------------------------------

#pragma compile(Console, False)
; Script Start - Add your code below here
@exitCode


Выдает ошибку в первой строке
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 164
Репутация
2 329
inververs [?]
есть у него ключ, который соберет в _stripped все, так же, как это делает компилятор?
Можно скопировать содержимое всех вложенных файлов в начало главного скрипта (сохраняя порядок), и затем удалить все пустые строки, и строки с комментариями.
 
Автор
inververs

inververs

AutoIT Гуру
Сообщения
2 135
Репутация
462
CreatoR боюсь что это не возможно сделать руками и еще я не представляю какой будет порядок, проект очень большой.
 

veretragna

Как писал, так и работает.
Сообщения
140
Репутация
10
inververs если Вы используете AutoIt Compiler Wrapper, который поставляется вместе с полной версией SciTe (в контекстном меню скрипта пункт "Compile with options"), ничего ручками делать не надо. Достаточно в последней вкладке wrapper'a, которая как раз перед компиляцией запускает AU3Stripper, поставить галочку и прописать ключи, и wrapper все сделает за Вас - запустит Stripper и скомпилирует получившийся продукт.

inververs сказал(а):
А есть у него ключ, который соберет в _stripped все, так же, как это делает компилятор?
/mo : Just merges the Include files into the source and strips the Comments.
This is similar to [Программа для декомпиляции] and helps finding the errorline.

inververs сказал(а):
InnI да, вообщем как я понимаю, перед сборкой сперва запустится stripper, уберет все не нужное и в таком виде будет exe, а этот exe дополнительно ничего не повыкидывает? Не нужные функции, директивы итп?
Выбрасываются только неиспользуемые в данном скрипте функции и переменные, а все директивы Opt(), #RequireAdmin и прочие императивы остаются на своих местах. Поправка: кроме #pragma compile.


Добавлено:
Сообщение автоматически объединено:

Впрочем, оставлю еще и список ключей тут.

Possible Parameters:
/tl : Create Au3Stripper.Log with a trace of all actions.
/debug: add Debug information to Au3Stripper.Log.
/pe : Replace and reference to a Global Const variable with its actual value.
/so : This is the default when no parameters are provided. same as /sf + /sv
/sf : Strip all unused Func's
/sv : Strip all unused Global var records.
/mo : Just merges the Include files into the source and strips the Comments.
This is similar to [Программа для декомпиляции] and helps finding the errorline.
/mi : Sets the maximum Iterations Au3Stripper will perform. Default is 5.
/rm : Rename Variables and Functions to a shorter name.
/rsln: Replace @ScriptLineNumber with the actual line number.
/Beta: Use Beta Includes.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 703
veretragna сказал(а):
Впрочем, оставлю еще и список ключей тут.
А почему бы просто ссылку не оставить. Это же можно прочитать в SciTE по нажатию Ctrl+F1.


Добавлено:
Сообщение автоматически объединено:

inververs, что хоть за ошибка-то?
 
Автор
inververs

inververs

AutoIT Гуру
Сообщения
2 135
Репутация
462
Ошибка Variable used without being declared. Строка 20362
Запустил AU3Stripper с параметром /mo.
В строке 20362 находится Return _CommClosePort(), явно тут нет ошибки.

Проверил скрипт с опцией Opt('MustDeclareVars', 1), обнаружилось 1 не объявленная переменная. Поискал ее в xxx_stripped.au3 файле нашлась на позиции 12004.
Думаю это не то место.
Будем искать :smile:


Добавлено:
Сообщение автоматически объединено:

InnI да, это для примера было, что бы узнать в какой строке будет ошибка в скомпилированном скрипте.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 703
inververs сказал(а):
Ошибка Variable used without being declared.
И что, разве при проверке в SciTE эта ошибка не всплывает?
 

veretragna

Как писал, так и работает.
Сообщения
140
Репутация
10
inververs сказал(а):
Ошибка Variable used without being declared. Строка 20362
Запустил AU3Stripper с параметром /mo.
В строке 20362 находится Return _CommClosePort(), явно тут нет ошибки.
Возможно, ошибка возникает внутри самой функции _CommClosePort(), у меня бывали такие случаи при "хвостовом возврате". Проверьте еще и там на всякий случай?
 
Автор
inververs

inververs

AutoIT Гуру
Сообщения
2 135
Репутация
462
Yashied [?]
И что, разве при проверке в SciTE эта ошибка не всплывает?
Нет, все чисто.
veretragna [?]
Проверьте еще и там на всякий случай?
Там все ок, 24 строки в этой функции, не объявленных нет.

Исправил ту, единственную не объявленную переменную, соберу, буду поглядывать.
 

veretragna

Как писал, так и работает.
Сообщения
140
Репутация
10
inververs, а можно ли такое на форуме обсуждать? Тут, кажись, такого не любят.
 
Автор
inververs

inververs

AutoIT Гуру
Сообщения
2 135
Репутация
462
А я не буду его обсуждать.


Добавлено:
Сообщение автоматически объединено:

Узнал :-[
 
Верх