summaryrefslogtreecommitdiffstats
path: root/toolkit/crashreporter/test/nsTestCrasher.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/crashreporter/test/nsTestCrasher.cpp')
-rw-r--r--toolkit/crashreporter/test/nsTestCrasher.cpp126
1 files changed, 126 insertions, 0 deletions
diff --git a/toolkit/crashreporter/test/nsTestCrasher.cpp b/toolkit/crashreporter/test/nsTestCrasher.cpp
new file mode 100644
index 000000000..1be001160
--- /dev/null
+++ b/toolkit/crashreporter/test/nsTestCrasher.cpp
@@ -0,0 +1,126 @@
+#include "mozilla/Assertions.h"
+
+#include <stdio.h>
+
+#include "nscore.h"
+#include "nsXULAppAPI.h"
+#include "nsExceptionHandler.h"
+#include "mozilla/Unused.h"
+
+/*
+ * This pure virtual call example is from MSDN
+ */
+class A;
+
+void fcn( A* );
+
+class A
+{
+public:
+ virtual void f() = 0;
+ A() { fcn( this ); }
+};
+
+class B : A
+{
+ void f() { }
+public:
+ void use() { }
+};
+
+void fcn( A* p )
+{
+ p->f();
+}
+
+void PureVirtualCall()
+{
+ // generates a pure virtual function call
+ B b;
+ b.use(); // make sure b's actually used
+}
+
+// Keep these in sync with CrashTestUtils.jsm!
+const int16_t CRASH_INVALID_POINTER_DEREF = 0;
+const int16_t CRASH_PURE_VIRTUAL_CALL = 1;
+const int16_t CRASH_RUNTIMEABORT = 2;
+const int16_t CRASH_OOM = 3;
+const int16_t CRASH_MOZ_CRASH = 4;
+const int16_t CRASH_ABORT = 5;
+
+extern "C" NS_EXPORT
+void Crash(int16_t how)
+{
+ switch (how) {
+ case CRASH_INVALID_POINTER_DEREF: {
+ volatile int* foo = (int*)0x42;
+ *foo = 0;
+ // not reached
+ break;
+ }
+ case CRASH_PURE_VIRTUAL_CALL: {
+ PureVirtualCall();
+ // not reached
+ break;
+ }
+ case CRASH_RUNTIMEABORT: {
+ NS_RUNTIMEABORT("Intentional crash");
+ break;
+ }
+ case CRASH_OOM: {
+ mozilla::Unused << moz_xmalloc((size_t) -1);
+ mozilla::Unused << moz_xmalloc((size_t) -1);
+ mozilla::Unused << moz_xmalloc((size_t) -1);
+ break;
+ }
+ case CRASH_MOZ_CRASH: {
+ MOZ_CRASH();
+ break;
+ }
+ case CRASH_ABORT: {
+ abort();
+ break;
+ }
+ default:
+ break;
+ }
+}
+
+extern "C" NS_EXPORT
+nsISupports* LockDir(nsIFile *directory)
+{
+ nsISupports* lockfile = nullptr;
+ XRE_LockProfileDirectory(directory, &lockfile);
+ return lockfile;
+}
+
+char testData[32];
+
+extern "C" NS_EXPORT
+uint64_t SaveAppMemory()
+{
+ for (size_t i=0; i<sizeof(testData); i++)
+ testData[i] = i;
+
+ FILE *fp = fopen("crash-addr", "w");
+ if (!fp)
+ return 0;
+ fprintf(fp, "%p\n", (void *)testData);
+ fclose(fp);
+
+ return (int64_t)testData;
+}
+
+#ifdef XP_WIN32
+static LONG WINAPI HandleException(EXCEPTION_POINTERS* exinfo)
+{
+ TerminateProcess(GetCurrentProcess(), 0);
+ return 0;
+}
+
+extern "C" NS_EXPORT
+void TryOverrideExceptionHandler()
+{
+ SetUnhandledExceptionFilter(HandleException);
+}
+#endif