Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.04.19;
Скачать: CL | DM;

Вниз

Работа с потоками в Delphi   Найти похожие ветки 

 
Unknown user ©   (2009-01-24 22:10) [0]

Мне одному так кажется или все с этим сталкиваются? Отлаживать потоки в Delphi очень непросто. Пошаговая отладка невозможна из-за того, что отладчик непредсказуемо переключается с потока на поток. При пошаговой отладке рано или поздно происходит зависание среды.


 
Юрий Зотов ©   (2009-01-24 22:12) [1]

Скорее первое.


 
Unknown user ©   (2009-01-24 22:21) [2]

>Юрий Зотов

Тогда поделитесь опытом. Вы никогда не стыкались с таким поведением отладчика? (Я работаю в D5 но похожее наблюдал и в D2009, на разных компьютерах). Даже в демо приложении от Борланда - thrddemo, если установить точку останова внутри процедуры, исполняемой в потоке, после N-го шага начинается перепрыгивание с потока на поток.


 
Пробегал2....   (2009-01-24 22:25) [3]

а что ты хотел? Отладчик показывает то, что в настоящее время исполняется. Он виноват, что винда переключила поток? Или он должен показывать исполнение кода, хотя на самом деле исполняется совсем другой код в другом потоке?

Используй например логирование для отладки.


 
Unknown user ©   (2009-01-24 23:08) [4]

>Пробегал2...

Интересовался у сишников. В Visual Studio при пошаговой отладке, если отладчик зашел в поток то выполняет все его инструкции пока поток не завершит работу или программист, сделает активным другой поток из выполняющихся в данный момент. Есть такое окошко в Delphi в меню Debug Windows, называется Threads, там показаны выполняющиеся потоки и есть команда Make Current в контекстном меню. Какой в ней смысл?


 
Kerk ©   (2009-01-24 23:23) [5]

D2006 меня бесила своими зависаниями во время отладки многопоточной хреновины.


 
Unknown user ©   (2009-01-24 23:36) [6]

>Kerk

Вот-вот... ТО же самое наблюдал в Делфи 5. Более того такой вот код

FObject:=nil;
FObject.SomeField:=SomeValue;

выполняющийся в потоке в Д5 не вызывал исключения, только появлялись совершенно непредсказуемые сбои в других ветках программы. Это меня ужаснуло. Как же отлаживать многопоточность?


 
ketmar ©   (2009-01-24 23:57) [7]

потому что отладчик не нужен.

---
All Your Base Are Belong to Us


 
Eraser ©   (2009-01-25 00:02) [8]

> [0] Unknown user ©   (24.01.09 22:10)

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


 
ketmar ©   (2009-01-25 00:07) [9]

а я использую debuglogf (да-да, свой модуль на C %-) и не имею проблем. а при падении имею post-mortem dump, который позволяет прояснить ситуацию. интерактивный отладчик не нужен.

---
All Your Base Are Belong to Us


 
Unknown user ©   (2009-01-25 00:12) [10]

>ketmar

что делает debuglogf? он может полностью заменить пошаговый отладчик? и что такое post-mortem dump?


 
ketmar ©   (2009-01-25 00:13) [11]

>[10] Unknown user © (2009-01-25 00:12:00)
>что делает debuglogf

printf в лог.

>что такое post-mortem dum
после этого даже пояснять ничего не охота.

---
All Your Base Are Belong to Us


 
Eraser ©   (2009-01-25 00:17) [12]

> [9] ketmar ©   (25.01.09 00:07)

ну логирование и трассировка это совершенно разные методы отладки. все таки 21 век на дворе, хотелось бы иметь в IDE полноценный и не глючный трассировщик.


 
ketmar ©   (2009-01-25 00:19) [13]

>[12] Eraser © (2009-01-25 00:17:00)
ещё раз: в 99.(9)% случаев оно *не надо*. print + post-mortem всё решают.

а-а-а-а! забыл, извини. у вас же нет post-mortem dump"ов…

---
Do what thou wilt shall be the whole of the Law.


 
Eraser ©   (2009-01-25 00:21) [14]

> post-mortem

эт что, стек вызова? есть, достаточно JCL прикрутить.


 
ketmar ©   (2009-01-25 00:30) [15]

