@@ -53,7 +53,7 @@ using namespace Firebird;
5353// #define JRD_FAILURE_UNKNOWN "<UNKNOWN>" // Used when buffer fails
5454
5555
56- static void internal_error (ISC_STATUS status , int number, const TEXT* file = NULL , int line = 0 );
56+ static void get_internal_error_msg (TEXT* errmsg_buf, size_t errmsg_buf_size , int number, const TEXT* file = NULL , int line = 0 );
5757static void post_nothrow (const unsigned lenToAdd, const ISC_STATUS* toAdd, FbStatusVector* statusVector);
5858
5959
@@ -69,13 +69,10 @@ void ERR_bugcheck(int number, const TEXT* file, int line)
6969 * Things seem to be going poorly today.
7070 *
7171 **************************************/
72- thread_db* const tdbb = JRD_get_thread_data ();
73- Database* const dbb = tdbb->getDatabase ();
74-
75- dbb->dbb_flags |= DBB_bugcheck;
76- CCH_shutdown (tdbb);
72+ TEXT errmsg[MAX_ERRMSG_LEN + 1 ];
73+ get_internal_error_msg (errmsg, sizeof (errmsg), number, file, line);
7774
78- internal_error (isc_bug_check, number, file, line );
75+ ERR_bugcheck_msg (errmsg );
7976}
8077
8178
@@ -94,10 +91,23 @@ void ERR_bugcheck_msg(const TEXT* msg)
9491 thread_db* const tdbb = JRD_get_thread_data ();
9592 Database* const dbb = tdbb->getDatabase ();
9693
94+ Arg::StatusVector status_vector;
95+ status_vector << Arg::Gds (isc_bug_check) << Arg::Str (msg);
96+ FbLocalStatus status;
97+ status_vector.copyTo (&status);
98+
99+ // It's important to put the message into the log before any
100+ // further actions because there is always a risk of crashing.
101+ iscDbLogStatus (dbb->dbb_filename .nullStr (), &status);
102+
97103 dbb->dbb_flags |= DBB_bugcheck;
98104 CCH_shutdown (tdbb);
99105
100- ERR_post (Arg::Gds (isc_bug_check) << Arg::Str (msg));
106+ if (Config::getBugcheckAbort ())
107+ abort ();
108+
109+ ERR_post_nothrow (status_vector);
110+ status_exception::raise (tdbb->tdbb_status_vector );
101111}
102112
103113
@@ -117,7 +127,10 @@ void ERR_soft_bugcheck(int number, const TEXT* file, int line)
117127 **************************************/
118128
119129 fb_assert (false );
120- internal_error (isc_bug_check, number, file, line);
130+ TEXT errmsg[MAX_ERRMSG_LEN + 1 ];
131+ get_internal_error_msg (errmsg, sizeof (errmsg), number, file, line);
132+
133+ ERR_post (Arg::Gds (isc_bug_check) << Arg::Str (errmsg));
121134}
122135
123136
@@ -133,8 +146,10 @@ void ERR_corrupt(int number)
133146 * Things seem to be going poorly today.
134147 *
135148 **************************************/
149+ TEXT errmsg[MAX_ERRMSG_LEN + 1 ];
150+ get_internal_error_msg (errmsg, sizeof (errmsg), number);
136151
137- internal_error ( isc_db_corrupt, number );
152+ ERR_post ( Arg::Gds ( isc_db_corrupt) << Arg::Str (errmsg) );
138153}
139154
140155
@@ -413,7 +428,7 @@ void ERR_build_status(FbStatusVector* status_vector, const Arg::StatusVector& v)
413428}
414429
415430
416- static void internal_error (ISC_STATUS status , int number, const TEXT* file, int line)
431+ static void get_internal_error_msg (TEXT* errmsg_buf, size_t errmsg_buf_size , int number, const TEXT* file, int line)
417432{
418433/* *************************************
419434 *
@@ -425,12 +440,10 @@ static void internal_error(ISC_STATUS status, int number, const TEXT* file, int
425440 * Things seem to be going poorly today.
426441 *
427442 **************************************/
428- TEXT errmsg[MAX_ERRMSG_LEN + 1 ];
443+ if (gds__msg_lookup (0 , FB_IMPL_MSG_FACILITY_JRD_BUGCHK, number, errmsg_buf_size, errmsg_buf, NULL ) < 1 )
444+ strcpy (errmsg_buf, " Internal error code" );
429445
430- if (gds__msg_lookup (0 , FB_IMPL_MSG_FACILITY_JRD_BUGCHK, number, sizeof (errmsg), errmsg, NULL ) < 1 )
431- strcpy (errmsg, " Internal error code" );
432-
433- const size_t len = strlen (errmsg);
446+ const size_t len = strlen (errmsg_buf);
434447
435448 if (file)
436449 {
@@ -444,12 +457,10 @@ static void internal_error(ISC_STATUS status, int number, const TEXT* file, int
444457 break ;
445458 }
446459 }
447- fb_utils::snprintf (errmsg + len, sizeof (errmsg) - len,
460+ fb_utils::snprintf (errmsg_buf + len, errmsg_buf_size - len,
448461 " (%d), file: %s line: %d" , number, ptr, line);
449462 }
450463 else {
451- fb_utils::snprintf (errmsg + len, sizeof (errmsg) - len, " (%d)" , number);
464+ fb_utils::snprintf (errmsg_buf + len, errmsg_buf_size - len, " (%d)" , number);
452465 }
453-
454- ERR_post (Arg::Gds (status) << Arg::Str (errmsg));
455466}
0 commit comments