1
0
Fork 0

Logging for Nasal errors, disabled for now.

Code to log Nasal, as well as C++, errors. But need a way to reduce
the false-positive rate, so disabled for now.
This commit is contained in:
James Turner 2020-04-20 10:47:11 +01:00
parent b016c4b489
commit fdd509a080
4 changed files with 54 additions and 5 deletions

View file

@ -101,6 +101,35 @@ void addSentryTag(const char* tag, const char* value)
sentry_set_tag(tag, value);
}
void sentryReportNasalError(const std::string& msg, const string_list& stack)
{
if (!static_sentryEnabled)
return;
#if 0
sentry_value_t exc = sentry_value_new_object();
sentry_value_set_by_key(exc, "type", sentry_value_new_string("Exception"));
sentry_value_set_by_key(exc, "value", sentry_value_new_string(msg.c_str()));
sentry_value_t stackData = sentry_value_new_list();
for (const auto& nasalFrame : stack) {
sentry_value_append(stackData, sentry_value_new_string(nasalFrame.c_str()));
}
sentry_value_set_by_key(exc, "stack", stackData);
sentry_value_t event = sentry_value_new_event();
sentry_value_set_by_key(event, "exception", exc);
// add the Nasal stack trace data
// capture the C++ stack-trace. Probably not that useful but can't hurt
sentry_event_value_add_stacktrace(event, nullptr, 0);
sentry_capture_event(event);
#endif
}
} // of namespace
#else
@ -131,6 +160,10 @@ void addSentryTag(const char*, const char*)
{
}
void sentryReportNasalError(const std::string&, const string_list&)
{
}
} // of namespace
#endif

View file

@ -19,6 +19,7 @@
#pragma once
#include <string>
#include <simgear/misc/strutils.hxx>
namespace flightgear
{
@ -34,6 +35,7 @@ void addSentryTag(const char* tag, const char* value);
void addSentryTag(const std::string& tag, const std::string& value);
void sentryReportNasalError(const std::string& msg, const string_list& stack);
} // of namespace flightgear

View file

@ -55,6 +55,7 @@
#include <Main/globals.hxx>
#include <Main/util.hxx>
#include <Main/fg_props.hxx>
#include <Main/sentryIntegration.hxx>
using std::map;
using std::string;
@ -310,7 +311,9 @@ naRef FGNasalSys::callMethodWithContext(naContext ctx, naRef code, naRef self, i
return naCallMethodCtx(ctx, code, self, argc, args, locals);
} catch (sg_exception& e) {
SG_LOG(SG_NASAL, SG_DEV_ALERT, "caught exception invoking nasal method:" << e.what());
logNasalStack(ctx);
string_list nasalStack;
logNasalStack(ctx, nasalStack);
flightgear::sentryReportNasalError(string{"Exception invoking nasal method:"} + e.what(), nasalStack);
return naNil();
}
}
@ -1305,23 +1308,34 @@ void FGNasalSys::loadPropertyScripts(SGPropertyNode* n)
// Logs a runtime error, with stack trace, to the FlightGear log stream
void FGNasalSys::logError(naContext context)
{
SG_LOG(SG_NASAL, SG_ALERT, "Nasal runtime error: " << naGetError(context));
logNasalStack(context);
string errorMessage = naGetError(context);
SG_LOG(SG_NASAL, SG_ALERT, "Nasal runtime error: " << errorMessage);
string_list nasalStack;
logNasalStack(context, nasalStack);
flightgear::sentryReportNasalError(errorMessage, nasalStack);
}
void FGNasalSys::logNasalStack(naContext context)
void FGNasalSys::logNasalStack(naContext context, string_list& stack)
{
const int stack_depth = naStackDepth(context);
if (stack_depth < 1)
return;
stack.push_back(string{naStr_data(naGetSourceFile(context, 0))} +
", line " + std::to_string(naGetLine(context, 0)));
SG_LOG(SG_NASAL, SG_ALERT,
" at " << naStr_data(naGetSourceFile(context, 0)) <<
", line " << naGetLine(context, 0));
for(int i=1; i<stack_depth; i++) {
SG_LOG(SG_NASAL, SG_ALERT,
" called from: " << naStr_data(naGetSourceFile(context, i)) <<
", line " << naGetLine(context, i));
stack.push_back(string{naStr_data(naGetSourceFile(context, i))} +
", line " + std::to_string(naGetLine(context, i)));
}
}

View file

@ -225,7 +225,7 @@ private:
void addPersistentTimer(TimerObj* pto);
void removePersistentTimer(TimerObj* obj);
static void logNasalStack(naContext context);
static void logNasalStack(naContext context, string_list& stack);
};
#if 0