Современные решения

для защиты Windows приложений

и восстановления исходного кода

Обсуждение программирования на Delphi в конференции ru.delphi


Re: Отладка (was: Hормальный компонент меню в стиле XP)

From: "Sergey V. Kaltyga" <kafla [@] rol.ru>



"Yura Balyuk" <Yura.Balyuk [@] p15.f9.n4625.z2.fidonet.org> сообщил/сообщила в

новостях следующее: news:1120826132 [@] p15.f9.n4625.z2.ftn...

YB> хорошо, допустим есть такая простенькая программа с ошибкой:


YB> procedure TForm1.FormCreate(Sender: TObject);

YB> var

YB> s: TStrings;

YB> begin

YB> s.Clear;

YB> end;


YB> почему дебаггер не показывает на строчку, где есть ошибка?


А куда он показывает?

С уважением. Сергей Калтыга.


* Origin: Кафедра ЛА СибГА (2:5020/400)

Re: Отладка

From: "Slava Antonov" <deadbeef [@] so.yandex.ru>


Hello Yura Balyuk, you wrote:

> хорошо, допустим есть такая простенькая программа с ошибкой:

>

> procedure TForm1.FormCreate(Sender: TObject);

> var

> s: TStrings;

> begin

> s.Clear;

> end;

>

> почему дебаггер не показывает на строчку, где есть ошибка?


1) Включи "Debug DCUs"
2) Дебагер не останавливается на этой строчке потому что исключение возникает не здесь.

Если ты сделаешь так:
S:= nil;
S.Clear;
, то получишь исключение в этой строке.

Дело в том, как вызываются методы для экземпляра класса.
В твоем варианте S - имеет произвольное значение. А метод вызывается так Pointer(S) + <смещение метода>. В результате, в твоем примере управление передается куда угодно. Кстати, может быть даже так, что исключение совсем не возникнет. Hо и работать нормально программа не будет :)


Вообще указатели лучше инициализировать нулем. Т.к. при любой попытке обратиться по нулевому адресу тут же получаешь исключением по лбу. Если же указатель указывает куда попало, то получить исключение - как карта ляжет.

--
Всего хорошего, Слава.
slava.fateback.com
* Origin: (http://news.cca.usart.ru/) USURT's FidoNET<-> (2:5080/1003 [@] fidonet)






Re: Отладка

From: "Alexander B. Bokovikov" <bokovikov [@] apress.ru>


On Sat, 09 Jul 2005 07:12:42 +0400, "Slava Antonov"
<deadbeef [@] so.yandex.ru> wrote:


>> procedure TForm1.FormCreate(Sender: TObject);

>> var

>> s: TStrings;

>> begin

>> s.Clear;

>> end;

>>

>> почему дебаггер не показывает на строчку, где есть ошибка?


Мне интересно другое: а что, и warning-а он тоже не показывает? По
идее он должен выкатить что-то типа "Variable S may not be
initialized", что прямо указывает на возможный источник последующей
ошибки.

Отладка вообще-то начинается задолго до первого запуска программы! :)

Александр Боковиков
E-mail: bokovikov(a)mail.ru (дом.) abokovikov(a)apress.ru (раб.)
www.apress.ru/pages/bokovikov/delphi
* Origin: Demos online service (2:5020/400)

Window Message

Доподлинно известно, что многие философы высказывались на тему "Window Message". Hедавно (08 июля 05) гpуппа аpхеологов отыскала письмо, отпpавленноё дpевнегpеческим учёным (Alexey Dunin) своему pимскому коллеге (Andrey Ryazanov).

AR> The WM_ACTIVATE message is sent to both the window being activated and

AR> the window being deactivated.


Спасибо, конечно, но тепеpь дpугой вопpос: почему окно не становится активным
после вызова SendMessage(Form1.Handle, WM_ACTIVATE, 1, 0)?

PS: слово "send" пишется с буквой "d" на конце. :)

Пишите письма: helex [@] infocentr.ru!!!
* Origin: ...и обмакнув пеpо в желчь, я пpодолжал.. (2:5012/2.447)

Window Message

From: "Alexey Cherepanov" <alexey [@] soft5.com>



Sat Jul 09 2005 09:44, Alexey Dunin wrote to Andrey Ryazanov:

A AR>> The WM_ACTIVATE message is sent to both the window being activated and


AR>> the window being deactivated.


AD> Спасибо, конечно, но тепеpь дpугой вопpос: почему окно не становится

AD> активным после вызова SendMessage(Form1.Handle, WM_ACTIVATE, 1, 0)?


Потому что для активировани окна, нужно вызывать функцию ShowWindow,
SetWindowPos, и т.д.

AD> PS: слово "send" пишется с буквой "d" на конце. :)


Таблицу неправильных глаголов учим, да?

* Origin: FidoNet Online - www.fido-online.com (2:5020/400)

Re: Отладка

From: "Alexey Cherepanov" <alexey [@] soft5.com>



Sat Jul 09 2005 08:12, Slava Antonov wrote to Yura Balyuk:

SA> From: "Slava Antonov" <deadbeef [@] so.yandex.ru>


SA> Hello Yura Balyuk, you wrote:


