Главная страница
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]

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



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

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

Наверх




Память: 0.57 MB
Время: 0.019 c
2-1236238302
Drowsy
2009-03-05 10:31
2009.04.19
А удалить запись не получается.


2-1235749905
Denis__
2009-02-27 18:51
2009.04.19
ASM


15-1234985753
turbouser
2009-02-18 22:35
2009.04.19
Вопрос в тему...


15-1228829198
wink
2008-12-09 16:26
2009.04.19
Delphi и GPIB?


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