Я таки промахнулся, ошибка в приложении вызывается на CloseHandle
(trace_mutex_handle), и только в том случае, если на этой же машине
запущен сам сервис Firebird.

Вот эта строка в gds.cpp выполняется с ошибкой, если на этой же машине
запущен fb, возвращаемое значение - 0
HANDLE trace_mutex_handle = CreateMutex(NULL, FALSE,
"firebird_trace_mutex");

GetLastError после этой ошибки возвращает значение 5, т.е. Access is
denied.


Если Firebird запустить как приложение - то и он, и отлаживаемое
приложение получают ссылку на один и тот же мьютекс.


Там, где этот хендл используется - в всех строках WaitForSingleObject
(trace_mutex_handle, INFINITE) не производится обработка ошибок,
соответственно блокировка реально не срабатывает.

И, кроме того, при нормально созданном мьютексе, если при выводе в лог
функции, защищенные им, умрут по какой-либо причине с исключением -
мютекс останется заблокированным, там нет явной обработки такой
ситуации.



По идее, нам этот мьютекс важен для записи в файл лога,
соответственно, имеет смысл его имя сделать производным от полного
пути к файлу лога - зачем нам блокировать глобально процессы, которые
пишут в разные файлы? И при этом клиентская либа не будет лезть к
мьютексу уже запущенного fb, получая отлуп.

Ответить