Автор Тема: [Ошибки] Как найти стоку ошибки в скомпилированном скрипте?  (Прочитано 317 раз)

0 Пользователей и 2 Гостей просматривают эту тему.

Оффлайн dimcomp [?]

  • Новичок
  • *
  • Сообщений: 62
  • Репутация: 0
  • Пол: Мужской
    • Награды
Доброго времени суток. Через, примерно, сутки работы программы вылазит ошибка recursion level has been exceeded и пишет строку где её искать, но программа обфусцирована и скомпилирована, поэтому строки не совпадают. Как найти где ошибка?
P.S. У меня она не выскакивает, поэтому запустив нескомпилированный скрипт у себя вычислить не могу.

Русское сообщество AutoIt


Оффлайн joiner [?]

  • Расмус-бродяга
  • AutoIt Гуру
  • *****
  • Сообщений: 2810
  • Репутация: 473
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Обфускатор на помойку. На данном языке золота не напишешь. Можно просто набыдлокодить и сам черт рога сломает, пытаясь постичь логику :)
По теме. Смотри исходник после обфускации. В нем номер строки. Смотри циклы с рекурсией. Где то пропущено условие. И превышается колличество циклрв рекурсии
Были времена, когда солнце было ярче, трава зеленее, а водка сорокоградуснее

Оффлайн dimcomp [?]

  • Новичок
  • *
  • Сообщений: 62

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
По теме. Смотри исходник после обфускации. В нем номер строки. Смотри циклы с рекурсией. Где то пропущено условие. И превышается колличество циклрв рекурсии
Если верить номеру строки ошибки после обфускации то ошибка в подключаемом инклюде GuiStatusBar.au3 в функции
Код: AutoIt [Выделить]
Func _GUICtrlStatusBar_SetText($hWnd, $sText = "", $iPart = 0, $iUFlag = 0)
    If $Debug_SB Then __UDF_ValidateClassName($hWnd, $__STATUSBARCONSTANT_ClassName)

    Local $fUnicode = _GUICtrlStatusBar_GetUnicodeFormat($hWnd)

    Local $iBuffer = StringLen($sText) + 1
    Local $tText
    If $fUnicode Then
        $tText = DllStructCreate("wchar Text[" & $iBuffer & "]")
        $iBuffer *= 2
    Else
        $tText = DllStructCreate("char Text[" & $iBuffer & "]")
    EndIf
    DllStructSetData($tText, "Text", $sText)
    If _GUICtrlStatusBar_IsSimple($hWnd) Then $iPart = $SB_SIMPLEID
    Local $iRet
    If _WinAPI_InProcess($hWnd, $__ghSBLastWnd) Then
        $iRet = _SendMessage($hWnd, $SB_SETTEXTW, BitOR($iPart, $iUFlag), $tText, 0, "wparam", "struct*")
    Else
        Local $tMemMap
        Local $pMemory = _MemInit($hWnd, $iBuffer, $tMemMap)
        _MemWrite($tMemMap, $tText)
        If $fUnicode Then
            $iRet = _SendMessage($hWnd, $SB_SETTEXTW, BitOR($iPart, $iUFlag), $pMemory, 0, "wparam", "ptr")
        Else
            $iRet = _SendMessage($hWnd, $SB_SETTEXT, BitOR($iPart, $iUFlag), $pMemory, 0, "wparam", "ptr")
        EndIf
        _MemFree($tMemMap)
    EndIf
    Return $iRet <> 0
EndFunc   ;==>_GUICtrlStatusBar_SetText

а именно в строке
Код: AutoIt [Выделить]
If $Debug_SB Then __UDF_ValidateClassName($hWnd, $__STATUSBARCONSTANT_ClassName)

Что тут не так?)

Оффлайн joiner [?]

  • Расмус-бродяга
  • AutoIt Гуру
  • *****
  • Сообщений: 2810
  • Репутация: 473
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
dimcomp
как вариант - запустить код в редакторе. пусть работает сутки. тогда точно строку найдешь.
насчет рекурсии - смотри свои функции( не библиотечные), в которых есть рекурсии


Русское сообщество AutoIt


Оффлайн dimcomp [?]

  • Новичок
  • *
  • Сообщений: 62

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
насчет рекурсии - смотри свои функции( не библиотечные), в которых есть рекурсии
Вобщем ошибка всё-таки в инклюде GuiStatusBar.au3 717 строка Return _SendMessage($hWnd, $SB_GETUNICODEFORMAT) <> 0
вот сама функция
Код: AutoIt [Выделить]
Func _GUICtrlStatusBar_GetUnicodeFormat($hWnd)
    If $Debug_SB Then __UDF_ValidateClassName($hWnd, $__STATUSBARCONSTANT_ClassName)

    Return _SendMessage($hWnd, $SB_GETUNICODEFORMAT) <> 0
