summaryrefslogtreecommitdiffstats
path: root/js/xpconnect/src/XPCDebug.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'js/xpconnect/src/XPCDebug.cpp')
-rw-r--r--js/xpconnect/src/XPCDebug.cpp63
1 files changed, 63 insertions, 0 deletions
diff --git a/js/xpconnect/src/XPCDebug.cpp b/js/xpconnect/src/XPCDebug.cpp
new file mode 100644
index 000000000..f8500ba10
--- /dev/null
+++ b/js/xpconnect/src/XPCDebug.cpp
@@ -0,0 +1,63 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/* vim: set ts=8 sts=4 et sw=4 tw=99: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "xpcprivate.h"
+#include "jsprf.h"
+#include "nsThreadUtils.h"
+#include "nsContentUtils.h"
+
+#include "mozilla/Sprintf.h"
+
+#ifdef XP_WIN
+#include <windows.h>
+#endif
+
+static void DebugDump(const char* fmt, ...)
+{
+ char buffer[2048];
+ va_list ap;
+ va_start(ap, fmt);
+#ifdef XPWIN
+ _vsnprintf(buffer, sizeof(buffer), fmt, ap);
+ buffer[sizeof(buffer)-1] = '\0';
+#else
+ VsprintfLiteral(buffer, fmt, ap);
+#endif
+ va_end(ap);
+#ifdef XP_WIN
+ if (IsDebuggerPresent()) {
+ OutputDebugStringA(buffer);
+ }
+#endif
+ printf("%s", buffer);
+}
+
+bool
+xpc_DumpJSStack(bool showArgs, bool showLocals, bool showThisProps)
+{
+ JSContext* cx = nsContentUtils::GetCurrentJSContextForThread();
+ if (!cx) {
+ printf("there is no JSContext on the stack!\n");
+ } else if (char* buf = xpc_PrintJSStack(cx, showArgs, showLocals, showThisProps)) {
+ DebugDump("%s\n", buf);
+ JS_smprintf_free(buf);
+ }
+ return true;
+}
+
+char*
+xpc_PrintJSStack(JSContext* cx, bool showArgs, bool showLocals,
+ bool showThisProps)
+{
+ JS::AutoSaveExceptionState state(cx);
+
+ char* buf = JS::FormatStackDump(cx, nullptr, showArgs, showLocals, showThisProps);
+ if (!buf)
+ DebugDump("%s", "Failed to format JavaScript stack for dump\n");
+
+ state.restore();
+ return buf;
+}