Install termination handler to collect additional information for C++ exceptions
This commit is contained in:
parent
853ba22b0d
commit
8e42daada7
@ -88,7 +88,6 @@ class SM:
|
||||
self.compiler.AddToListVar('POSTLINKFLAGS', '-m32')
|
||||
self.compiler.AddToListVar('POSTLINKFLAGS', '-Wl,-z,defs')
|
||||
self.compiler.AddToListVar('CXXFLAGS', '-std=c++11')
|
||||
self.compiler.AddToListVar('CXXFLAGS', '-fno-exceptions')
|
||||
self.compiler.AddToListVar('CXXFLAGS', '-fno-threadsafe-statics')
|
||||
self.compiler.AddToListVar('CXXFLAGS', '-Wno-non-virtual-dtor')
|
||||
self.compiler.AddToListVar('CXXFLAGS', '-Wno-overloaded-virtual')
|
||||
|
@ -56,23 +56,23 @@ public:
|
||||
|
||||
// Taken from https://hg.mozilla.org/mozilla-central/file/3eb7623b5e63b37823d5e9c562d56e586604c823/build/unix/stdc%2B%2Bcompat/stdc%2B%2Bcompat.cpp
|
||||
extern "C" void __attribute__((weak)) __cxa_throw_bad_array_new_length() {
|
||||
abort();
|
||||
abort();
|
||||
}
|
||||
|
||||
namespace std {
|
||||
/* We shouldn't be throwing exceptions at all, but it sadly turns out
|
||||
we call STL (inline) functions that do. */
|
||||
void __attribute__((weak)) __throw_out_of_range_fmt(char const* fmt, ...) {
|
||||
va_list ap;
|
||||
char buf[1024]; // That should be big enough.
|
||||
/* We shouldn't be throwing exceptions at all, but it sadly turns out
|
||||
we call STL (inline) functions that do. */
|
||||
void __attribute__((weak)) __throw_out_of_range_fmt(char const* fmt, ...) {
|
||||
va_list ap;
|
||||
char buf[1024]; // That should be big enough.
|
||||
|
||||
va_start(ap, fmt);
|
||||
vsnprintf(buf, sizeof(buf), fmt, ap);
|
||||
buf[sizeof(buf) - 1] = 0;
|
||||
va_end(ap);
|
||||
va_start(ap, fmt);
|
||||
vsnprintf(buf, sizeof(buf), fmt, ap);
|
||||
buf[sizeof(buf) - 1] = 0;
|
||||
va_end(ap);
|
||||
|
||||
__throw_range_error(buf);
|
||||
}
|
||||
__throw_range_error(buf);
|
||||
}
|
||||
} // namespace std
|
||||
|
||||
// Updated versions of the SM ones for C++14
|
||||
@ -146,6 +146,27 @@ PluginInfo plugins[256];
|
||||
#endif
|
||||
|
||||
#if defined _LINUX
|
||||
void terminateHandler()
|
||||
{
|
||||
const char *msg = "missing exception";
|
||||
std::exception_ptr pEx = std::current_exception();
|
||||
if (pEx) {
|
||||
try {
|
||||
std::rethrow_exception(pEx);
|
||||
} catch(const std::exception &e) {
|
||||
msg = strdup(e.what());
|
||||
} catch(...) {
|
||||
msg = "unknown exception";
|
||||
}
|
||||
}
|
||||
|
||||
size_t msgLength = strlen(msg) + 2;
|
||||
volatile char * volatile msgForCrashDumps = (char *)alloca(msgLength);
|
||||
strcpy((char *)msgForCrashDumps + 1, msg);
|
||||
|
||||
abort();
|
||||
}
|
||||
|
||||
void (*SignalHandler)(int, siginfo_t *, void *);
|
||||
|
||||
const int kExceptionSignals[] = {
|
||||
@ -253,6 +274,8 @@ static bool dumpCallback(const google_breakpad::MinidumpDescriptor& descriptor,
|
||||
|
||||
void OnGameFrame(bool simulating)
|
||||
{
|
||||
std::set_terminate(terminateHandler);
|
||||
|
||||
bool weHaveBeenFuckedOver = false;
|
||||
struct sigaction oact;
|
||||
|
||||
@ -609,7 +632,7 @@ class UploadThread: public IThread
|
||||
if (presubmitToken && presubmitToken[0]) {
|
||||
form->AddString("PresubmitToken", presubmitToken);
|
||||
}
|
||||
|
||||
|
||||
form->AddString("symbol_file", output.c_str());
|
||||
|
||||
MemoryDownloader data;
|
||||
|
Loading…
Reference in New Issue
Block a user