EndFunc   ;==>_GUICtrlStatusBar_GetUnicodeFormat

Я примерно подсчитал, выходит после примерно 5000 записей в статус баре программа закрывается.
Что можно сделать? :'(

Оффлайн hedji [?]

  • Продвинутый
  • ***
  • Сообщений: 331
  • Репутация: 60
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Почитайте здесь и здесь
Общий совет - переписать без использования рекурсии.

Оффлайн joiner [?]

  • Расмус-бродяга
  • AutoIt Гуру
  • *****
  • Сообщений: 2810
  • Репутация: 473
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
dimcomp
откуда библиотека?
__UDF_ValidateClassName такой функции там нет.
насчет рекурсии,то я не увидел её в библиотеке
ошибка у тебя выпадает в функции с рекурсией. свои функции смотрел? анализировал?
ошибка ясно говорит, что превышен число циклов вызова функции в рекурсии.  значит где-то в функциях,которые писал ты или скопировал с форума пропущено условие.

Оффлайн dimcomp [?]

  • Новичок
  • *
  • Сообщений: 62

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
Всем спасибо! Дошло наконец))) Только я не пойму почему ошибка именно в этой строке появляется :think:. Нашёл в чём причина. Вот написал обрезанный код, но смысл тот же. Как исправить?
Код: AutoIt [Выделить]
#include <APIConstants.au3>
#include <WinAPIEx.au3>
#include <GuiStatusBar.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

global $y=0, $Radio1, $Radio2, $StatusBar1

form()

Func form()
Local $msg

$Form = GUICreate("Пример", 200, 100, -1, -1)
$Radio1 = GUICtrlCreateRadio("1", 16, 16, 65, 17)
GUICtrlSetState(-1, $GUI_CHECKED)
$Radio2 = GUICtrlCreateRadio("2", 16, 46, 65, 17)

$StatusBar1 = _GUICtrlStatusBar_Create($Form)
Dim $StatusBar1_PartsWidth[7] = [200, -1]
_GUICtrlStatusBar_SetParts($StatusBar1, $StatusBar1_PartsWidth)
_GUICtrlStatusBar_SetText($StatusBar1, "Нажмите F1", 0)

GUISetState(@SW_SHOW)
   
HotKeySet("{F1}", "enter")
   
    While 1
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE
                ExitLoop
        EndSwitch
    WEnd
    GUIDelete()
EndFunc

Func enter()

    If GUICtrlRead($Radio1) = 1 Then
       $nF = 1
    Endif
   
    If GUICtrlRead($Radio2) = 1 Then
       $nF = 2
    Endif

    While 1
        Switch $nF
            Case 1
                $nF = func1()
            Case 2
                $nF = func2()
            Case 3
                $nF = enter()  
        EndSwitch
    WEnd
   
EndFunc

func func1()
$y = $y + 1
_GUICtrlStatusBar_SetText($StatusBar1, $y, 0)
return 3
Endfunc

func func2()
MsgBox(4096, "Info", "Выберите радиокнопку '1'")
Endfunc
 


Русское сообщество AutoIt

Re: [Ошибки] Как найти стоку ошибки в скомпилированном скрипте?
« Ответ #7 Отправлен: Декабрь 05, 2018, 19:42:12 »

Оффлайн xXx [?]

  • Новичок
  • *
  • Сообщений: 42
  • Репутация: 11
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
У меня сейчас нет помпа под рукой,  но почитайте внимательно справку по функции
Код: AutoIt [Выделить]

а затем сделайте так
(нажмите для показа/скрытия)


Добавлено: Декабрь 05, 2018, 20:24:19
Функцию enter() надо бы притормозить при помощи sleep().


Добавлено: Декабрь 05, 2018, 20:28:36
и еще,  после нажатии F1 попробуйте закрыть GUI окно,  что произойдет?
« Последнее редактирование: Декабрь 05, 2018, 20:28:36 от xXx, Причина: Объединение сообщений »

