powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / Delphi [игнор отключен] [закрыт для гостей] / В каком месте лучше перехватить название интерфейсного обьекта
7 сообщений из 7, страница 1 из 1
В каком месте лучше перехватить название интерфейсного обьекта
    #40107765
hlopotun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем доброго дня,

есть интерфейсный класс:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
  TNNSession = class (TAutoIntfObject, INNSession)
  protected
    FSinks: TList <INNAdviseSink>;
    FOnEvent: TZavSessionEvent;
    FOnExecuteCommand: TNNSessionExecuteCommand;
    FAppEvents: TApplicationEvents;
    FRetryCount: integer;
    FUserID: widestring;
    FPassword: widestring;

    FDlgUebersicht: TDlgUebersicht;
    FNNMainManager: INNEcoManager;
.................




при его уничтожении в BeforeDestruction.inherited в System в процедуре
Код: pascal
1.
2.
3.
4.
5.
procedure TInterfacedObject.BeforeDestruction;
begin
  if RefCount <> 0 then
    Error(reInvalidPtr);
end;


попадаю на Error т.к. RefCount = 1
как проще выяснить на какой обьект счётчик ещё не сброшен если поставить breakpoint в этой процедуре?
пытаюсь понять какой интерфейсный обьект остался не уничтожен.

Спасибо.
...
Рейтинг: 0 / 0
В каком месте лучше перехватить название интерфейсного обьекта
    #40107778
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hlopotun,

бряк на увеличении RefCount не поможет?
...
Рейтинг: 0 / 0
В каком месте лучше перехватить название интерфейсного обьекта
    #40107788
hlopotun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
wadman
hlopotun,

бряк на увеличении RefCount не поможет?


попробую. Почемуто бряк перечёркивает когда прога стартует. Там вроде есть в среде где то настройка для компиляции и отладки системных либ и классов (дабы отладочную инфу для них включало). Сейчас поишу.

Бряк ставлю тут:
Код: pascal
1.
2.
3.
4.
function TObject.__ObjAddRef: Integer;
begin
  Result := AtomicIncrement(FRefCount);
end;


может по стеку удастся понять кто создаётся. Хотя тут заколебёшся считать. Тут обьектов куча....
...
Рейтинг: 0 / 0
В каком месте лучше перехватить название интерфейсного обьекта
    #40107789
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hlopotunкак проще выяснить на какой обьект счётчик ещё не сброшен если поставить
breakpoint в этой процедуре?

self->ClassName.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
В каком месте лучше перехватить название интерфейсного обьекта
    #40107796
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hlopotun
Бряк ставлю тут:

Это не тот метод. Смотри TInterfacedObject._AddRef/._Release;
...
Рейтинг: 0 / 0
В каком месте лучше перехватить название интерфейсного обьекта
    #40107798
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
type
  TNNSession = class(TInterfacedObject, INNSession, IInterface)
  protected
    function _AddRef: Integer; stdcall;
    function _Release: Integer; stdcall;
    // ...
  end;

{ TNNSession }

function TNNSession._AddRef: Integer;
begin
  Result := inherited; 
end;

function TNNSession._Release: Integer;
begin
  Result := inherited;
end;



Поставить бряк на оба метода, в свойствах обоих бряков поставить Break = False, Log Call Stack = True. (Опционально можно ещё Log Message).

Запустить программу и из окна View / Debug Windows / Events скопировать вывод в текстовый редактор. Пройтись по нему и удалить "парные" вызовы. Что останется - это и есть тот самый искомый вызов.

Предварительно хорошо бы щёлкнуть правой по окну Events, выбрать Properties и там снять галки со всего, кроме Breakpoint messages. Перезапустить программу.
...
Рейтинг: 0 / 0
В каком месте лучше перехватить название интерфейсного обьекта
    #40107943
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GunSmoker,

я так понимаю если бы он мог добавить в одном месте код, у него проблем бы не было
переопределил BeforeDestruction да вывел имя класса на ошибке
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / В каком месте лучше перехватить название интерфейсного обьекта
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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