>> хорошо, допустим есть такая простенькая программа с ошибкой:

>>

>> procedure TForm1.FormCreate(Sender: TObject);

>> var

>> s: TStrings;

>> begin

>> s.Clear;

>> end;

>>

>> почему дебаггер не показывает на строчку, где есть ошибка?


SA> 1) Включи "Debug DCUs"

SA> 2) Дебагер не останавливается на этой строчке потому что исключение

SA> возникает не здесь.


SA> Если ты сделаешь так:

SA> S:= nil;

SA> S.Clear;

SA> , то получишь исключение в этой строке.


SA> Дело в том, как вызываются методы для экземпляра класса.

SA> В твоем варианте S - имеет произвольное значение. А метод вызывается так

SA> Pointer(S) + <смещение метода>.


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

<смещение метода>(Pointer(S),....);


Как видишь сам, при S равном nil, вслучае необращения к полям класса может и
прокатить.


SA> В результате, в твоем примере управление

SA> передается куда угодно. Кстати, может быть даже так, что исключение

SA> совсем не возникнет. Hо и работать нормально программа не будет :)


SA> Вообще указатели лучше инициализировать нулем. Т.к. при любой попытке

SA> обратиться по нулевому адресу тут же получаешь исключением по лбу. Если

SA> же указатель указывает куда попало, то получить исключение - как карта

SA> ляжет.


Точнее Access Violation наступает при обращении к памяти по адрессу от 0 до
65к.

* Origin: FidoNet Online - www.fido-online.com (2:5020/400)

Re: Отладка

From: "Slava Antonov" <deadbeef [@] so.yandex.ru>


Hello Alexander B. Bokovikov, you wrote:

> Мне интересно другое: а что, и warning-а он тоже не показывает?


У меня в D6 - показывает.

--
Всего хорошего, Слава.
slava.fateback.com
* Origin: (http://news.cca.usart.ru/) USURT's FidoNET<-> (2:5080/1003 [@] fidonet)






Re[2]: Отладка

From: "Slava Antonov" <deadbeef [@] so.yandex.ru>


Hello Alexey Cherepanov, you wrote:

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

> <смещение метода>(Pointer(S),....);


Угу, просто об этом подумал уже после того как отправил письмо.

> Как видишь сам, при S равном nil, вслучае необращения к полям класса может и

> прокатить.


Уж к чему к чему, а к полям прокатить никак не должно :)
Вот методы, которые не обращаются к полям, должны отработать без проблем.

> Точнее Access Violation наступает при обращении к памяти по адрессу от 0 до

> 65к.


Зачем забивать голову лишней информацией?

--
Всего хорошего, Слава.
slava.fateback.com
* Origin: (http://news.cca.usart.ru/) USURT's FidoNET<-> (2:5080/1003 [@] fidonet)






Отладка

metal will -=+ Привет _Slava_ ! Пишет тебе *Yura* !
never die.. +===============-----------------

09 Июл 05 08:12, _Slava Antonov_ == /Yura Balyuk/:

>> почему дебаггер не показывает на строчку, где есть ошибка?

SA> 1) Включи "Debug DCUs"

SA> 2) Дебагер не останавливается на этой строчке потому что исключение

SA> возникает не здесь.


/цитата сокращена/

ок. хорошо, спасибо. но всё равно этот дебаггер очень часто показывает, что
ошибка выскакивает после "application.run"..


np: Lacuna Coil'1999 - Reverie
-=+ Hу я вроде все сказал... Bye _*Slava*_ !
+===============-----------------
* Origin: Wotan - мой готический бог. Его копьё внушает страх. (2:4625/9.15)

Re: Отладка

From: "Alexander B. Bokovikov" <bokovikov [@] apress.ru>


On Sat, 09 Jul 2005 13:19:00 +0400, "Slava Antonov"
<deadbeef [@] so.yandex.ru> wrote:


>> Мне интересно другое: а что, и warning-а он тоже не показывает?

>

>У меня в D6 - показывает.


И не только у тебя :) И не только в D6 :)

Это я к тому говорил, что на сообщения компилятора тоже надо смотреть.
И не забивать тред глупыми примерами. Если уж взялись говорить про
отладчик, то уж хоть бы примеры интересные приводили...

Кстати про вышеприведенный warning: Вот было бы здорово, если бы
компилятор мог анализировать if-ы на взаимоисключаемость условий, а то
он даже в самых тривиальных случаях типа такого:

procedure TForm1.FormCreate(Sender: TObject);
var
x : integer;
a, b : integer;
begin
a := 2;
b := 3;
if a < b then x := 1;
if b < a then x := 0;
x := x + 1;
Left := x;
end;

выдает это предупреждение. Вообще-то проверка на неизменность a и b
между двумя if-ами - это что-то очень близкое к оптимизации.
Переменные локальные... Чего бы ему и не сократить второй if? И
warning заодно убрался бы.

Александр Боковиков
E-mail: bokovikov(a)mail.ru (дом.) abokovikov(a)apress.ru (раб.)
www.apress.ru/pages/bokovikov/delphi
* Origin: Demos online service (2:5020/400)