@@ -53,7 +53,7 @@ using namespace Firebird;
53
53
// #define JRD_FAILURE_UNKNOWN "<UNKNOWN>" // Used when buffer fails
54
54
55
55
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 );
57
57
static void post_nothrow (const unsigned lenToAdd, const ISC_STATUS* toAdd, FbStatusVector* statusVector);
58
58
59
59
@@ -69,13 +69,10 @@ void ERR_bugcheck(int number, const TEXT* file, int line)
69
69
* Things seem to be going poorly today.
70
70
*
71
71
**************************************/
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);
77
74
78
- internal_error (isc_bug_check, number, file, line );
75
+ ERR_bugcheck_msg (errmsg );
79
76
}
80
77
81
78
@@ -94,10 +91,23 @@ void ERR_bugcheck_msg(const TEXT* msg)
94
91
thread_db* const tdbb = JRD_get_thread_data ();
95
92
Database* const dbb = tdbb->getDatabase ();
96
93
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
+
97
103
dbb->dbb_flags |= DBB_bugcheck;
98
104
CCH_shutdown (tdbb);
99
105
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 );
101
111
}
102
112
103
113
@@ -117,7 +127,10 @@ void ERR_soft_bugcheck(int number, const TEXT* file, int line)
117
127
**************************************/
118
128
119
129
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));
121
134
}
122
135
123
136
@@ -133,8 +146,10 @@ void ERR_corrupt(int number)
133
146
* Things seem to be going poorly today.
134
147
*
135
148
**************************************/
149
+ TEXT errmsg[MAX_ERRMSG_LEN + 1 ];
150
+ get_internal_error_msg (errmsg, sizeof (errmsg), number);
136
151
137
- internal_error ( isc_db_corrupt, number );
152
+ ERR_post ( Arg::Gds ( isc_db_corrupt) << Arg::Str (errmsg) );
138
153
}
139
154
140
155
@@ -413,7 +428,7 @@ void ERR_build_status(FbStatusVector* status_vector, const Arg::StatusVector& v)
413
428
}
414
429
415
430
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)
417
432
{
418
433
/* *************************************
419
434
*
@@ -425,12 +440,10 @@ static void internal_error(ISC_STATUS status, int number, const TEXT* file, int
425
440
* Things seem to be going poorly today.
426
441
*
427
442
**************************************/
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" );
429
445
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);
434
447
435
448
if (file)
436
449
{
@@ -444,12 +457,10 @@ static void internal_error(ISC_STATUS status, int number, const TEXT* file, int
444
457
break ;
445
458
}
446
459
}
447
- fb_utils::snprintf (errmsg + len, sizeof (errmsg) - len,
460
+ fb_utils::snprintf (errmsg_buf + len, errmsg_buf_size - len,
448
461
" (%d), file: %s line: %d" , number, ptr, line);
449
462
}
450
463
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);
452
465
}
453
-
454
- ERR_post (Arg::Gds (status) << Arg::Str (errmsg));
455
466
}
0 commit comments