[]
A>если он уж точно работает в однопоточном варианте и есть проблемы с синхронизацией - A>пишешь в лог (лучше в файл) -чтобы восстановить временную последовательность A>захвата определенных ресурсов
Запись в лог будет может сериализовывать твои потоки, поэтому с логгингом криво написанный многопоточный код может заработать.
Подскажите, очень ли геморойно делать сабж? Может быть есть какие-то способы для упрощения?
Единственное, что приходит в голову — скидывание всех задач в один поток и написание
собственного таскменеджера, который бы осуществлял распределение квантов времени между задачами,
но уж очень это долго.
И вообще, используется ли отладчик в больших проектах, или применяются косвенные методы — вывод
отладочной инфы на экран или в лог, ассерты и тому подобные вещи?
Hello, Manticore, you wrote:
> Подскажите, очень ли геморойно делать сабж? Может быть есть какие-то способы для упрощения? > Единственное, что приходит в голову — скидывание всех задач в один поток и написание > собственного таскменеджера, который бы осуществлял распределение квантов времени между задачами, > но уж очень это долго. > И вообще, используется ли отладчик в больших проектах, или применяются косвенные методы — вывод > отладочной инфы на экран или в лог, ассерты и тому подобные вещи?
А что, какие-то проблемы
Обычного отладчика в стандартных ситуациях хватает, а нестандартные баги
встречаются так редко, что писать из-за них свой менеджер задач...
Постоянно работаю с многопоточными приложениями с помощью обычного отладчика
MSVC 7.1 — мне его вполне хватает.
То, что в нем особенно удобно — он позволяет при останове программы просматривать
Call Stack для каждого из потоков, а также усыплять некоторые потоки (чтобы им
не давались кванты), и пробуждать соответственно. Чего не хватает — не дает
прибивать потоки. Для этого использую TaskManagerEx — Add-On к Task Manager.
Кстати, очень удобное дополнение к отладчику этот TaskManagerEx...
Здравствуйте, Manticore, Вы писали:
M>Подскажите, очень ли геморойно делать сабж? Может быть есть какие-то способы для упрощения? M>Единственное, что приходит в голову — скидывание всех задач в один поток и написание M>собственного таскменеджера, который бы осуществлял распределение квантов времени между задачами, M>но уж очень это долго. M>И вообще, используется ли отладчик в больших проектах, или применяются косвенные методы — вывод M>отладочной инфы на экран или в лог, ассерты и тому подобные вещи?
Отладчик от MS хорош.
NuMega BoundsChecker рулит.
NuMega SoftIce тоже рулит
и вывод логов в файл/EventLog тоже неплох(но лучше в файл),иногда это единственный способ быстро найти проблемный кусок.
вывод на экран однозначно отстойный метод — иногда оказывается, что редко встречающаяся ошибка была и раньше, а окошко-то уже закрыли.
Напиши отдельный поток, который пишет в лог-файл.
и thread-safe очередь сообщений.
Это не очень напряжно, но потом пригодится в десятке проектов.
Здравствуйте, MaximE, Вы писали: ME>Может легко случиться так, что приложение рухнет до того момента, как этот отдельный поток успеет сделать запись в лог файл.
Факт.
Но такое отлаживается стандартными средствами. Тем же баундсчекером.
Я имел в виду поиск сложных ошибок, когда прога работает, но (не совсем) некорректно.
Manticore wrote:
> Подскажите, очень ли геморойно делать сабж? Может быть есть какие-то способы для упрощения? > Единственное, что приходит в голову — скидывание всех задач в один поток и написание > собственного таскменеджера, который бы осуществлял распределение квантов времени между задачами, > но уж очень это долго.
На однопроцессорной тачке (без HT) именно это и происходит — в единицу времени работает только один поток.
Здравствуйте, Manticore, Вы писали:
M>Подскажите, очень ли геморойно делать сабж?
Если есть ошибки многопоточности, то может быть очень гемморойно, т.к. ошибка может возникать, например, 1 раз в день, или только на определённой машине.
M>Может быть есть какие-то способы для упрощения?
Именно про отладку тут уже писали. Главное программу писать окуратно. Ресурсы делать многопоточными, что бы они сами себя защищали и т.д. Если всё грамотно делать, то отлаживать редко когда приходиться.
M>Единственное, что приходит в голову — скидывание всех задач в один поток и написание M>собственного таскменеджера, который бы осуществлял распределение квантов времени между задачами, M>но уж очень это долго.
А толку??? Менеджер потоков уже написан, и он есть в составе ОС. Смысл??? Будут те же проблемы.
M>И вообще, используется ли отладчик в больших проектах, или применяются косвенные методы — вывод M>отладочной инфы на экран или в лог, ассерты и тому подобные вещи?
Здравствуйте, Manticore, Вы писали:
M>Подскажите, очень ли геморойно делать сабж? Может быть есть какие-то способы для упрощения? M>Единственное, что приходит в голову — скидывание всех задач в один поток и написание M>собственного таскменеджера, который бы осуществлял распределение квантов времени между задачами, M>но уж очень это долго. M>И вообще, используется ли отладчик в больших проектах, или применяются косвенные методы — вывод M>отладочной инфы на экран или в лог, ассерты и тому подобные вещи?
Делать не геморойно. Методы отладки довольно быстро вырабатываются свои.
Вот еще один: использовать барьерную синхронизацию, чтобы в каждый момент был активен только один поток. Но это уже для особо тяжелых случаев.
Тот, кто желает, но не делает, распространяет чуму.
M>Подскажите, очень ли геморойно делать сабж? Может быть есть какие-то способы для упрощения? M>Единственное, что приходит в голову — скидывание всех задач в один поток и написание M>собственного таскменеджера, который бы осуществлял распределение квантов времени между задачами, M>но уж очень это долго. M>И вообще, используется ли отладчик в больших проектах, или применяются косвенные методы — вывод M>отладочной инфы на экран или в лог, ассерты и тому подобные вещи?
не так уж геморойно
алгоритм отлаживаешь в однопоточном варианте.
если он уж точно работает в однопоточном варианте и есть проблемы с синхронизацией —
пишешь в лог (лучше в файл) -чтобы восстановить временную последовательность
захвата определенных ресурсов
для тестирования многопоточных приложений хорошо бы написать фреймворк (каркас)
в простейшем варианте это консольное приложение с возможностью задания
числа потоков, таймаутов между ними и уровня логирования (verbose)
gbt>Для этого использую TaskManagerEx — Add-On к Task Manager. gbt>Кстати, очень удобное дополнение к отладчику этот TaskManagerEx...
Это та, которая на Codeproject ?
gbt>-- gbt> Igor Polyakov — igorpol_gbt (at) mail (dot) ru
Hello, Ka3a4oK, you wrote:
gbt>>Для этого использую TaskManagerEx — Add-On к Task Manager. gbt>>Кстати, очень удобное дополнение к отладчику этот TaskManagerEx... > Это та, которая на Codeproject ?