![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сенсация! Код initialization может не выполнятся! [D7, Win2k, WinXP]
MikProg © (2006-07-11 21:37:00)Написана прога. С целью сериализации в секции initialization семи унитов регистрируется описанные в них классы через registerclass. Фенька в следующем: у меня программа работает, у клиента нет. Вставленные в секцию инициализации отладочные строки для записи в файл пишут лог в порядке инициализации модулей. В логе запуска на моей машине (XP и Win2k) отметился каждый из 7 модулей. В логе запуска того же экзешника у клиента (Win2k) отметились тольк 3 из 7 модулей !!! Это полный трындец! Я понимаю что могу грубо регистрировать классы где нибудь в одном месте, но это есть покушение на устои! Кто нибудь может объяснить?
MikProg (2006-07-16 09:13:00) [1]Удалено модератором
Примечание: Offtopic
Суслик (2006-07-16 00:30:00) [2]Удалено модератором
Примечание: Offtopic
MikProg (2006-07-15 23:47:00) [3]Удалено модератором
Примечание: Offtopic
Игорь Шевченко (2006-07-15 22:07:00) [4]MikProg © (15.07.06 21:59) [108]
> Что? От порядка зависит кто вообще будет инициализирован,
> а кто упадет в игнор?
Ты переоцениваешь мои телепатические способности - я не знаю твоего кода.
> Невозможно тестировать весь код!
Возможно.
MikProg (2006-07-15 21:59:00) [5]
> Изменился порядок выполнения секций Initialization
Что? От порядка зависит кто вообще будет инициализирован, а кто упадет в игнор?
> нужно запоминить, что с initialization бывают некоторые
> глюки,
Похоже я перестану их использовать. Невозможно тестировать веськод!
Суслик (2006-07-15 11:33:00) [6]
> Проблема решилась включением LayerBase в проект. Чтобы это
> значило?
1. нужно сказать спасибо Диме Тимохову :)
2. нужно запоминить, что с initialization бывают некоторые глюки, но их точно не бывает, если все используемые модуля приведены с проекте или в пакетах (если ты их используешь).
ЗЫ. На самом деле с пакетами там тоже не все просто. Ситуация (я тут о ней спрашивал но ушло в историю).
1. есть приложение А
2. есть пакет Б, который приложение А загружает с использованием loadpackage.
3. есть пакет В, который указан в секции requires пакета Б, но про него не знает ничего приложение А.
4. в пакете В есть два модуля М1 и М2.
5. М1 используется (есть в секции uses) в одном из модулей пакета Б.
6. М2 не используется ниииииигде.
В итоге секция инициализации в М2 выполнена не будет.
ЗЫЫ. Надеюсь в примере не ошибся. :)
В итоге при
Суслик (2006-07-15 11:33:00) [7]
> Проблема решилась включением LayerBase в проект. Чтобы это
> значило?
1. нужно сказать спасибо Диме Тимохову :)
2. нужно запоминить, что с initialization бывают некоторые глюки, но их точно не бывает, если все используемые модуля приведены с проекте или в пакетах (если ты их используешь).
ЗЫ. На самом деле с пакетами там тоже не все просто. Ситуация (я тут о ней спрашивал но ушло в историю).
1. есть приложение А
2. есть пакет Б, который приложение А загружает с использованием loadpackage.
3. есть пакет В, который указан в секции requires пакета Б, но про него не знает ничего приложение А.
4. в пакете В есть два модуля М1 и М2.
5. М1 используется (есть в секции uses) в одном из модулей пакета Б.
6. М2 не используется ниииииигде.
В итоге секция инициализации в М2 выполнена не будет.
ЗЫЫ. Надеюсь в примере не ошибся. :)
В итоге при
Суслик (2006-07-15 11:33:00) [8]
> Проблема решилась включением LayerBase в проект. Чтобы это
> значило?
1. нужно сказать спасибо Диме Тимохову :)
2. нужно запоминить, что с initialization бывают некоторые глюки, но их точно не бывает, если все используемые модуля приведены с проекте или в пакетах (если ты их используешь).
ЗЫ. На самом деле с пакетами там тоже не все просто. Ситуация (я тут о ней спрашивал но ушло в историю).
1. есть приложение А
2. есть пакет Б, который приложение А загружает с использованием loadpackage.
3. есть пакет В, который указан в секции requires пакета Б, но про него не знает ничего приложение А.
4. в пакете В есть два модуля М1 и М2.
5. М1 используется (есть в секции uses) в одном из модулей пакета Б.
6. М2 не используется ниииииигде.
В итоге секция инициализации в М2 выполнена не будет.
ЗЫЫ. Надеюсь в примере не ошибся. :)
В итоге при
Игорь Шевченко (2006-07-14 23:26:00) [9]
> Проблема решилась включением LayerBase в проект. Чтобы это
> значило?
Изменился порядок выполнения секций Initialization
MikProg (2006-07-14 22:44:00) [10]Проблема решилась включением LayerBase в проект. Чтобы это значило?
evvcom (2006-07-14 09:34:00) [11]> [96] han_malign © (13.07.06 14:03)
Посмотрел код. Действительно оптимизатор оказался не причем. Разница в вызовах с const и без const и var в вызове функции System._LStrAddRef. Но согласитесь, что string все же особенный тип. Поэтому без шаманства все же тут не обходится. Единственное в чем я ошибся, это в шамане. :) Компилятор тут колдует.
Ну а если взять "простой" тип, то при передаче по значению попросту происходит копирование параметра в стеке:
type TRec = record
aa: Integer;
bb: Integer;
end;
function SumWithConst(const rec: TRec): Integer;
begin
Result := rec.aa + rec.bb;
end;
function SumWithoutVarAndConst(rec: TRec): Integer;
begin
Result := rec.aa + rec.bb;
end;
В результате (оптимизатор выключен):
SumWithConst:begin
push ebp
mov ebp,esp
add esp,-$08
mov [ebp-$04],eax
SumWithoutVarAndConst:begin
push ebp
mov ebp,esp
add esp,-$0c
push esi
push edi
mov esi,eax
lea edi,[ebp-$08]
movsd
movsd
Вот те и копирование. Хотя никакого присвоения не происходит. Так что все-таки
> [49] sniknik © (12.07.06 14:40)
> не знал, что оптимизатор стал таким умным
не настолько уж он умён. Кстати и со стрингами, все же вызывается лишний раз (без const) System._LStrAddRef, хотя в коде не предполагалось никаких изменений стринга. Это адреса стрингов не изменились, но подготовка к возможному изменению все же была проведена.
Игорь Шевченко (2006-07-13 16:40:00) [12]MikProg © (13.07.06 16:20) [100]
> Вам самому времени не жалко?
Я вот ссылку дал, несколькими постами раньше. Ее бы почитать неплохо, там все написано, и про мое время, в том числе :)
MikProg (2006-07-13 16:20:00) [13]
> Нет, просто никому не интересно тебе помогать. Только и
> всего.
>
Зато как интересно рассказывать как бы вы мне замечательно помогли, если бы я вел себя "правильно". Вам самому времени не жалко?
Игорь Шевченко (2006-07-13 15:10:00) [14]MikProg © (13.07.06 14:18) [97]
> Именно так я обслуживаю клиентуру за деньги. Вы же не платный
> саппорт?
Дорогой друг, форум точно также не является платным суппортом, ты что-то здорово перепутал. Поэтому отвечать тебе каждый волен, как ему заблагорассудится, в рамках правил этого форума.
> А когда помогаешь по дружбе - совсем другое дело.
А если не затруднит, ты не скажешь, кому ты на данном форуме успел помочь по дружбе ? :)
> Так ведь и развел. Только оно в действительности оказалось
> "слабо".
Нет, просто никому не интересно тебе помогать. Только и всего.
MikProg (2006-07-13 14:21:00) [15]Удалено модератором
Примечание: Offtopic
MikProg (2006-07-13 14:18:00) [16]
> Если проблема не воспроизводится, значит, проблемы нет.
Именно так я обслуживаю клиентуру за деньги. Вы же не платный саппорт? Если бы вы им были то я и разговаривал с вами по другому. А когда помогаешь по дружбе - совсем другое дело. Другу я честно отвечу "не знаю", а не начну дурить мозги что "это не баг, это фича" ©.
> дать всю информацию более опытным товарищам.
Которые, в абсолютном большинстве случаев, смогут дать ответ только если уже сталкивались с подобной хренью вживую (вы то сами верите, что господа "опытные товарищи" бросятся воспроизводить оперативную обстановку, чтобы помочь мне :) или верите что все проблемы они могут решить слегка наморщив лоб? :)) ).
Собс-но об этом и вопрос: "Кто наступал на такие грабли?" Ответ пока: 1(один) и совсем по другому поводу и его решение совпадает с моим (которое меня не удовлетворяет).
> Можно всех на "слабо" развести ;-)
Так ведь и развел. Только оно в действительности оказалось "слабо". :)
han_malign (2006-07-13 14:03:00) [17]OFFTOP
> Это частный случай шаманства оптимизатора.
- нет, это общий случай передачи по значению "smart pointer" динамических объектов. Оптимизатор здесь вообще не причем.
> Не будем лезть в детали(счетчик ссылок, длина). Разница
> более чем в 16 байт (2 x long). Да и видно, где прямая адресация,
> а где косвенная.
- разница появляется ВНУТРИ функции, при передаче параметра КОПИРОВАНИЯ НЕ ПРИСХОДИТ, адресация в данном случае - всегда прямая. Строка копируется ТОЛЬКО при изменении, или действиях которые МОГУТ привести к изменению.
OUTPUT:
procedure ByVal(s: string);
begin
StrInfo('ByValO ', Pointer(_s));
StrInfo('ByValP ', Pointer(s));
if( Pointer(s) <> @s[1])
then Writeln('Pointer(s) <> @s[1]')
else Writeln('Pointer(s) = @s[1]');
Writeln(HexDWORD(DWORD(@s[1])));
StrInfo('ByValO~ ', Pointer(_s));
StrInfo('ByValP~ ', Pointer(s));
end;
ByValO : [0083000C] Ref: 2
ByValP : [0083000C] Ref: 2
Pointer(s) =@s[1]
0083001C
ByValO~ : [0083000C] Ref: 1
ByValP~ : [0083001C] Ref: 1
Плохиш (2006-07-13 13:38:00) [18]
> Игорь Шевченко © (13.07.06 13:05) [94]
Тааак долго :-( Можно всех на "слабо" развести ;-)
Игорь Шевченко (2006-07-13 13:05:00) [19]MikProg © (13.07.06 12:59) [91]
> Включите здравый смысл:
> Если бы я знал в чем заключается вся информация, я бы ее
> уже дал.
Включил. Поясняю: Если проблема воспроизводится у тебя, значит, у тебя есть вся информация по ней, которую ты вполне можешь дать. Если проблема не воспроизводится, значит, проблемы нет. Если проблема не воспроизводится у тебя, но воспроизводится в ближайшем окружении, ты можешь найти 10 отличий своего окружения от того, где воспроизводится проблема, устранить их, воспроизвести проблему, и если после этого она не решится, дать всю информацию более опытным товарищам.
isasa (2006-07-13 13:03:00) [20]Ладно, утомили. :)
Не будем лезть в детали(счетчик ссылок, длина). Разница более чем в 16 байт (2 x long). Да и видно, где прямая адресация, а где косвенная.
Результат
@FStr: 008F1D40, @S: 0012F624, @FStr[1]: 008F2004, @S[1]: 008F4200, FStr: Bill Gates, S: Bill Gates
@FStr: 008F1D40, @S: 008F1D40, @FStr[1]: 008F2004, @S[1]: 008F2004, FStr: Bill Gates, S: Bill Gates
@FStr: 008F1D40, @S: 0012F624, @FStr[1]: 008F2004, @S[1]: 008F2004, FStr: Bill Gates, S: Bill Gates