Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.06.11;
Скачать: CL | DM;

Вниз

Расположение кода в образе   Найти похожие ветки 

 
Alkid ©   (2006-05-15 18:08) [0]

Вопрос по "кишочкам" Дельфи (в частности Dlephi 5) -
если я в классе описаны методы в определённом порядке, то в каком
порядке будут они следовать в двоичном образе сегмента кода, загруженного в память процесса?
 Варианты (которые мне пришли в голову):
 1. В порядке объявления в заголовке класса.
 2. В порядке описания в секции implementation.
 3. В каком-то другом порядке.
 4. Какого-либо правила нет.

Суть проблемы состоит в том, что бы отследить происхождение одного
мистического обращения к уже уничтоженному объекту. Как вы знаете,
call stack в Дельфи реализован отвратительно (вот где MSVC можно брать за пример).


 
oldman ©   (2006-05-15 18:09) [1]


> отследить происхождение одного
> мистического обращения к уже уничтоженному объекту


мдя...


 
Alkid ©   (2006-05-15 18:12) [2]


> мдя...

Вот именно, мдя :)  Вы никогда не увлекались трассировкой стандартных библиотек Delphi в режиме дизассемблера? Очень советую как средство выжимания мозгов :)


 
oldman ©   (2006-05-15 18:14) [3]


> Alkid ©   (15.05.06 18:12) [2]


Я как-то увлекался русским языком... Очень советую...


 
oldman ©   (2006-05-15 18:18) [4]

Кто мешает выставить флаг "объект уничтожен", что бы не было "мистического обращения"?
Кстати, "мистическое обращение" - это что такое???


 
Alkid ©   (2006-05-15 18:18) [5]


> Я как-то увлекался русским языком... Очень советую...

Как средство выжимания мозгов? :) Разве что только как хобби, денег мне за это платить не будут, в отличие от программирования.


 
han_malign ©   (2006-05-15 18:21) [6]


> Как вы знаете, call stack в Дельфи реализован отвратительно (вот где MSVC
> можно брать за пример).

- если тебе так не нравится fastcall, используй cdecl... А для того чтобы "Дельфи" позаботился о твоем кривом коде, наподобие MSVC, достаточно влючить Compiler->Stack frames, Range checking и Owerflow checking... А адреса, построчно, можно посмотреть в map файле, если включить Linker->Map file->Detailed...
А увлекаться "трассировкой стандартных библиотек Delphi в режиме дизассемблера" - надо со включенным Use Debug DCU, чтобы мозги на место вжать...


 
Джо ©   (2006-05-15 18:24) [7]

> 1. В порядке объявления в заголовке класса.

По сабжу. Всегда думал, что 1 "В порядке объявления в заголовке класса".


 
TUser ©   (2006-05-15 18:26) [8]

По крайней мере просто процедуры (не методы классов) - в порядке следования в implementation. Думаю, что и методы тоже. Может не прав. Проверять лень.


 
Alkid ©   (2006-05-15 18:31) [9]


> - если тебе так не нравится fastcall, используй cdecl...
>  А для того чтобы "Дельфи" позаботился о твоем кривом коде,
>  наподобие MSVC, достаточно влючить Compiler->Stack frames,
>  Range checking и Owerflow checking... А адреса, построчно,
>  можно посмотреть в map файле, если включить Linker->Map
> file->Detailed...
> А увлекаться "трассировкой стандартных библиотек Delphi
> в режиме дизассемблера" - надо со включенным Use Debug DCU,
>  чтобы мозги на место вжать...

Зря Вы так презрительно. Я ведь не от жизни хорошей до этого дошёл, а от того, что описанное вами эффекта уже не дало:

В библиотеках я соглашение о вызове менять не могу,
Stack frames давно включено.
DEBUG DCUs в случае динамической линковки VCL эффекта не дают
(а статически линковать не мог, специфика проекта),
Range checking & Overflow checkings здесь роли не играют.
Map-file я тоже использовать не могу, ибо мне над маппить именно библиотеку, которая ещё фиг знает куда отобразится при загрузке.


 
Desdechado ©   (2006-05-15 18:32) [10]

а у меня, например, сразу возникло подозрение, что порядок следования зависит еще и от того, от чего наследуется класс и переопределяются ли в нем методы


 
begin...end ©   (2006-05-15 18:33) [11]

> Alkid ©   (15.05.06 18:08)

> Суть проблемы состоит в том, что бы отследить происхождение
> одного мистического обращения к уже уничтоженному объекту.

А каким образом эта проблема связана с вопросом о порядке размещения методов?


 
Alkid ©   (2006-05-15 18:33) [12]


> а у меня, например, сразу возникло подозрение, что порядок
> следования зависит еще и от того, от чего наследуется класс
> и переопределяются ли в нем методы

Сомневаюсь. Наследование играет роль в формировании таблицы виртуальных функций, а расположение кода функций в образе здесь ничего не меняет.


 
Alkid ©   (2006-05-15 18:36) [13]


> А каким образом эта проблема связана с вопросом о порядке
> размещения методов?

Дело в том, что непосредственно тот самый гадкий вызов осуществляет неидентифицированная функция, распологающаяся в памяти сразу перед конструктором TControl.Create(...). На первый взгляд кажется, что это он и есть, но анализ листинга дизассемблера говорит о том, что это не он, а другая функция (чётко виден эпилог конструктора, промежуточный nop и пролог этой функции). Вот и думаю, может быть, если я её идентифицирую и найду исходник,  то смогу разобраться, где я накосячил.


 
vrem   (2006-05-15 19:04) [14]

>Вопрос по "кишочкам"
Фраза респект! :)


 
DrPass ©   (2006-05-15 20:44) [15]


> Alkid ©   (15.05.06 18:36) [13]

А что тебе мешает дотрассировать до вызова этой функции? Не по исходникам, так в режиме CPU View? В Delphi же нет "черных ящиков", любой участок программы прозрачен и открыт.


 
TUser ©   (2006-05-16 08:52) [16]

Попробуй турбо-дебагером воспользоваться или идой.


 
Alkid ©   (2006-05-16 09:51) [17]


> А что тебе мешает дотрассировать до вызова этой функции?
>  Не по исходникам, так в режиме CPU View? В Delphi же нет
> "черных ящиков", любой участок программы прозрачен и открыт.

 Я тут фишку нарыл - иногда в Дельфёвом дизассемблере теряется указание того, что в конкретном адресе начинается функция из-за того, что дизассемблер слегка "промахивается" и начало функции не совпадает с границей его шага при отображении памяти.


> Попробуй турбо-дебагером воспользоваться или идой.

Спасибо, уже разобрался. При помощи окна модулей вычислил, что это был деструктор TControl.Destroy.



Страницы: 1 вся ветка

Текущий архив: 2006.06.11;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.045 c
2-1148501573
Юнкер
2006-05-25 00:12
2006.06.11
Как получить ответ от IdUDPServer ввиде структуры?


11-1128408923
Eugene_T
2005-10-04 10:55
2006.06.11
Конвертирование mp3 -> wav


15-1147448107
Muhan_
2006-05-12 19:35
2006.06.11
Надо узнать сколько человек пользуется моей программой..как?


2-1148361462
Konnor
2006-05-23 09:17
2006.06.11
Reboot


2-1148377208
Мурзилка
2006-05-23 13:40
2006.06.11
можно ли создать свой шрифт?