8
0
mirror of https://github.com/FirebirdSQL/firebird.git synced 2025-01-22 22:43:03 +01:00

Add BugcheckAbort option to produce coredumps on BUGCHECKs and structured exceptions

This commit is contained in:
skidder 2004-04-06 07:25:45 +00:00
parent ee89d89ffd
commit af366d4f5a
8 changed files with 42 additions and 8 deletions

View File

@ -245,6 +245,21 @@
#MaxUnflushedWriteTime = 5 #MaxUnflushedWriteTime = 5
# ----------------------------
#
# This option controls whether to call abort() when internal error or BUGCHECK
# is encountered thus invoke post-mortem debugger which can dump core suitable
# for off-line analysis. When disabled engine tries to minimize damage and
# continue execution.
#
# Note that setting this option to 1 makes POSIX SuperServer engine produce
# traceable coredumps when something nasty like SIGSEGV happens inside UDF.
#
# Type: boolean
#
#BugcheckAbort = 0
# ---------------------------- # ----------------------------
# Client Connection Settings (Basic) # Client Connection Settings (Basic)
# #

View File

@ -106,6 +106,7 @@ const ConfigImpl::ConfigEntry ConfigImpl::entries[] =
{TYPE_STRING, "DatabaseAccess", (ConfigValue) "Full"}, // location(s) of databases {TYPE_STRING, "DatabaseAccess", (ConfigValue) "Full"}, // location(s) of databases
{TYPE_STRING, "UdfAccess", (ConfigValue) "Restrict UDF"}, // location(s) of UDFs {TYPE_STRING, "UdfAccess", (ConfigValue) "Restrict UDF"}, // location(s) of UDFs
{TYPE_STRING, "TempDirectories", (ConfigValue) 0}, {TYPE_STRING, "TempDirectories", (ConfigValue) 0},
{TYPE_BOOLEAN, "BugcheckAbort", (ConfigValue) false}, // whether to abort() engine when internal error is found
{TYPE_INTEGER, "TraceDSQL", (ConfigValue) 0} // bitmask {TYPE_INTEGER, "TraceDSQL", (ConfigValue) 0} // bitmask
}; };
@ -469,6 +470,11 @@ const char *Config::getTempDirectories()
return (const char*) sysConfig.values[KEY_TEMP_DIRECTORIES]; return (const char*) sysConfig.values[KEY_TEMP_DIRECTORIES];
} }
bool Config::getBugcheckAbort()
{
return (bool) sysConfig.values[KEY_BUGCHECK_ABORT];
}
int Config::getTraceDSQL() int Config::getTraceDSQL()
{ {
return (int) sysConfig.values[KEY_TRACE_DSQL]; return (int) sysConfig.values[KEY_TRACE_DSQL];

View File

@ -103,7 +103,8 @@ class Config
KEY_DATABASE_ACCESS, // 38 KEY_DATABASE_ACCESS, // 38
KEY_UDF_ACCESS, // 39 KEY_UDF_ACCESS, // 39
KEY_TEMP_DIRECTORIES, // 40 KEY_TEMP_DIRECTORIES, // 40
KEY_TRACE_DSQL // 41 KEY_BUGCHECK_ABORT, // 41
KEY_TRACE_DSQL // 42
}; };
public: public:
@ -317,6 +318,11 @@ public:
DSQL trace bitmask DSQL trace bitmask
*/ */
static int getTraceDSQL(); static int getTraceDSQL();
/*
Abort on BUGCHECK and structured exceptions
*/
static bool getBugcheckAbort();
}; };
namespace Firebird { namespace Firebird {

View File

@ -35,6 +35,7 @@
#include <string.h> #include <string.h>
#include <stdio.h> #include <stdio.h>
#include "../common/config/config.h"
#include "../jrd/common.h" #include "../jrd/common.h"
#include "../jrd/jrd.h" #include "../jrd/jrd.h"
#include "../jrd/y_ref.h" #include "../jrd/y_ref.h"

View File

@ -51,6 +51,7 @@
#include "../jrd/dbg_proto.h" #include "../jrd/dbg_proto.h"
#include "../jrd/err_proto.h" #include "../jrd/err_proto.h"
#include "../jrd/gds_proto.h" #include "../jrd/gds_proto.h"
#include "../common/config/config.h"
using namespace Jrd; using namespace Jrd;
@ -498,6 +499,7 @@ void ERR_punt(void)
gds__log_status(tdbb->tdbb_attachment->att_filename ? gds__log_status(tdbb->tdbb_attachment->att_filename ?
tdbb->tdbb_attachment->att_filename.c_str() : NULL, tdbb->tdbb_attachment->att_filename.c_str() : NULL,
tdbb->tdbb_status_vector); tdbb->tdbb_status_vector);
if (Config::getBugcheckAbort()) abort();
} }
Firebird::status_exception::raise(tdbb->tdbb_status_vector); Firebird::status_exception::raise(tdbb->tdbb_status_vector);

View File

@ -30,13 +30,14 @@
* 2003.08.10 Claudio Valderrama: Fix SF Bugs #544132 and #728839. * 2003.08.10 Claudio Valderrama: Fix SF Bugs #544132 and #728839.
*/ */
/* /*
$Id: fun.epp,v 1.45 2004-03-31 18:03:50 alexpeshkoff Exp $ $Id: fun.epp,v 1.46 2004-04-06 07:25:45 skidder Exp $
*/ */
#include "firebird.h" #include "firebird.h"
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include "../common/config/config.h"
#include "../jrd/common.h" #include "../jrd/common.h"
#include "../jrd/jrd.h" #include "../jrd/jrd.h"
#include "../jrd/val.h" #include "../jrd/val.h"

View File

@ -46,11 +46,13 @@
#define START_CHECK_FOR_EXCEPTIONS(err) { \ #define START_CHECK_FOR_EXCEPTIONS(err) { \
SIGJMP_BUF sigenv; \ SIGJMP_BUF sigenv; \
int sig; \ int sig; \
memcpy(&tdbb->tdbb_sigsetjmp, &sigenv, sizeof sigenv); \ if (!Config::getBugcheckAbort()) { \
if (sig = SIGSETJMP (sigenv, 1)) \ memcpy(&tdbb->tdbb_sigsetjmp, &sigenv, sizeof sigenv); \
ISC_exception_post(sig, err); \ if (sig = SIGSETJMP (sigenv, 1)) \
ISC_sync_signals_set(); ISC_exception_post(sig, err); \
#define END_CHECK_FOR_EXCEPTIONS(err) ISC_sync_signals_reset(); } ISC_sync_signals_set(); \
}
#define END_CHECK_FOR_EXCEPTIONS(err) if (!Config::getBugcheckAbort()) ISC_sync_signals_reset(); }
#endif /* SUPER_SERVER */ #endif /* SUPER_SERVER */
#endif /* UNIX */ #endif /* UNIX */

View File

@ -1670,7 +1670,8 @@ ULONG ISC_exception_post(ULONG except_code, const TEXT* err_msg)
if (is_critical) if (is_critical)
{ {
exit(3); // Pass exception to outer handler in case debugger is present to collect memory dump
return EXCEPTION_CONTINUE_SEARCH;
} }
else else
{ {