>[14] Eraser © (2009-01-25 00:21:00)
>эт что, стек вызова?

поржал, благодарю.

реквестирую ИШа, АПа или Розыча — они тоже поржут.

---
Understanding is not required. Only obedience.


 
ДимДимыч   (2009-01-25 01:24) [16]


> Пошаговая отладка невозможна

Это правда


 
Unknown user ©   (2009-01-25 02:10) [17]

Интересно какие еще есть способы отладки работы потоков кроме логирования? Что скажут программисты имеющие опыт работы не только в Делфи?


 
Игорь Шевченко ©   (2009-01-25 02:44) [18]


> Интересно какие еще есть способы отладки работы потоков
> кроме логирования?


Писать правильно, например. Вполне себе способ.


 
Дмитрий С   (2009-01-25 06:59) [19]

Почти всегда код, который требует отладки можно отладить в отдельном приложении или в основном потоке. А вообще, согласен с [18].

Кстати, о потоках. В дельфи поток нужно(?) запускать с помощью BeginThread из модуля system, который является оберткой Апишной функции CreateThread. Только разница в том, что Апишная требует, чтобы вызов функции потока был stdcall, а Дельфиная нет (что там в дельфи вообще по-умолчанию??). Вот такой вот глюк :(


 
test   (2009-01-25 07:28) [20]

Если у нас приложение или служба завершается аварийно, то ее содержимое памяти тоже сохраняются в файл (так называемый пользовательский дамп, user dump). Этот дамп памяти также называется постмортем дамп, и мы называем программу, которая сохраняет его - постмортем отладчик. Таких программ может быть несколько, и одна, которая указывается в реестре для выполнения, называется постмортем отладчик по умолчанию (default postmortem debugger).

http://www.dumpanalysis.org/ru/blog/index.php/2008/07/

ps
Надо бы уже примеры из Хаскела в ветках писать и ржать над всеми.
Как Задорнов: -"Ну вы тупые"


 
KSergey ©   (2009-01-25 07:32) [21]

> Unknown user ©   (25.01.09 02:10) [17]
> Интересно какие еще есть способы отладки работы потоков
> кроме логирования?

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

По поводу методов - надо смотреть по ситуации: если беда в пределах одного потока, то можно вынести в отдельное отладочное приложение; если в межпоточном взаимодействии - то интерактивный отладчик тут тем более не в помощь, только логирование. Однако добавленное логирование может нарушить картинку и программа с логированием в конкретной ситуации начнет "работать без глюков".


 
test   (2009-01-25 07:37) [22]

KSergey ©   (25.01.09 07:32) [21]
Смотря как логирование строить.


 
Alex Konshin ©   (2009-01-25 09:05) [23]

ODS (OutputDebugString)


 
Unknown user ©   (2009-01-25 13:19) [24]

>Alex Konshin

Что это такое?


 
Alex Konshin ©   (2009-01-25 13:33) [25]

Функция WinAPI для отладочной печати. Этот вывод можно увидеть в Delphi IDE, но я предпочитаю использовать DebugView
http://technet.microsoft.com/en-us/sysinternals/bb896647.aspx
Кстати, вывод можно смотреть и на другой машине.


 
ketmar ©   (2009-01-25 15:39) [26]

>[17] Unknown user © (2009-01-25 02:10:00)
>Интересно какие еще есть способы отладки работы потоков кроме логирования?

не использовать потоки вовсе.

>[19] Дмитрий С (2009-01-25 06:59:00)
>Только разница в том, что Апишная требует, чтобы вызов функции потока был
>stdcall, а Дельфиная нет (что там в дельфи вообще по-умолчанию??). Вот такой вот
>глюк :(

ты бы к генофонд заглянул, что ли… глюк — это то, что ты сюда написал.

>[20] test (2009-01-25 07:28:00)
>Если у нас приложение или служба завершается аварийно, то ее содержимое памяти
>тоже сохраняются в файл (так называемый пользовательский дамп, user dump).

значит, я этого не умею. ссылки не дашь, как это в XP сделать? а то я что-то только про свисту вижу инфу да про 2008 server. а никсы, кагбэ, уже несколько десятков лет умеют. медленно m$ списывают, медленно.

>[24] Unknown user © (2009-01-25 13:19:00)
>Что это такое?

весьма удобный инструмент.

---
Understanding is not required. Only obedience.


 
Eraser ©   (2009-01-25 16:10) [27]

> [20] test   (25.01.09 07:28)
> Если у нас приложение или служба завершается аварийно, то
> ее содержимое памяти тоже сохраняются в файл (так называемый
> пользовательский дамп, user dump). Этот дамп памяти также
> называется постмортем дамп, и мы называем программу, которая
> сохраняет его - постмортем отладчик. Таких программ может
> быть несколько, и одна, которая указывается в реестре для
> выполнения, называется постмортем отладчик по умолчанию
> (default postmortem debugger).

толку то от этого дампа? повторюсь, стек посмотреть при фатальной ошибке? оно конечно полезно, но возникает раз в сто лет. а вот текущую отладку программы не представляю как можно организовать с пом. postmortem дампов.


 
Игорь Шевченко ©   (2009-01-25 16:17) [28]


> ссылки не дашь, как это в XP сделать?


"Для создания дампа нужно использовать средства библиотеки DbgHelp. А именно функцию MiniDumpWriteDump. Функция получает на вход структуру EXCEPTION_POINTERS, которая содержит контекст в котором произошло исключение"


 
ketmar ©   (2009-01-25 16:38) [29]

>[28] Игорь Шевченко © (2009-01-25 16:17:00)
это чего, я *руками должен код писать*?! благодарю, это фекалия, а не инструмент.

---
Do what thou wilt shall be the whole of the Law.


 
Игорь Шевченко ©   (2009-01-25 17:00) [30]

ketmar ©   (25.01.09 16:38) [29]

Меня крайне мало волнует, какой частью тела ты собираешься писать/не писать код. Если ты не видишь дальше собственного носа, я тебя уговаривать не собираюсь, это всего лишь говорит о твоей ограниченности.


 
Дмитрий С   (2009-01-25 17:54) [31]


>
> ты бы к генофонд заглянул, что ли… глюк — это то, что ты
> сюда написал.

Как обычно одни указания и ничего конструктивного. Даже объяснять ничего не хочу.


 
Пробегал2....   (2009-01-25 18:06) [32]

Alex Konshin ©   (25.01.09 13:33) [25]
Функция WinAPI для отладочной печати. Этот вывод можно увидеть в Delphi IDE


а где в дельфи можно увидеть этот вывод? Тогда всегда DV использовал, даже не знал что в дельфе можно )


 
Eraser ©   (2009-01-25 18:14) [33]

> [32] Пробегал2....   (25.01.09 18:06)

в логе выполнения процесса.


 
Сергей М. ©   (2009-01-25 19:03) [34]


> Unknown user ©   (24.01.09 22:10)
> Пошаговая отладка невозможна


Не трынди.
Все возможно.
Проблемы только в кривых руках и отсутствии знаний


 
Piter ©   (2009-01-25 23:43) [35]

Eraser ©   (25.01.09 18:14) [33]
в логе выполнения процесса.


это что такое?

В смысле в окошке внизу куда компилятор ошибки выводит?


 
Unknown user ©   (2009-01-26 00:02) [36]

>Сергей М.

Ну значит я заблуждаюсь, направьте на путь истинный. Однако мои наблюдения многие в этом топике подтвердили. Делфи при пошаговой отладке потоков зависает и непредсказуемо переключается с потока на поток.


 
Piter ©   (2009-01-26 00:11) [37]

Удалено модератором


 
Unknown user ©   (2009-01-26 00:51) [38]

>ну почему непредсказуемо. Он переключается строго в соответствии с тем, какой поток винда сейчас выполняет

ну это для Винды предсказуемо, программист, же закономерности не видит. Он видит только, что пошаговая отладка потоков в Делфи практически невозможна. Понятное дело, что взаимодействие потоков в интерактивном отладчике я увидеть не смогу, но я на это и не надеюсь. Задача отладить основной код потока. Конечно можно вынести этот код в основной поток, но это неудобно. Visual Studio решает правильно, если интерактивный отладчик зашел в поток, то переключение между потоками надо заблокировать. И судя по команде Make Current в окне управления потоками в Делфи, так должно работать и в ней. Может я не тот дебаггер использую?


 
Eraser ©   (2009-01-26 02:47) [39]

> [35] Piter ©   (25.01.09 23:43)


> В смысле в окошке внизу куда компилятор ошибки выводит?

да


 
Piter ©   (2009-01-26 22:50) [40]

Удалено модератором


 
Piter ©   (2009-01-26 22:51) [41]

Удалено модератором


 
Palladin ©   (2009-01-26 23:04) [42]

Удалено модератором


 
ketmar ©   (2009-01-27 00:53) [43]

>[31] Дмитрий С (2009-01-25 17:54:00)
>Как обычно одни указания и ничего конструктивного. Даже объяснять ничего не
>хочу.

*мне* кагбэ и не надо. а ты — фигню сказал.

>[30] Игорь Шевченко © (2009-01-25 17:00:00)
>Если ты не видишь дальше собственного носа, я тебя уговаривать не собираюсь, это
>всего лишь говорит о твоей ограниченности.

а может то, что я вынужден писать руками базовый код, который в нормальной системе наличествует изначально — это не я не вижу чего-то, а система уродлива? а ну как у меня всё жёстко завалилось, так, что уже и апи не позвать? чего тогда? писать свой ядерный драйвер для дампов? круто, ничего не скажешь.

---
Understanding is not required. Only obedience.


 
Игорь Шевченко ©   (2009-01-27 13:32) [44]

ketmar ©   (27.01.09 00:53) [43]


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


Это что - единственное отличие ? Больше никаких не существует и только необходимость писать N строчек кода для получения post-mortem dump является тормозом для создания кросс-платформенного приложения ?


 
ketmar ©   (2009-01-27 16:22) [45]

>[44] Игорь Шевченко © (2009-01-27 13:32:00)
>Это что — единственное отличие ?

нет. но очень неприятное.

>олько необходимость писать N строчек кода для получения post-mortem dump
>является тормозом для создания кросс-платформенного приложения ?

ещё, как минимум, отсутствие в винде позикса (и fork()"а в частности). благодаря чему я не могу написать кроссплатформенный backend и прилепить к нему «родные» гуя где надо.

да даже несчастного аналога valgrind — и того нет! а если бы не портировали gcc — то и компилятора нормального не было бы.

---
Understanding is not required. Only obedience.


 
Piter ©   (2009-01-27 21:32) [46]

Удалено модератором


 
Игорь Шевченко ©   (2009-01-27 22:17) [47]

ketmar ©   (27.01.09 16:22) [45]


> ещё, как минимум, отсутствие в винде позикса (и fork()"а
> в частности).


Если бы у бабушки были колеса, то это была бы не бабушка, а трамвай.

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

Я к чему - может, не стоит считать, что одно безусловно хорошее, а другое безусловно плохое, когда оно просто разное ?


> а если бы не портировали gcc — то и компилятора нормального
> не было бы.


Извини, но к gcc я за много лет так и не смог привыкнуть, потому о нормальности ничего сказать не могу. Мне от компилятора немного надо - чтобы он исходный код в объектный превратил, а большего не требуется. А с gcc почему именно в этом процессе у меня возникали проблемы.


 
MsGuns ©   (2009-01-27 22:51) [48]

>ketmar ©

Если ты считаешь что посмертный дамп - всеобщая панацея, то ты мнишь о себе слишком много. Более того, в подавляющем большинстве сред программирования он как зайцу пианино. Поэтому нефиг делать лицо как у лемура когда кто-то не слышал о дампе.
Хотя, конечно, каждый кто не знаком с асмом - лох, ламер и неудачник :)


 
ketmar ©   (2009-01-28 01:57) [49]

>[47] Игорь Шевченко © (2009-01-27 22:17:00)
>Кстати, что интересно — за свой долгий опыт ни разу не видел реальных
>кроссплатформенных приложений, за исключением написанных на разного рода
>интерпретируемых языках.

потому что платформы, в принципе, аж две, и одна их них не держит posix. %-)

