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

Вниз

Отладка   Найти похожие ветки 

 
Piter ©   (2004-07-20 02:05) [0]

У меня все больше и больше вопросов скапливается по отладке… Вот сейчас актуальны такие:

1)  можно ли, чтобы программа останавливалась, если в WatchList контролируемая переменная приняла такое то значение?
2)  Можно ли чтобы программа останавливалась при "входе" в определенный модуль? Зачастую бывает, что то, что творится в каком-то модуле не важно и надо просто отловить момент, когда "выполнение" покинет данный модуль.
3)  Можно ли чтоб  программа останавливалась, когда вызывается определенная WinApi функция?


 
reticon ©   (2004-07-20 02:13) [1]

можно, ставь брэйкпойнты


 
ИдиотЪ   (2004-07-20 09:42) [2]

это для тебя существуют модули, а программе пофигу


 
Dmitriy O. ©   (2004-07-20 09:46) [3]

1 можно
2 можно
3 можно


 
vecna ©   (2004-07-20 10:04) [4]

2Piter,
SoftIce вопотит все твои мечтания в реальность.

2Dmitriy O.
как можно средствами дельфи реализовать п.1 ?


 
VMcL ©   (2004-07-20 10:54) [5]

>>vecna ©  (20.07.04 10:04) [4]

>как можно средствами дельфи реализовать п.1

Conditional breakpoints никто, вроде, не отменял.


 
Dmitriy O. ©   (2004-07-20 10:59) [6]


> vecna ©   (20.07.04 10:04) [4]

Правая кнопка мыши на точке останова тебе поможет. Второе меню с верха


 
Суслик ©   (2004-07-20 11:05) [7]


> VMcL ©   (20.07.04 10:54) [5]


> Dmitriy O. ©   (20.07.04 10:59) [6]

Я тоже хотел так ответить. Но если подумать, это не то...

А если переменная меняется в другом месте, где нет breakpoint?

Тогда уж такой совет надо объединять с требованием делать функцию для установки значения и в ней уже делать breakpoint c conditial...


 
vecna ©   (2004-07-20 11:26) [8]

спасибо+)
надо же... уже сколько лет пишу, а туда ни разу не залез =)
аж стыдно


 
Суслик ©   (2004-07-20 11:29) [9]


> надо же... уже сколько лет пишу, а туда ни разу не залез
> =)

значит хорошо пишите, что отлаживаться не надо :)


> VMcL ©   (20.07.04 10:54) [5]

Все самому стало интересно.
conditianal breakpoint остановит выполнение на брекпоитнте, если значение равно чему-то. А если значение было поменяно еще где -то. Тогда как? Т.е. имхо п1 conditional breakpoint не решают.


 
ИдиотЪ   (2004-07-20 11:30) [10]

а со 2-ым пунктом всем ясно?


 
Суслик ©   (2004-07-20 11:32) [11]

Есть ощущение, что Дмитрий Олегович устроил очередную провокацию :))


 
DiamondShark ©   (2004-07-20 11:32) [12]

А вот Вирт вообще считает, что пошаговые отладчики вредны.


 
ИдиотЪ   (2004-07-20 11:34) [13]

лучше подробный лог-файл, с занесением нарушителя в базу данных и тщательным контролем действий


 
Sandman25 ©   (2004-07-20 11:41) [14]

[12] DiamondShark ©   (20.07.04 11:32)

Почему?


 
Dmitriy O. ©   (2004-07-20 11:45) [15]


> Суслик ©   (20.07.04 11:32)
Нет вопросы отладки меня сильно не интересуют
Брекпоинтов и Окна наблюдения мне хватает хотя конечно Аппарат отладки в delphi очень мощьный


 
Суслик ©   (2004-07-20 11:47) [16]


> Dmitriy O. ©   (20.07.04 11:45) [15]
> Нет вопросы отладки меня сильно не интересуют


Экое откровение? И?
Вы дали ответ - "можно" вот и отвечайте как?


 
VMcL ©   (2004-07-20 11:52) [17]

>>Суслик ©  (20.07.04 11:05) [7]

>А если переменная меняется в другом месте, где нет breakpoint?

