A veces la lógica (el algoritmo) usado en un stored procedure o en un trigger tiene un error, lo difícil es ir rastreándolo hasta saber cual es ese error y donde se produce. Para conseguir esto hay tres alternativas principales:

1. Usar HOOPER for Firebird, un programa que se dedica específicamente a esa tarea. El único (pequeño-gran) problema es que no es gratis, es de pago. Pero el programa es muy bueno y si constantemente tienes errores que tardas en encontrar deberías pensar seriamente en adquirirlo.

2. Convertir los stored procedures no seleccionables en seleccionables. Eso lo haces agregándole muchas instrucciones SUSPEND (una por cada vez que quieras obtener los valores de las variables). Eso significa que no ejecutarás tu stored procedure con el comando EXECUTE PROCEDURE sino que lo harás con el comando SELECT * FROM MiStoredProcedure. La práctica común es reemplazar los nombres de las variables con campos que tienen el mismo nombre,  para que menos código necesite ser cambiado.

3.  Crear una tabla para guardar en ella las variables y valores de control, luego miras el contenido de esa tabla. Para que esta técnica funcione las inserciones dentro de la tabla de errores deben estar dentro de IN AUTONOMOUS TRANSACTION, por ejemplo:

IN AUTONOMOUS TRANSACTION DO BEGIN
    INSERT INTO MiTablaLog
           VALUES (CURRENT_USER, CURRENT_TIMESTAMP, 'Este es el error que descubrí');
END