Форум: "Основная";
Текущий архив: 2004.05.23;
Скачать: [xml.tar.bz2];
ВнизКритические секции Найти похожие ветки
← →
Анонимщик © (2004-05-06 18:18) [0]Попал в ситуацию взаимной блокировки. Но не могу найти места. Подскажите, будьте любезны, есть ли какие утилиты для обнаружения этого момента.
← →
Digitman © (2004-05-06 18:22) [1]насчет утилит не знаю, но если перехватить точки входа в Enter/LeaveCS, то ведя лог можно достаточно просто локализовать "узкое место"
← →
clickmaker © (2004-05-06 18:25) [2]Веди лог входов/выходов в КС
← →
Анонимщик © (2004-05-06 18:29) [3]Да блин задолбало, уже не помню, какой файл чего логгирует.
← →
Romkin (2004-05-06 18:30) [4]Это хороший повод сделать реинжиниринг. Перевожу: переписать все нафиг :)
← →
Анонимщик © (2004-05-06 18:35) [5]Ну-ну.
Спасибо на добром слове.
← →
Digitman © (2004-05-06 18:38) [6]
> Анонимщик © (06.05.04 18:29) [3]
> Да блин задолбало
раз "задолбало", раз изначально ты грамотно не структурировал свой сквозной алгоритм, раз "переписать фсе нафих" малореально, то выход - прислушайся ! - один : перехвать точек входа в API-интерфейс управления CS и вести там централизованный лог ... всего-то каких-то 2 ф-ции перехватить ! подумай !
← →
Анонимщик © (2004-05-06 18:56) [7]Спасибо, это уже намного лучше. Но еще лучше утилита какая.
← →
Alex Konshin © (2004-05-06 19:00) [8]Главные правила использования критических секций:
1. Использовать try ... finally
2. Минимизировать количество критических секций. Понятно, что злоупотребление этим правилам может привести к неоправданным ожиданиям, но зато оно и уменьшает риск (если не сводит к нулю) взаимных блокировок.
3. Вложенные блокировки в разных местах обязательно должны происходить в одинаковом порядке. То есть, если у вас есть две критические секции A и B, то проследите, что при всех возможных сценариях у вас всегда сначала блокируется А, потом блокирется B, и нет ситуций, когда B блокируется раньше, чем A.
Именно нарушение этого правила и приводит к взаимным блокировкам.
← →
Alex Konshin © (2004-05-06 19:12) [9]Digitman © (06.05.04 18:38) [6]
> Анонимщик © (06.05.04 18:29) [3]
> Да блин задолбало
раз "задолбало", раз изначально ты грамотно не структурировал свой сквозной алгоритм, раз "переписать фсе нафих" малореально, то выход - прислушайся ! - один : перехвать точек входа в API-интерфейс управления CS и вести там централизованный лог ... всего-то каких-то 2 ф-ции перехватить ! подумай !
Можно проще и без тяжелой артилерии.
Наверняка ты пишешь просто EnterCriticalSection и т.п. без указания Windows. Тогда пройдет такой способ:
Просто создай некий свой юнит. Вставь его самым первым в uses всех модулей, где ты используешь критические секции (можешь даже использовать условную компиляцию, чтоб потом проще отключить было). В этом модуле опиши свои процедуры EnterCriticalSection и LeaveCriticalSection, которые, например, пишут что-то в лог, а потом вызывают соответствующую функцию Win32 API (не забудь префикс Windows).
Прелесть этой методики в потом, что тут не нужно знать как осуществлять перехват API функций, все на уровне знания Delphi.
← →
Анонимщик © (2004-05-06 19:47) [10]Только все равно нужно знать стек, пардон.
← →
Alex Konshin © (2004-05-06 20:01) [11]Со стеком тебе может помочь Debug из JCL.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.05.23;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.03 c