ну, и гуя — это отдельная песня, да.

>Мне от компилятора немного надо — чтобы он исходный код в объектный превратил, а
>большего не требуется.

угу. вот у m$vc с этим как раз огромные проблемы, потому что C99 мы не понимаем. а gcc — понимает, за что получает жирный респект.

>с gcc почему именно в этом процессе у меня возникали проблемы.
ну, mingw в своё время был страшен, конечно. щаз чуть получше стал.

>[48] MsGuns © (2009-01-27 22:51:00)
чего ты дёрганый такой, а? ну жил ты без этой фичи — и живи дальше, «запорожец» — тоже машина.

---
All Your Base Are Belong to Us


 
SPeller ©   (2009-01-28 02:14) [50]

Не пойму одного - Торвальдз за рекламу приплачивает?


 
ketmar ©   (2009-01-28 06:11) [51]

>[50] SPeller © (2009-01-28 02:14:00)
а ты думаешь, откуда у линуксоидов интернеты?

---
Do what thou wilt shall be the whole of the Law.


 
SPeller ©   (2009-01-28 07:24) [52]

Тогда оно должно умереть как и весь сетевой маркетинг )


 
MsGuns ©   (2009-01-28 09:48) [53]

>ketmar ©   (28.01.09 01:57) [49]
>чего ты дёрганый такой, а? ну жил ты без этой фичи — и живи дальше, «запорожец» — тоже машина.

