Форум: "Потрепаться";
Текущий архив: 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.61 MB
Время: 0.034 c