Оффлайн dimcomp [?]

  • Новичок
  • *
  • Сообщений: 62

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
Вы имеете ввиду то что хоткей находится внутри функции? Да, пример составил не верно, но проблема не в этом. Функция энтер вызывает функцию1, а функция1 в свою очередь вызывает функцию энтер. Если я правильно понимаю это и есть рекурсия. А вот как избавиться от неё не знаю(. Тормоза энтера не спасут от рекурсии. При попытке закрыть окно счётчик замирает, после отпускания ЛКМ, продолжает дальше тикать, окно не закрывается и ждёт своего часа.

Оффлайн xXx [?]

  • Новичок
  • *
  • Сообщений: 42
  • Репутация: 11
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
(. Тормоза энтера не спасут
Не надо предпологать, нужно проверять.

.окно не закрывается и ждёт своего часа.
А что,  так и задумано?
« Последнее редактирование: Декабрь 06, 2018, 10:40:12 от xXx »

Оффлайн dimcomp [?]

  • Новичок
  • *
  • Сообщений: 62

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
Не надо предпологать, нужно проверять.
Проверил, оттягивает время только.
.окно не закрывается и ждёт своего часа.
А что,  так и задумано?
[/quote]
Нет не задумано, я думаю из-за того что программа работает и из-за этого не закрывается, если счётчик остановить, я думаю она бы закрылась. Это всего лишь пример, состряпанный на быструю руку, главное понять причину почему вылетает ошибка переполнения стека когда счётчик намотает 3894 очков. По этому примеру я уже исправлю основной скрипт.

Оффлайн xXx [?]

  • Новичок
  • *
  • Сообщений: 42
  • Репутация: 11
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
главное понять причину почему вылетает ошибка
Вам уже разъяснили
Почитайте здесь и здесь
Общий совет - переписать без использования рекурсии.

Код: AutoIt [Выделить]
#include <GuiStatusBar.au3>
#include <GUIConstantsEx.au3>

Opt("GUIOnEventMode", 1) ; Включает режим OnEvent
Global $iFlag = 0, $y = 0, $Radio1, $Radio2, $StatusBar1

HotKeySet("{F1}", "enter")
HotKeySet("{F2}", "enter_Stop")

$Form = GUICreate("Пример", 200, 100, -1, -1)
$Radio1 = GUICtrlCreateRadio("1", 16, 16, 65, 17)
GUICtrlSetState(-1, $GUI_CHECKED)
$Radio2 = GUICtrlCreateRadio("2", 16, 46, 65, 17)

$StatusBar1 = _GUICtrlStatusBar_Create($Form)
Dim $StatusBar1_PartsWidth[7] = [200, -1]
_GUICtrlStatusBar_SetParts($StatusBar1, $StatusBar1_PartsWidth)
_GUICtrlStatusBar_SetText($StatusBar1, "Нажмите F1", 0)
GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")
GUISetState(@SW_SHOW)

While 1
    If $iFlag Then
        enter()
    Else
        Sleep(100)
    EndIf
WEnd

Func enter()
    If BitAND(GUICtrlRead($Radio2), $GUI_CHECKED) Then
        MsgBox(4096, "Info", "Выберите радиокнопку '1'")
        Return 0
    EndIf

    $iFlag = 1

    $y += 1
    _GUICtrlStatusBar_SetText($StatusBar1, $y, 0)
EndFunc   ;==>enter

Func enter_Stop()
    $iFlag = 0
EndFunc   ;==>enter_Stop

Func CLOSEClicked()
    Exit
EndFunc   ;==>CLOSEClicked



Добавлено: Декабрь 05, 2018, 22:19:10
А вот так таймер не будет останавливаться при перетаскивании окна
(нажмите для показа/скрытия)
« Последнее редактирование: Декабрь 06, 2018, 13:28:55 от xXx »

Оффлайн joiner [?]

  • Расмус-бродяга
  • AutoIt Гуру
  • *****
  • Сообщений: 2810
  • Репутация: 473
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Функция enter в рекурсии и никаких условий выхода из рекурсии. Варианты решений. Не использовать рекурсию или сделать выход по счетчику циклов рекурсии, или выход после выполнения вложенных функций в функцию enter , или переписать всю логику кода.

Оффлайн dimcomp [?]

  • Новичок
  • *
  • Сообщений: 62

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
Всем спасибо! Буду разбираться.

Русское сообщество AutoIt

Re: [Ошибки] Как найти стоку ошибки в скомпилированном скрипте?
« Ответ #14 Отправлен: Декабрь 06, 2018, 11:09:05 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
70 Ответов
28481 Просмотров
Последний ответ Август 01, 2011, 00:59:34
от VladUs
3 Ответов
3399 Просмотров
Последний ответ Июнь 13, 2011, 01:58:06
от winstan
9 Ответов
4160 Просмотров
Последний ответ Март 02, 2012, 13:07:05
от vanekzver
2 Ответов
10902 Просмотров
Последний ответ Июнь 26, 2012, 19:14:00
от Yashied
11 Ответов
4048 Просмотров
Последний ответ Август 07, 2012, 06:00:22
от Кайгородов В. Ю.
1 Ответов
1411 Просмотров
Последний ответ Май 27, 2014, 17:13:04
от _dron_
2 Ответов
1496 Просмотров
Последний ответ Июнь 07, 2014, 17:44:49
от madmasles
7 Ответов
3098 Просмотров
Последний ответ Февраль 07, 2015, 16:28:48
от firex
2 Ответов
457 Просмотров
Последний ответ Ноябрь 13, 2017, 22:28:07
от Alofa
1 Ответов
441 Просмотров
Последний ответ Октябрь 25, 2018, 17:47:30
от xXx