Это уже другой тип BP - не на execution, а на data change или что-то в этом роде. В Delphi, вроде, есть такая штука - см. меню Debug или как там его.


 
DiamondShark ©   (2004-07-20 11:55) [18]


> Sandman25 ©   (20.07.04 11:41) [14]
> [12] DiamondShark ©   (20.07.04 11:32)
>
> Почему?

http://www.inr.ac.ru/~info21/blackbox/disciplina/poshag_otlad.htm


 
Суслик ©   (2004-07-20 11:58) [19]


> VMcL ©   (20.07.04 11:52) [17]



> а на data change или что-то в этом роде.

что-то не знаю я такого?
А где это?


 
Dmitriy O. ©   (2004-07-20 11:58) [20]


> Суслик ©   (20.07.04 11:47) [16]
Прочтите Архангельского "Программирование в Delhi N"
Там этому целая глава посвещенна. Все подробно описанно на все вопросы и не только сабжевые даны ответы. А копировать сюда эту главу нет смысла все равно не удет


 
Суслик ©   (2004-07-20 12:02) [21]


> Dmitriy O. ©   (20.07.04 11:58) [20]

нет такого в д6...
хоть архангельского читай, хоть кого...
такую муть сам читай.


 
Sandman25 ©   (2004-07-20 12:02) [22]

[18] DiamondShark ©   (20.07.04 11:55)

Понятно, спасибо. ИМХО, это перебор.


 
Dmitriy O. ©   (2004-07-20 12:07) [23]


> Суслик ©   (20.07.04 12:02) [21]
Глава 2.8 Отладка приложений
114-146 (всего 34 стр про отладку) стр Архангельский программирование Delphi 6 Кстати очень интересно и полезно
там все про отладку.


 
Суслик ©   (2004-07-20 12:13) [24]


> Dmitriy O. ©   (20.07.04 12:07) [23]

не пользуйся тем, что у меня этого г нет в наличии (хвала алаху).

скажи - где в среде разработки дельфи есть место, где можно поставить breakpoint на ИЗМЕНЕНИЕ значения переменной?

Не думаю, что у тебя ответ на этот вопрос займет более 30 секунд - написать пункт меню, всех делов то. Вспоминимать думаю тоже не будешь долго - сам же говоришь тАм все про отладку и очень полезное. А сам понимаешь полезность можно оценить только если глубоко все поймешь. А глубоко поймешь - будешь помнить.

Т.о. тебе надо потратить 30 секунд на написание пунткта меню - вспоминание времени не займет (почему см. выше).

Заранее спасибо.


 
Суслик ©   (2004-07-20 12:24) [25]

Ну?
Дмитирий Олегович. Что сник?
Мне так нужна была бы эта функция в рамках дельфи!


 
Dmitriy O. ©   (2004-07-20 12:28) [26]


> Суслик ©   (20.07.04 12:24) [25]


> Суслик ©   (20.07.04 12:13) [24]

Не совсем понял что вам надо. И потом все это смахивает на личную переписку мож в чате поговорим ?


 
Суслик ©   (2004-07-20 12:30) [27]


> Dmitriy O. ©   (20.07.04 12:28) [26]


у хитрец :))))))

Дмитрий Олегович, твоему провокаторскому таланту нет равных :))))


 
Igorek ©   (2004-07-20 14:48) [28]


> скажи - где в среде разработки дельфи есть место, где можно
> поставить breakpoint на ИЗМЕНЕНИЕ значения переменной?

В окне Watch второй пункт снизу контекстного меню. Во время выполнения.


 
Sandman25 ©   (2004-07-20 14:57) [29]

[28] Igorek ©   (20.07.04 14:48)

В Delphi IDE нет записи/проигрывания макросов. А без них в данном случае практически невозможно - ведь придется вручную устанавливать breakpoint на каждой строке и указывать условие остановки, причем даже Ctrl+С и Сtrl+V не работает в окне breakpoints.


 
Суслик ©   (2004-07-20 14:59) [30]


> Igorek ©   (20.07.04 14:48) [28]

ясен пень, что на мой вопрос (выделен вам) это отвечает :)))

