powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Поймать злодея! (секция FINALIZATION)
13 сообщений из 13, страница 1 из 1
Поймать злодея! (секция FINALIZATION)
    #39945960
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте все!

достался древний унаследованный проект с туевой хучей модулей и форм.
приложение при ЗАВЕРШЕНИИ стабильно ложится с Access violation at address XXXXXX in module 'proga.exe'.
ну и далее стандартное Runtime error 216 at ZZZZZZZZ.
подключил Debug DCU.
смотрю стэк...
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
@IntfClear(???)
FinalizeUnits
@Halt0
@Halt(???)
TComponent.DestroyComponent
DoneApplication
DoExitProc
@Halt0


сиречь падаем на попытке освобождения какого-то самопального интерфейса (таковые густо рассыпаны по проекту).

как-бы отловить модуль приводящий к такой хрени?
модулей в проекте более 500 штук...

убыв бы! (С)



Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Поймать злодея! (секция FINALIZATION)
    #39945981
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий,

Я бы в ExitPrоc сделал сохранение имени класса освобождаемого интерфейса в файл лога.
Имя класса того интерфейса, на котором валится, в лог не запишется.
Далее ставим в ExitPrоc брикпоинт по условию, ну и далее по тексту ...
...
Рейтинг: 0 / 0
Поймать злодея! (секция FINALIZATION)
    #39945995
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий, дважды щёлкни по FinalizeUnits, ставь бряк на "TProc(P)();", раскрой "Advanced", сними галку Break, а в Eval Expression введи Count (можно также: P), Log result должно быть включено, запускай и дай вылететь.

Как вылетело - смотри в Event Log последний вывод. Предположим, там написано Breakpoint Expression Count: 190. Удали бряк и поставь новый (на "TProc(P)();"). В Condition вводи Count = 190. Запускай и жди бряка. Входи по F7 (Step Into) в finalization именно того модуля, что вылетает.

Ну или просто используй любой трейсер исключений.
...
Рейтинг: 0 / 0
Поймать злодея! (секция FINALIZATION)
    #39946086
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий,

DLL-ки в составе проекта есть? На новую версию Delphi и/или новую версию ОС по сравнению с "безошибочными" временами, случайно, не переходили?
...
Рейтинг: 0 / 0
Поймать злодея! (секция FINALIZATION)
    #39946106
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чисто теоретически:
С проблемой скрытых интерфейсных ссылок сталкивался любой, кто пользуется dll-ями, экспортирующими интерфейсы. И даже не подозревая об этом (ActiveX, OLE, DirectX и т.п.).
Ужели так сложно было за 20+ лет сделать опцию компилятора для их отключения?
...
Рейтинг: 0 / 0
Поймать злодея! (секция FINALIZATION)
    #39946107
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соколинский Борис,

Проще не использовать интерфейсы без крайней необходимости. И тем более в DLL.
...
Рейтинг: 0 / 0
Поймать злодея! (секция FINALIZATION)
    #39946108
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,
Проще не забывать заворачивать внешнюю функцию в процедуру с out-параметром.
Но иметь опцию компилятора было бы совсем хорошо.
...
Рейтинг: 0 / 0
Поймать злодея! (секция FINALIZATION)
    #39946718
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GunSmoker
Мимопроходящий, дважды щёлкни по FinalizeUnits, ставь бряк на "TProc(P)();", раскрой "Advanced", сними галку Break, а в Eval Expression введи Count (можно также: P), Log result должно быть включено, запускай и дай вылететь.

Как вылетело - смотри в Event Log последний вывод. Предположим, там написано Breakpoint Expression Count: 190. Удали бряк и поставь новый (на "TProc(P)();"). В Condition вводи Count = 190. Запускай и жди бряка. Входи по F7 (Step Into) в finalization именно того модуля, что вылетает.
не помогло.
среда задумалась немного, затем Execution Point встала на function _IntfClear(var Dest: IInterface): Pointer;
всё того же модуля System
стек в этот момент:
Код: pascal
1.
2.
3.
4.
@IntfClear(Pointer($2768C1C) as IInterface)
Finalization
FinalizeUnits
@Halt0


