Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2006.06.11;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.02 c
2-1148566518
cardexc
2006-05-25 18:15
2006.06.11
Исключительная ситуация


2-1148368133
Roman_ln
2006-05-23 11:08
2006.06.11
Алгорим перевода из десятичной в двоичную СС


15-1148041595
vecna
2006-05-19 16:26
2006.06.11
Microsoft опубликовала системные требования к Windows Vista


2-1148734729
NewerWinterNight
2006-05-27 16:58
2006.06.11
Помогите!!! Не могу запустить проект.


15-1147842240
klever
2006-05-17 09:04
2006.06.11
Имя переменной, которая хранит версию Windows





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский