Безопасная отладка субклассинга

Для неординарных вопросов. Если вы опытный программист, попавший в трудную ситуацию, — вам сюда.

Модератор: gaidar

Правила форума
Этот раздел не предназначен для того, чтобы вы адресовали свою проблему профессионалам.
Этот раздел предназначен для профессионалов, которые столкнулись с проблемой и не могут решить ее самостоятельно.
Если вы считаете себя профессионалом, а свою проблему сложной — вам сюда.
Если модератор посчитает, что вы ошиблись, то на первый раз он перенесет ваше сообщение в основной раздел без последствий для автора. Во второй раз тема будет закрыта, а автору будет выписано нарушение. В третий раз автор будет забанен.
arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Безопасная отладка субклассинга

Сообщение arthur2 » 01.05.2009 (Пт) 14:39

Чтобы этого добиться, перенес на время отладки winproc в библиотеку. Там проверяю, в каком мы сейчас режиме. Если запуск, то пересылаю все праметры обратно в проект, в родную winproc, если на паузе - не пересылаю :)
Код: Выделить всё
Public Function winProc(ByVal hwnd As Long _
                  , ByVal uMsg As Long, ByVal wparam As Long _
                  , ByVal lparam As Long) As Long
'    On Error Resume Next
    Select Case EbMode
    Case 1 'IDE в режиме запуска
       If IsBadCodePtr(origAddr) Then
         'сюда ни разу не заходили, значит дохнем не от этого
          Put #fLog , ,"указатель уже умер" & vbcrlf
          MsgBox "дохлый указатель"
          winProc = DefWindowProc(hwnd, uMsg, wparam, lparam)
       Else
'          пересылаем всё обратно в проетк
          winProc = CallWindowProc(origAddr, hwnd, uMsg, wparam, lparam)
       End If
    Case 2 'IDE в режиме паузы
        winProc = DefWindowProc(hwnd, uMsg, wparam, lparam)
    Case Else 'case 0' нас остaновили или просто завершили работу
         Put #fLog , ,"нас убили End-ом или кнопкой" & vbcrlf
        winProc = DefWindowProc(hwnd, uMsg, wparam, lparam)
        Call SetWindowLong(hwnd, GWL_WNDPROC, oldProc)
    End Select
End Function

В общем-то всё работает нормально: можно останавливать проект кнопкой, можно приостанавливать кнопкой и stop-ом, можно обрабатывать ошибки и смотреть пошагово...

Единственное, что так и не получается - проект дохнет-таки по End-у в коде (по кнопке из тулбара - не дохнет!).

Причем, при End-е в проекте библиотека отрабатывает нормально: и class_terminate наступает, и субклассинг снимается, а проект всё равно дохнет...

Подскажите, из-за чего и как побороть?
Вложения
sbClssDebug.zip
(12.51 Кб) Скачиваний: 428
Артур
 
   

trash
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 113
Зарегистрирован: 28.01.2009 (Ср) 12:09

Re: Безопасная отладка субклассинга

Сообщение trash » 04.05.2009 (Пн) 11:41

Из-за того, что команда End глючная. Побороть можно отказавшись от нее.

OMG, MsgBox в оконной процедуре >_<

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Безопасная отладка субклассинга

Сообщение iGrok » 04.05.2009 (Пн) 16:13

trash писал(а):MsgBox в оконной процедуре >_<

И что с того?
label:
cli
jmp label

trash
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 113
Зарегистрирован: 28.01.2009 (Ср) 12:09

Re: Безопасная отладка субклассинга

Сообщение trash » 04.05.2009 (Пн) 17:10

Хм, действительно ничего. :scratch: Просто помню, когда-то давно были какие-то проблемы в такой ситуации.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Безопасная отладка субклассинга

Сообщение iGrok » 04.05.2009 (Пн) 17:49

trash писал(а):Хм, действительно ничего. :scratch: Просто помню, когда-то давно были какие-то проблемы в такой ситуации.

Проблемы появляются, к примеру, при возникновении необработанного исключения в оконной процедуре. Ну или если там вызывается что-то, что напрочь тормозит дальшейшую обработку. Не могу сходу подобрать подходящий пример.
label:
cli
jmp label

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Re: Безопасная отладка субклассинга

Сообщение Debugger » 04.05.2009 (Пн) 17:51

можно останавливать проект кнопкой

Странно. Когда я нажимаю кнопку End на тулбаре, эффект такой же, как от кодового End.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Безопасная отладка субклассинга

Сообщение arthur2 » 06.05.2009 (Ср) 22:19

Debugger писал(а):Странно. Когда я нажимаю кнопку End на тулбаре, эффект такой же, как от кодового End.
Видимо, ты жмешь энд в момент пошагового выполнения. По уточненным сведениям, проблема выглядит так:

Проект спокойно переживает энд, если в момент остановки не работала ни какая процедура. Ну, то есть, если просто нажать кнопку энд или если сначала нажать паузу, а потом энд.

А если энд жать в момент пошагового выполнения, этого бейсик не выдерживает. То же самое, если в окне ошибки выбрать "прервать"

Чуть более продуктивно обсудили вот здесь: http://forum.sources.ru/index.php?showt ... &p=2256708
Правда, вердикт там, увы, неутешительный:
ANDLL писал(а):но раз не работает, то увы. Других идей вроде нет

ANDLL предложил после того, как нажат энд, запустить цикл:
Код: Выделить всё
        Do While GetMessage(ms, 0, 0, 0)
        TranslateMessage ms
        DispatchMessage ms
        Loop
        ExitThread 0

Я ставлю это в Class_terminate по условию, что нажат или вызван энд. Это позволяет среде не вылетать по энду. Редактор оказывается доступен, в нем можно писать, можно спокойно закрыть бейсик - и он предложит сохранить изменения (если они были).

Но только останов оказывается недоостановленным! :(

В общем, пока будет пока так:
Если нажать энд, будет выскакивать сообщение, что, мол, при субклассинге энд - не хорошо, и больше, мол, так не делайте. Бейсик закроется (предложив сохраниться, если нужно) и выдаст сообщение, мол, а не хотите ли перезагрузить проект.

Хотя хотелось бы найти нормальное решение... надеюсь, оно возможно :)
Вложения
sbClssDebug.zip
то же самое с предостережением, что энд не хорошо, и с перезагрузкой проекта
(22.23 Кб) Скачиваний: 599
Артур
 
   

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Безопасная отладка субклассинга

Сообщение arthur2 » 09.07.2009 (Чт) 21:28

Я понял, почему оно падает :)

Энд у меня вызывался после клика на кнопке, лежащей на субклассируемом окне. Поэтому клик по этой кнопке тоже субклассировался. Поэтому после энда происходил возврат в процедуру окна, которой уже не было. По-сути, End происходил прямо внутри winproc :(

В общем, субклассинг не причём, и снятие его не поможет. Установил субклассинг не на оконо, в коде которого вызывается энд, а на другое окно, и среда от энда падать перестала.

Понять-то понял, зато идей, как обойти, теперь уже больше нет.
Вложения
sbClssDebug.zip
(12.35 Кб) Скачиваний: 414
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Безопасная отладка субклассинга

Сообщение Хакер » 10.07.2009 (Пт) 4:17

Ты хочешь сказать, что всё падает от того, что End вызывается внутри твоего WindowProc'а?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Безопасная отладка субклассинга

Сообщение arthur2 » 10.07.2009 (Пт) 4:21

Я хочу сказать, что если End вызвать не из события, которое тоже субклассируется, то ничего не падает. Как я себе это объяснил, возможно, и не правильно. Но факт остаётся фактом: если вызывать End из другого, не субклассируемого окна, всё ништяк.
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Безопасная отладка субклассинга

Сообщение Хакер » 10.07.2009 (Пт) 4:29

Я не спрашивал условия ништяка, я спрашивал условия падения.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Безопасная отладка субклассинга

Сообщение arthur2 » 10.07.2009 (Пт) 4:34

Условия падения: энд вызывается из кода того окна, которое субклассируется.

Хакер писал(а):Ты хочешь сказать, что всё падает от того, что End вызывается внутри твоего WindowProc'а?
Я полагал, что внутри родной winproc.
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Безопасная отладка субклассинга

Сообщение Хакер » 10.07.2009 (Пт) 4:42

End может вызываться только из какого-то кода, никак не из окна или из курсора.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Безопасная отладка субклассинга

Сообщение arthur2 » 10.07.2009 (Пт) 4:47

Переформулирую:

Условия падения: End вызывается из кода события, которое было синициировано одним из перехватываемых сообщений.
Последний раз редактировалось arthur2 10.07.2009 (Пт) 4:52, всего редактировалось 1 раз.
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Безопасная отладка субклассинга

Сообщение Хакер » 10.07.2009 (Пт) 4:52

Но если перехвата нет, то нет и краха.

У тебя есть объяснение этого явления?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Безопасная отладка субклассинга

Сообщение arthur2 » 10.07.2009 (Пт) 4:55

Если перехват есть, но энд вызван из кода, который не перехватывается, то краха тоже нет.

Внятного объяснения у меня нет, так как кухню со всякими пушами и ретами я совершенно не представляю. А интуитивное объяснение я уже попытался дать :)
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Безопасная отладка субклассинга

Сообщение Хакер » 10.07.2009 (Пт) 5:36

А ты в курсе, что End приведёт к краху даже если будет вызван прямо из WindowProc'а? Можешь объяснить, почему это происходит?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Безопасная отладка субклассинга

Сообщение arthur2 » 10.07.2009 (Пт) 5:40

Хакер писал(а):А ты в курсе, что End приведёт к краху даже если будет вызван прямо из WindowProc'а?
arthur2 писал(а):По-сути, End происходил прямо внутри winproc :(
Объяснить не могу :oops:
Артур
 
   

NashRus
Постоялец
Постоялец
 
Сообщения: 388
Зарегистрирован: 18.03.2006 (Сб) 1:16

Re: Безопасная отладка субклассинга

Сообщение NashRus » 10.07.2009 (Пт) 10:32

На End и на кнопку остановки окну приходит WM_DESTROY (ну или как там...) ?
На WM_DESTROY снимать subclass.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Безопасная отладка субклассинга

Сообщение Хакер » 10.07.2009 (Пт) 10:48

NashRus, если в своей WP первым же делом снять сабклассинг и вызвать End, то среда всё равно закроется. И это при том, что на момент вызов End'а всё будет в ровно таком же положении, как до установки сабклассинга.

Есть что-то, что ни я ни артур не учитываем. Только вот я не копал, а у него время было.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Безопасная отладка субклассинга

Сообщение arthur2 » 10.07.2009 (Пт) 16:34

NashRus писал(а):На End и на кнопку остановки окну приходит WM_DESTROY (ну или как там...) ?
На WM_DESTROY снимать subclass.
Если ты посмотришь чуть раньше обсуждение, например, первый топик, то увидишь, что энд я ловлю раньше, чем приходит дестрой, и субклассинг снимаю, но это не помогает.

Хакер писал(а):Есть что-то, что ни я ни Артур не учитываем. Только вот я не копал, а у него время было.
Время-то у меня, конечно, было :) Пытаюсь копать уже месяца полтора. И ложный след брал уже несколько раз. Но я делаю всё на ощупь и по догадкам, интуитивно.

Надо бы понять, как вообще работает End в среде.
Артур
 
   

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Безопасная отладка субклассинга

Сообщение arthur2 » 10.07.2009 (Пт) 17:19

Хакер писал(а):И это при том, что на момент вызов End'а всё будет в ровно таком же положении, как до установки сабклассинга.

Есть что-то за кулисами, что вызывает winproc. (DispatchMessage?) И на момент нашего энда мы находимся как раз внутри этого чего-то. И энд или не энд, но мы в это что-то вернёмся. А оно уже выгружено... Нет?
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Безопасная отладка субклассинга

Сообщение Хакер » 10.07.2009 (Пт) 17:21

DispatchMessage не выгрузится от того, что мы сделаем End.
Между DispatchMessage и нашем P-кодным WP есть ещё Native-кодный посредник. Я думал, что проблема в том, что именно он выгружается, и возврат происходит в него.

Нифига, если следовать такой логике, то вызов End-а из функции, которая вызвана через CallWindowProc, тоже должен привести к закрытию среды. Но я проверил: не приводит. Кроме того, я проверил, возвращается ли выполнение из процедуры, в которой был вызван End, туда, откуда вызвана процедуры и убедился, что не возвращается. Так что возврат в выгруженный код сразу надо исключить.

Вообще, то что среда закрывается молча и тихо сильно напоминает ситуацию, когда переполняется стек.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Безопасная отладка субклассинга

Сообщение arthur2 » 10.07.2009 (Пт) 17:42

Хакер писал(а):Вообще, то что среда закрывается молча и тихо сильно напоминает ситуацию, когда переполняется стек.

Ну я ведь перенёс winproc во внешнюю библиотеку, а энд вызывается в проекте. После этого код в библиотеке не напрягаясь ловить этот энд. Я могу там делать что угодно - например, запустить messagebox, и пока этот бокс висит, среда живёт, доступна, позволяет редактировать код, закрыть бейсик и сохранить проект перед закрытием.

Но - среда вылетает после того, как дотерменится класс в моей библиотеке.
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Безопасная отладка субклассинга

Сообщение Хакер » 10.07.2009 (Пт) 18:00

Код в студию.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Безопасная отладка субклассинга

Сообщение arthur2 » 10.07.2009 (Пт) 18:10

Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Безопасная отладка субклассинга

Сообщение Хакер » 10.07.2009 (Пт) 18:46

Код, а не ссылку на пост, содержащий две ссылки на код, где непонятно, которую из ссылок брать.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Безопасная отладка субклассинга

Сообщение arthur2 » 10.07.2009 (Пт) 19:02

Артур
 
   

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Безопасная отладка субклассинга

Сообщение arthur2 » 10.07.2009 (Пт) 20:48

всё, я решил... Но к сожалению, не так, как хотелось бы.

Я зашёл с другого конца. У меня есть пример субклассинга, который не падает. Раньше я не знал, как к нему подступиться, а в свете вчерашнего открытия сообразил.

Итак, в этом непадающем примере я ставлю бряк на клик по кнопке и прохожу пошагово. После выхода из события я... не оказываюсь в winproc. Поэтому энд и не роняет среды, что он не внутри winproc.

Решение: callwindowproc должен быть тоже вынесен во внешнюю библиотеку (или заглушку), а в проекте вместо одной должно быть две функции, обрабатывающие сообщения - до этого и после этого (winproc их уже вряд ли правомочно называть).

При таком подходе бейсик от энда не рушится. Но теряется то, чего мне хотелось добиться - чтобы в проекте была классическая winproc. Так что хочется надеяться, что можно как-то решить и в моём варианте :)
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Безопасная отладка субклассинга

Сообщение Хакер » 10.07.2009 (Пт) 20:51

Ты думаешь, что виноват CallWindowProc?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

След.

Вернуться в Раздел для Профессионалов

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12

    TopList