как это отвечает на п1 исходного вопроса?


 
Суслик ©   (2004-07-20 15:02) [31]


> В Delphi IDE нет записи/проигрывания макросов

есть - ctrl+shift+r, ctrl+shift+p

только для этого врядли будет работать.


 
Igorek ©   (2004-07-20 15:09) [32]

Data Breakpoint


 
Sandman25 ©   (2004-07-20 15:14) [33]

[31] Суслик ©   (20.07.04 15:02)

Упс, у меня это даже где-то записано... Поискал по меню, не нашел, сделал неверный вывод :(


 
Sandman25 ©   (2004-07-20 15:19) [34]

Да, действительно, Data Breakpoint работает отлично.


 
Piter ©   (2004-07-20 15:19) [35]

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

Igorek ©   (20.07.04 14:48) [28]
окне Watch второй пункт снизу контекстного меню. Во время выполнения


это не совсем то. Там можно контролировать когда переменная изменится, а мне нужно останавливаться, когда она изменится и примет определенное значение!

Conditional breakpoints тоже удобная штука, но там можно задавать условия остановки только при "прохождении" брекпоинта. Нельзя задать глобально :(
То есть, фактически должны отслеживаться все обращения по адресу переменной и потом проверяться - а не изменилось ли там значение на определенное (в общем, как Inspect - только с остановкой по условию).

На второй и третий вопрос ни у кого идей нету?

ИдиотЪ   (20.07.04 9:42) [2]
это для тебя существуют модули, а программе пофигу


что значит по фигу. Программа то под отладчиком выполняется. Ты ведь когда нажимаешь F7 - выполнение программы же прыгает по модулям? Почему бы это не отлавливать. То, что это реализуемо - 100%. Можно даже как-то извратиться и написать для конкретного IDE программу, которая будет виртуально жать на клавишу F7 и смотреть - не поменялась ли вкладка юнита в Code Explorer...

И насчет перехвата вызова определенной WinApi функции вроде вообще никто не выразился...


 
Суслик ©   (2004-07-20 15:23) [36]


>
> это не совсем то. Там можно контролировать когда переменная
> изменится, а мне нужно останавливаться, когда она изменится
> и примет определенное значение!

а похоже, что игорек прав.
там и это можно делать :)))

Приколько - сколько лет пишу - data breakpoints еще не использовал. Наверное нужды нет :)))

Игорек и ДО - спасибо.
Пойду архангельского писать.


 
Суслик ©   (2004-07-20 15:23) [37]


> Пойду архангельского писать.

читать, конечно.


 
Dmitriy O. ©   (2004-07-20 15:24) [38]

П 2 Выполнить->Добавить точу останова->На модуль Не подойдет ?
(сорри за РусМеню у меня делфи Русифицированна)


 
Piter ©   (2004-07-20 15:31) [39]

О, Data Breakpoint есть. Значит, есть ответ на первый вопрос...


 
Piter ©   (2004-07-20 15:47) [40]

Dmitriy O. ©   (20.07.04 15:24) [38]
П 2 Выполнить->Добавить точу останова->На модуль Не подойдет ?


Нет, там же брекпоинты на загрузку внешних DLL можно только поставить. Кстати, поставил на NTDLL - программа стала ловить AV при запуске...


 
Суслик ©   (2004-07-20 15:51) [41]

корявенько к сожалению этот data breakpoint для стековых переменных работает :(((

А вообще штука прикольная :)


 
Igorek ©   (2004-07-20 16:18) [42]

> 2)  Можно ли чтобы программа останавливалась при "входе"
> в определенный модуль? Зачастую бывает, что то, что творится
> в каком-то модуле не важно и надо просто отловить момент,
> когда "выполнение" покинет данный модуль.
Можно напр. использовать директиву {$D-}. Ставишь ее у начале модуля, который тебя не интересует. Для него не будет генерироваться отладочная информация. При пошаговом выполнении этот модуль показываться не будет.

---
А вообще - покликайте в Дельфе на все что видите - поисследуйте.


 
Igorek ©   (2004-07-20 16:19) [43]


> 3)  Можно ли чтоб  программа останавливалась, когда вызывается
> определенная WinApi функция?