Я - дерганный ? :))
Я, уважаемый, было время, из этих самых "посмертных" не вылазил, ибо на ЕС ЭВМ (позже на СМ-4М) других удовлетворительных средств поиска ошибок не было.
В дельфи нынче они мне просто не нужны ибо вполне обхожусь дебаггером. Хотя, для справедливости, операционных систем не пишу :) Тут таки да, тебе не пара :)


 
Anatoly Podgoretsky ©   (2009-01-28 10:35) [54]

> MsGuns  (28.01.2009 9:48:53)  [53]

DurdomOS


 
ketmar ©   (2009-01-28 19:24) [55]

>[53] MsGuns © (2009-01-28 09:48:00)
я тоже ОС не пишу. и сидел в дельфийском отладчике, пока не перешёл сначала на writeln, потом на ОС, где есть дампы. потому что отладчик дичайше неудобен.

---
All Your Base Are Belong to Us


 
имя   (2009-02-19 14:21) [56]

Удалено модератором


 
ANB   (2009-02-20 13:35) [57]

Лучшее средство не наступать на грабли с потоками - стараться их не использовать.


 
KSergey ©   (2009-02-20 13:49) [58]

топикстартеру: отлаживать многопоточное приложение пошаговым отладчиком - дело совершенно бестолковое. Т.к. весь кайф потоков в одновременном их исполнении, в этом же и все "глюки".
Т.е. просто надо заставить себя переходить ан следующий уровень: сначала тщательно планировать как мы разносим приложение на потоки, как будем организовывать взаимодействие между потоками, отдельно продумывая коллизии по чтению/изменению общих данных потоков, если таковое имеется.
Только после этого есть смысл начинать писать код. Причем отлаживать его пошагово - уже совершенно бесполезно; максимум что тут поможет - логи, да и то беда в том, что логирование может маскировать ошибку, т.к. выполнение команд потоков сдвинется во времени, т.е. ошибка может "исчезнуть", а вернее - просто замаскироваться. Особенно, понятно, это наглядно будет видно при применении защищенного многопоточного логирования в один файл, когда потоки из-за логирования будут подсинхронизироваться.


 
KSergey ©   (2009-02-20 13:57) [59]

оказывается в эту ветку я это уже писал, сорри :)



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

Текущий архив: 2009.04.19;
Скачать: CL | DM;

Наверх




Память: 0.63 MB
Время: 0.02 c
2-1235763470
VoznikVopros
2009-02-27 22:37
2009.04.19
Как эффективно работать с TCategoryPanel (Delphi 2009)?


1-1210569343
User1
2008-05-12 09:15
2009.04.19
Не соображу, что за ошибка...


3-1219735607
TNT
2008-08-26 11:26
2009.04.19
IBQuery и Filter


15-1224504901
Правильный$Вася
2008-10-20 16:15
2009.04.19
глобальный кризис и программисты


15-1234819801
Юрий
2009-02-17 00:30
2009.04.19
С днем рождения ! 17 февраля 2009 вторник