Forum Replies Created
-
AuthorPosts
-
PostscripterParticipant
Уря :blush:
А что это было?
PostscripterParticipant[attachment=5463:Демка.zip]
PostscripterParticipantЕсть демка (!)
PostscripterParticipantтов.Support, если я запущу тим вьювер, это поможет? У вас есть время сегодня вечером?
PostscripterParticipantОй, точно) Та-ак.. пробую… Запустилось. Закрываю. Ну вот – вылетел на OnTimer. Обращение к уничтоженному компоненту… Отключаю скины – работает.
Теперь пробую останавливать таймеры перед закрытием. Теперь Access violation в модуле AC, в деструкторе. А тут без Support-a не обойтись. Зато ошибка стала стабильней. И возникает сразу, уже при первом заходе в процедуру. Вместо объекта-кнопки деструктору передаётся левый адрес.
Хм.. Классная штука 😉
PostscripterParticipantПодключил модуль SafeMMInstall первым в разделе uses, по инструкции. Запускаю – Assertion failure в первой же строчке этого модуля
Code:Assert(GetHeapStatus.TotalAllocated=0);Что-то не так, да? 🙂
PostscripterParticipantНе слышал про SafeMM… Попробую.
Quote:Я на эту строку смотрел наверное минут 10Сейчас на эту строку может глядеть только Support. Ибо 99$ 🙂
PostscripterParticipantААААаааа!! И точно – begin/end в Delphi это тот же самый dllMain! Чёрт… Я, кажется, сейчас нашёл решение другой не менее важной проблемы 😀 Вот как бывает… На wasm-е не смогли помочь, а тут… Прям анекдот. Большое спасибо)))
P.S. Но бага с АС пока не решилась.
PostscripterParticipantQuote:В таком случае тут вполне возможны проблемы с DllMainИнтересный бложек… Вот только в Казахстане он заблокирован 🙂 Приходится читать через японский прокси 😀
DllMain в этой dll вообще отсутствует… А то что между begin и end – оно считается??? Там у меня “тяжёлый” код, с вызовом DeviceIOControl и т.д.
PostscripterParticipant'Torbins' wrote:Помнится у вас там какая то дллка с формами подгружается. Вы не пробовали копать в эту сторону? Можно ли сделать, чтобы эта дллка не содержала ничего связаного с формами, а в случае необходимости вызывала внешнее приложение, способное отобразить нужную формочку?
Я собираюсь её переписать, но это далеко потом… Вообще, она никак не взаимодействует с программой, и тем более с AC. То есть программа о ней даже НЕ ЗНАЕТ. Но – факт, без неё не падает! Ну или это совпадение 😀
А подгружает её ОС, причём ко всем запускающимся программам, в момент запуска. То есть сразу после загрузки User32.dll. Библиотека просто делит одно адресное пространство с программой. Ааа.. Вот только что заметил! Почему-то к моей программе она подгружается только после возникновения ошибки, а не при старте!!! Что-то с ней точно не то… Надо разобраться…Извиняюсь, спутал. ОС подгружает эту библиотеку ко всем программам, в тот момент, когда они запускают другие программы. А в адресном пространстве моей программы библиотека появляется только в момент краха, потому что запускается Доктор Ватсон. Вот тут про неё рассказывается: http://www.wasm.ru/forum/viewtopic.php?pid=260991 в первом посте.
PostscripterParticipantВыводится AlphaControls v7.55
За совет по поводу TsSpeedButton спасибо, если ничего не решится, так и сделаю. Но это временно! Или, лучше, поставлю старую, проверенную прошлогоднюю версию.
А о причине возникновения этой ошибки есть какие-нибудь идеи, предположения?
Этот деструктор вызывается 7 раз для семи разных кнопок нормально, и на 8-й падает, при этом вместо указателя на кнопку – мусор. Либо (в большинстве случаев) не падает и отрабатывает 9 раз. При том, что у меня на форме 15 кнопок. Он не проходит по шести кнопкам, и примечательно – все шесть расположены на одном TGroupBox. Может быть, этот GroupBox просто ни разу не получал команды wm_Paint, т.к. его не видно…
Ну вот, ошибка опять спряталась… Ничего не менял! Перекомпилировал просто. Перезагрузился – появилась, довольно стабильно. Запустил под отладчиком – исчезла!!! Обычно так бывает, если где-нибудь в процедуре забыть инициализировать переменную, или выйти за границы массива. Один раз запускается – нормально, а второй – в этой области памяти появится случайное некорректное значение и всё развалится… В прошлый раз я писал – достаточно просто переименовать exe-шник и ошибки уже нет! Так что искать надо в этом направлении, думаю. А таймеры – это, вполне возможно, просто следствие. Процесс уничтожения формы обрывается с ошибкой, просто не дойдя до них. Вот они и работают дальше.
PostscripterParticipantВот! В этом и проблема. Таймеры я отключаю. Но ошибка теперь возникает в модуле acSBUTILS (версия 7.55) на строчке номер 9811, процедура TacSpeedButtonHandler.Destroy!!!!!!!!!!!!!!!!!! Вторая строчка после begin (не учитывая комментарии). Exception EAccessViolation in module project.exe at 000D8049. Access violation at address 004D8049 in module 'project.exe'. Write of address 00BBF714. Блин! Просто мегаподстава! 😐
PostscripterParticipantСрочно нужна помощь! В программе обнаружили уязвимость, а я не могу выложить исправление из-за этого дурацкого бага!
PostscripterParticipantКхм… Открываю тему. Оно опять упало, причём дважды. И опять в момент закрытия (закрывал через меню значка в трее).
Специально вызвать ошибку не получается…. Что делать? Версия компонент осталась та же 7.55, ничего в ней не менял.
PostscripterParticipantМожет просто на момент загрузки (и создания темы) это был последний релиз? Не помню..
Поставил 7.55 – пока работает. Но это ничего не значит – предыдущий тоже не сразу начал падать. Пока тему можно считать замороженной))) Спасибо.
PostscripterParticipantАААаа!!))) Какой я молодец. Чего-то нажал и адреса превратились в названия процедур. Итак, падает TacSpeedButtonHandler.Destroy. А вызывает её косвенно TacCtrlAdapter.RemoveAllItems из модуля SSkinProvider.
PostscripterParticipantПри выполнении этой загадочной процедуры по адресу esi+$44, лежит объект типа TSpeedButton (при каждом заходе новый), она с ним что-то делает. Процедура успешно отрабатывает семь раз (хотя кнопок на форме у меня больше). На восьмой раз – по этому смещению – просто мусор, который и вызывает access violation.
Может это как-то связано с тем, что некоторые из кнопок лежат за границами родительской панели и скрыты.
PostscripterParticipantQuote:Вроде ничего предосудительного, вот код для acSBUtils.pas версии 7.54 :Не, это не тот код. Видимо, у меня немного другая скомпилированная версия, в ней что-то чуть-чуть сдвинуто. В свойствах TSkinManager написано – 7.51, хотя я скачивал свежий архив вот совсем недавно, когда начал тему.
Там должен быть участок кода, где сначала идут две исполняемые строки (делфи подсвечивает их зелёными точками сбоку), затем шесть неисполняемых, затем – три исполняемых. Посмотрите расположение точек на скриншоте. Предположительно, это одна процедура, скорее всего чей-то деструктор. Процедура вызывается семь раз и только при уничтожении формы. На восьмой – падает и процесс уничтожения формы прерывается. А так как до таймеров “уничтожалка” ещё не добралась, и теперь уже не доберётся, они спокойно себе работают. Думаю, так.
Читабельный стек получить не могу — или не умею, или в объектный файл имена процедур не включаются. Да это и не важно, если это деструктор. Но есть ассемблерный код этой процедуры + состояние регистров в момент краша. Вот:
[attachment=5280:1.png]
[attachment=5281:2.png]
[attachment=5282:3.png]
[attachment=5283:4.png]
[attachment=5284:5.png]
November 6, 2011 at 2:50 pm in reply to: Диалог без скина при проверке, запущено ли приложение #47130PostscripterParticipant1) “Непонятный” означает “непонятно зачем оно нужно”
2) тоже что и (1). но программа ваша – тут я вам не советчик
PostscripterParticipantХотя по-хорошему, конечно, при поступлении WM_QUERYENDSESSION, “each application should return TRUE or FALSE immediately“. Но это вряд ли причина.
P.S. Я один раз так попал с WMDeviceChange – в новых виндах, если не вернуть управление немедленно, новое устройство работать не будет.
-
AuthorPosts