Вроде избитая тема, так что можно поискать ответ.


 
Piter ©   (2004-07-20 18:05) [44]

Igorek ©   (20.07.04 16:19) [43]
Вроде избитая тема


так можно? Лично я ни разу такой темы не видел, хотя на форумах давно...

Суслик ©   (20.07.04 15:51) [41]
корявенько к сожалению этот data breakpoint для стековых переменных работает :(((


Ибо нефиг контроллировать переменную цикла :)


 
Суслик ©   (2004-07-20 18:11) [45]


> Ибо нефиг контроллировать переменную цикла :)

дело не в этом, а в том, что адрес переменных в стеке не постоянен - меняется при разных от запуска к запуску процеруры.


> так можно? Лично я ни разу такой темы не видел, хотя на
> форумах давно...

Перехват api вызовов. Действительно избитая тема. Сам не делал - не интересно. Но это описано: 1) в рихтере 2) в #1 2004 RSDN было (на сайте их посмотри)


 
DiamondShark ©   (2004-07-20 18:30) [46]


> дело не в этом, а в том, что адрес переменных в стеке не
> постоянен

Ага. Или вообще не в стеке, а в регистре.
Ужас!


 
Суслик ©   (2004-07-20 18:36) [47]


> DiamondShark ©   (20.07.04 18:30) [46]

не умничайте, ясно о чем я говорил.
про использование регистров я представьте тоже знаю.


 
Piter ©   (2004-07-20 18:45) [48]

Суслик ©   (20.07.04 18:11) [45]
Перехват api вызовов


блин, вы чего говорите? Я про ОТЛАДЧИК ДЕЛЬФИ. Какого рожна мне перехватывать вызовы API функций?

Я к тому, например, что в программе идет какая-нибудь обработка, особенно актуально в недрах VCL. И трассировать это просто нету времени. Но знаю, что в результате должнна быть вызвана некая WinApi функция и вот мне интересно, например, с какими параметрами она будет вызвана, при этом отладчик должен остановить программу, чтобы я там решил что делать дальше...


 
Piter ©   (2004-07-20 18:46) [49]

Суслик ©   (20.07.04 18:36) [47]

он сейчас скажет, что тебя надо было убивать при рождении за такие выскаывания :)


 
Суслик ©   (2004-07-20 18:50) [50]


> Piter ©   (20.07.04 18:46) [49]
> Суслик ©   (20.07.04 18:36) [47]
>
> он сейчас скажет, что тебя надо было убивать при рождении
> за такие выскаывания :)

его дело.

По поводу этого

> Перехват api вызовов

я так понял, что исходная тема трансформировалась в перехват api вызовов. Нет? Задача осталось  - из ide ловить моменты? Тогда не знаю...


 
DiamondShark ©   (2004-07-20 19:32) [51]

Можно и из IDE ловить. Немножко трансректально, но можно.

Компилим проект. Нажимаем F8, останавливаемся на первом begin.
Открываем окно CPU. Нажимаем ctrl-G (Go to address) и вводим адрес интересующей функции в виде @CreateWindowEx (можно с указанием модуля @Windows.CreateWindowsEx).
Попадаем на сгенерённую компилером заглушку для статической линковки DLL вида jmp dword ptr [XXXXXXXX].
Ставим брекпоинт (F5) и пускаем программу дальше.


 
VMcL ©   (2004-07-22 12:19) [52]

>>DiamondShark ©  (20.07.04 19:32) [51]

ИМХО, лучше на jmp dword ptr [...] нажать Ctrl+F (Follow) и поставить BP там, тогда поймаем даже те вызовы, которые делаются посредством GetProcAddress().


 
DiamondShark ©   (2004-07-22 12:32) [53]

Можно и так.


 
Piter ©   (2004-07-22 13:15) [54]

Если указывать перейти на адрес @Windows.SendMessage - то дебагер говорит, что не знает что такое windows, если на @sendmessage - то не знает что такое sendmessage.

А вообще все оказалось проще :) Я просто не ожидал...

Надо в юните Windows просто поставить брекпоинт напротив объявленной функции, вот и все :)

Остался вопрос:

2)  Можно ли чтобы программа останавливалась при "входе" в определенный модуль? Зачастую бывает, что то, что творится в каком-то модуле не важно и надо просто отловить момент, когда "выполнение" покинет данный модуль


 
Суслик ©   (2004-07-22 13:17) [55]


> Надо в юните Windows просто поставить брекпоинт напротив
> объявленной функции, вот и все :)

но для этого его надо сначала в проект подключить или директории настроить...


 
VMcL ©   (2004-07-22 16:55) [56]

>>Суслик ©  (22.07.04 13:17) [55]

>но для этого его надо сначала в проект подключить

Это слишком правильно, чтоб с этим можно было не согласиться. Надеюсь дописать в uses ... Windows ...; это не проблема? ;)

>или директории настроить

Настраивать не так уж много: Browsing path (однократно) + Use Debug DCU.


 
Piter ©   (2004-07-22 17:01) [57]

Суслик ©   (22.07.04 13:17) [55]

ну уж блин не знаю программы, где не подключен модуль windows и messages...


 
VMcL ©   (2004-07-22 17:10) [58]

>>Piter ©  (22.07.04 17:01) [57]

>ну уж блин не знаю программы, где не подключен модуль windows и messages...

program HelloPiter;
{$APPTYPE CONSOLE}
begin
 WriteLn("Hello, Piter!");
end.


:))

P.S. Ну с Windows.pas согласен - почти всегда. А вот messages запросто может не быть. Например, в DLL. Ну чем DLL не программа? :)


 
Суслик ©   (2004-07-22 17:38) [59]


> VMcL ©   (22.07.04 16:55) [56]

Так что я не так сказал?:)))))

Если просто в  uses подключить без путей и флажков, то никакие бреакпоинты работать не будут.

либо подключать в проект, либо пути прописывать, use debug dcu.

иначе никак :)))

ЗЫ.
по поводу возможности подключения windows к проекту вообще сомневаютсь, что это возможно. Многие другие модули запросто, например forms помнюю трассировал как-то так. Про windows не знаю - сам не пробовал.

Так что мое утверждение


> но для этого его надо сначала в проект подключить или директории
> настроить...


было комментарием к утверждению piter


> Надо в юните Windows просто поставить брекпоинт напротив
> объявленной функции, вот и все :)


Особенно к помеченному жирным.:)))

Вы хотите об этом поговорить? :)))


 
VMcL ©   (2004-07-22 17:45) [60]

>>Суслик ©  (22.07.04 17:38) [59]

Уже нет :)
Я замечания свои написал. Думаю, что их достаточно.


 
Суслик ©   (2004-07-22 17:47) [61]

да я в общем-то не вам, про поговорить.
вроде с вами и не расходимся во мнении.


 
VMcL ©   (2004-07-22 18:04) [62]

>>Суслик ©  (22.07.04 17:47) [61]

>да я в общем-то не вам

Я привык в Сети общаться на "ты" ;)

P.S. "Вам" и "вам" разные вещи.


 
han_malign ©   (2004-07-22 18:28) [63]

>либо пути прописывать
- вообще-то они изначально прописаны, Delphi прекрасно знает где у него ...\DelphiN\Source\... лежит. Во всяком случае, у меня, с этим, проблем никогда не было.


 
Суслик ©   (2004-07-22 18:31) [64]


> проблем никогда не было.

у меня были, наверное поудалял когда-то в трудовом порыве :)



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

Форум: "Потрепаться";
Текущий архив: 2004.08.08;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.62 MB
Время: 0.511 c
14-1090246065
X9
2004-07-19 18:07
2004.08.08
Linux и Window$ на одном винте.


1-1090577903
VHS
2004-07-23 14:18
2004.08.08
Проблема вызова функции при событии FormActivate


1-1090837961
Ibn El Ivan
2004-07-26 14:32
2004.08.08
Checklistbox


6-1086871978
Softal
2004-06-10 16:52
2004.08.08
Сеть в DOS


8-1084825661
init13
2004-05-18 00:27
2004.08.08
OpenGL. (GLScene) Текст - в - 3d объект





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский