|
|
|
Поймать злодея! (секция FINALIZATION)
|
|||
|---|---|---|---|
|
#18+
Здравствуйте все! достался древний унаследованный проект с туевой хучей модулей и форм. приложение при ЗАВЕРШЕНИИ стабильно ложится с 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. сиречь падаем на попытке освобождения какого-то самопального интерфейса (таковые густо рассыпаны по проекту). как-бы отловить модуль приводящий к такой хрени? модулей в проекте более 500 штук... убыв бы! (С) Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2020, 18:10 |
|
||
|
Поймать злодея! (секция FINALIZATION)
|
|||
|---|---|---|---|
|
#18+
Мимопроходящий, Я бы в ExitPrоc сделал сохранение имени класса освобождаемого интерфейса в файл лога. Имя класса того интерфейса, на котором валится, в лог не запишется. Далее ставим в ExitPrоc брикпоинт по условию, ну и далее по тексту ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2020, 18:59 |
|
||
|
Поймать злодея! (секция FINALIZATION)
|
|||
|---|---|---|---|
|
#18+
Мимопроходящий, дважды щёлкни по 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 именно того модуля, что вылетает. Ну или просто используй любой трейсер исключений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2020, 19:27 |
|
||
|
Поймать злодея! (секция FINALIZATION)
|
|||
|---|---|---|---|
|
#18+
Мимопроходящий, DLL-ки в составе проекта есть? На новую версию Delphi и/или новую версию ОС по сравнению с "безошибочными" временами, случайно, не переходили? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2020, 23:19 |
|
||
|
Поймать злодея! (секция FINALIZATION)
|
|||
|---|---|---|---|
|
#18+
Чисто теоретически: С проблемой скрытых интерфейсных ссылок сталкивался любой, кто пользуется dll-ями, экспортирующими интерфейсы. И даже не подозревая об этом (ActiveX, OLE, DirectX и т.п.). Ужели так сложно было за 20+ лет сделать опцию компилятора для их отключения? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2020, 01:23 |
|
||
|
Поймать злодея! (секция FINALIZATION)
|
|||
|---|---|---|---|
|
#18+
Соколинский Борис, Проще не использовать интерфейсы без крайней необходимости. И тем более в DLL. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2020, 01:23 |
|
||
|
Поймать злодея! (секция FINALIZATION)
|
|||
|---|---|---|---|
|
#18+
rgreat, Проще не забывать заворачивать внешнюю функцию в процедуру с out-параметром. Но иметь опцию компилятора было бы совсем хорошо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2020, 01:31 |
|
||
|
Поймать злодея! (секция FINALIZATION)
|
|||
|---|---|---|---|
|
#18+
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. GunSmokerНу или просто используй любой трейсер исключений.к проекту подключен EurekaLog 4.2.4, получил ELF-файл лога Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. модуль - часть проекта, но брякпоинт в функции CreateIndicies никак не срабатывает. следовательно, оно туда и не лезет (да и не должно в общем-то). а что же мы тогда видим в логе? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2020, 18:54 |
|
||
|
Поймать злодея! (секция FINALIZATION)
|
|||
|---|---|---|---|
|
#18+
в коллстеке Эврики иногда(редко) попадаются фальшивые вызовы, не стоит на этом особо заострять внимание. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2020, 19:19 |
|
||
|
Поймать злодея! (секция FINALIZATION)
|
|||
|---|---|---|---|
|
#18+
13.04.2020 19:19, Vizit0r пишет: > в коллстеке Эврики иногда(редко) попадаются фальшивые вызовы, не стоит на этом особо заострять внимание. если никто не гадит в память, этого быть не должно, имхо. а у меня тут всё что угодно может быть... Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2020, 19:25 |
|
||
|
Поймать злодея! (секция FINALIZATION)
|
|||
|---|---|---|---|
|
#18+
Мимопроходящийсреда задумалась немного, затем Execution Point встала на function _IntfClear(var Dest: IInterface): Pointer; Как это может быть, если ты бряк ставишь внутри функции FinalizeUnits, а не _IntfClear? Точно всё правильно сделано было? Возможно, у тебя исходник модуля System не соответствует бинарнику? Такое бывает в среде после всяких "хот патчей". Тогда ой. Можно попробовать восстановить соответствие, добавляя или удаляя пустые строки в модуль System выше по тексту. Ориентироваться можно на синие точке в редакторе - должны соответствовать тексту. Вон там Finalization в стеке, кстати. Это - что? Если два раза по нему щёлкнуть? Попадём в нужный unit? Насчёт EurekaLog 4 - это что-то совсем старое, но принцип должен быть тот же: Код: pascal 1. 2. 3. 4. 5. 6. Этот код оставит на стеке мусор от предыдущих вызовов - в том числе, старые адреса возврата. Следовательно, RAW-трассировка увидит эти вызовы и они будут в стеке. Это ложно-положительные вызовы. Но почему отсутствует строка для finalization на стеке - вопрос. Возможно, что-то не так с отладочной инфой? Если среда старая - там глюки линкера бывают. Если новая - EurekaLog 4, возможно, не знает как правильно с ней работать. Что-нибудь, типа деструкторов класса. Если совсем никак - можно стек вручную раскрутить. Открой CPU отладчик, там в окне стека правой кнопкой по значениям и Follow -> Near Code. Как только увидел какой-то модуль: это - оно. Можно по адресам угадывать, какие точно значения можно пропустить. 0019что-нибудь - это стек, пропускаем. 7что-нибудь - ядро, пропускаем. 0что-нибудь - какие-то DLL, можно проверить. 004что-нибудь-00Fчто-нибудь - твой exe-шник, это смотрим. У меня в отладчике примерно 30 значений между вылетом и модулем, из которых я проверил только четыре, все остальные - явно "левые". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2020, 21:08 |
|
||
|
Поймать злодея! (секция FINALIZATION)
|
|||
|---|---|---|---|
|
#18+
в логе EurekaLog'a есть момент: @IntfClear(Pointer($2768C1C) as IInterface вот это $2768C1C - что вообще такое? Может удастся получить имя класса с реализацией интерфейса и по нему вычислить юниты, где он задействован? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2020, 00:03 |
|
||
|
Поймать злодея! (секция FINALIZATION)
|
|||
|---|---|---|---|
|
#18+
Кроик Семён Может удастся получить имя класса с реализацией интерфейса https://www.transl-gunsmoker.ru/2010/09/7-interface-object.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2020, 13:14 |
|
||
|
|

start [/forum/topic.php?fid=58&gotonew=1&tid=2038407]: |
0ms |
get settings: |
5ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
40ms |
get topic data: |
8ms |
get first new msg: |
5ms |
get forum data: |
2ms |
get page messages: |
39ms |
get tp. blocked users: |
1ms |
| others: | 215ms |
| total: | 330ms |

| 0 / 0 |
