Я таки промахнулся, ошибка в приложении вызывается на 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, получая отлуп.