GunSmokerНу или просто используй любой трейсер исключений.к проекту подключен EurekaLog 4.2.4, получил ELF-файл лога
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
---------------------------------------------------------------------
|Address |Module   |Unit         |Class|Procedure/Method      |Line |
---------------------------------------------------------------------
|004077A6|Prog.exe |system.pas   |     |_IntfClear            |17024|
|00407798|Prog.exe |system.pas   |     |_IntfClear            |17018|
|00666562|Prog.exe |CommProc.pas |     |CreateIndicies        |308  |
|004050C8|Prog.exe |system.pas   |     |FinalizeUnits         |10684|
|004053E5|Prog.exe |system.pas   |     |_Halt0                |11374|
|0040538C|Prog.exe |system.pas   |     |_Halt0                |11330|
|00F780E8|Prog.exe |Prog.dpr     |     |Prog                  |19   |
|7C90DC9A|ntdll.dll|             |     |NtSetInformationThread|     |
---------------------------------------------------------------------
меня смущает "псевдовызов" CreateIndicies из модуля CommProc.pas
модуль - часть проекта, но брякпоинт в функции CreateIndicies никак не срабатывает.
следовательно, оно туда и не лезет (да и не должно в общем-то).
а что же мы тогда видим в логе?
...
Рейтинг: 0 / 0
Поймать злодея! (секция FINALIZATION)
    #39946732
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в коллстеке Эврики иногда(редко) попадаются фальшивые вызовы, не стоит на этом особо заострять внимание.
...
Рейтинг: 0 / 0
Поймать злодея! (секция FINALIZATION)
    #39946740
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
13.04.2020 19:19, Vizit0r пишет:
> в коллстеке Эврики иногда(редко) попадаются фальшивые вызовы, не стоит на этом особо заострять внимание.

если никто не гадит в память, этого быть не должно, имхо.
а у меня тут всё что угодно может быть...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Поймать злодея! (секция FINALIZATION)
    #39946765
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящийсреда задумалась немного, затем Execution Point встала на function _IntfClear(var Dest: IInterface): Pointer;
Как это может быть, если ты бряк ставишь внутри функции FinalizeUnits, а не _IntfClear? Точно всё правильно сделано было?

Возможно, у тебя исходник модуля System не соответствует бинарнику? Такое бывает в среде после всяких "хот патчей". Тогда ой. Можно попробовать восстановить соответствие, добавляя или удаляя пустые строки в модуль System выше по тексту. Ориентироваться можно на синие точке в редакторе - должны соответствовать тексту.

Вон там Finalization в стеке, кстати. Это - что? Если два раза по нему щёлкнуть? Попадём в нужный unit?

Насчёт EurekaLog 4 - это что-то совсем старое, но принцип должен быть тот же:
Код: pascal
1.
2.
3.
4.
5.
6.
var
  Buffer[0..99] of Byte;
begin
  // нет FillChar
  // ...
end;


Этот код оставит на стеке мусор от предыдущих вызовов - в том числе, старые адреса возврата. Следовательно, RAW-трассировка увидит эти вызовы и они будут в стеке. Это ложно-положительные вызовы.

Но почему отсутствует строка для finalization на стеке - вопрос. Возможно, что-то не так с отладочной инфой? Если среда старая - там глюки линкера бывают. Если новая - EurekaLog 4, возможно, не знает как правильно с ней работать. Что-нибудь, типа деструкторов класса.

Если совсем никак - можно стек вручную раскрутить. Открой CPU отладчик, там в окне стека правой кнопкой по значениям и Follow -> Near Code. Как только увидел какой-то модуль: это - оно. Можно по адресам угадывать, какие точно значения можно пропустить. 0019что-нибудь - это стек, пропускаем. 7что-нибудь - ядро, пропускаем. 0что-нибудь - какие-то DLL, можно проверить. 004что-нибудь-00Fчто-нибудь - твой exe-шник, это смотрим. У меня в отладчике примерно 30 значений между вылетом и модулем, из которых я проверил только четыре, все остальные - явно "левые".
...
Рейтинг: 0 / 0
Поймать злодея! (секция FINALIZATION)
    #39946801
Фотография Кроик Семён
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в логе EurekaLog'a есть момент:

@IntfClear(Pointer($2768C1C) as IInterface


вот это $2768C1C - что вообще такое? Может удастся получить имя класса с реализацией интерфейса и по нему вычислить юниты, где он задействован?
...
Рейтинг: 0 / 0
Поймать злодея! (секция FINALIZATION)
    #39946947
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кроик Семён
Может удастся получить имя класса с реализацией интерфейса

https://www.transl-gunsmoker.ru/2010/09/7-interface-object.html
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Поймать злодея! (секция FINALIZATION)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]