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

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



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

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

Наверх





Память: 0.55 MB
Время: 0.044 c
15-1234992602
Юрий
2009-02-19 00:30
2009.04.19
С днем рождения ! 19 февраля 2009 четверг


3-1219898793
Finjy
2008-08-28 08:46
2009.04.19
IBQuery чужой формы


15-1235108630
RDen
2009-02-20 08:43
2009.04.19
Вопрос к АП (и не только) - insufficient memory


1-1210571079
Гость1468
2008-05-12 09:44
2009.04.19
ESC-последовательность на принтер - ошибка I/O error 105


2-1235393881
aha
2009-02-23 15:58
2009.04.19
как изобразить петлю гистерезиса , то есть такая задача





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