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

Вниз

Работа с потоками в 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.61 MB
Время: 0.053 c
1-1211146906
Shadow
2008-05-19 01:41
2009.04.19
зайди там все объяснено!


15-1235057008
@!!ex
2009-02-19 18:23
2009.04.19
Как ограничить скорость доступа к инету?


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


4-1208613157
Damien
2008-04-19 17:52
2009.04.19
Рисунок за границами окна


15-1234857582
Анна
2009-02-17 10:59
2009.04.19
Уравнение для 8 класса





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