Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2562)

Unified Diff: base/process_util_win.cc

Issue 339024: Move console stack dumping code to a function so it can be reused in test_she... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 11 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « base/process_util_posix.cc ('k') | base/test/test_suite.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: base/process_util_win.cc
===================================================================
--- base/process_util_win.cc (revision 30209)
+++ base/process_util_win.cc (working copy)
@@ -4,15 +4,22 @@
#include "base/process_util.h"
+#include <fcntl.h>
+#include <io.h>
#include <windows.h>
#include <winternl.h>
#include <psapi.h>
+#include <ios>
+
+#include "base/debug_util.h"
#include "base/histogram.h"
#include "base/logging.h"
#include "base/scoped_handle_win.h"
#include "base/scoped_ptr.h"
+namespace base {
+
namespace {
// System pagesize. This value remains constant on x86/64 architectures.
@@ -21,10 +28,55 @@
// HeapSetInformation function pointer.
typedef BOOL (WINAPI* HeapSetFn)(HANDLE, HEAP_INFORMATION_CLASS, PVOID, SIZE_T);
+// Previous unhandled filter. Will be called if not NULL when we intercept an
+// exception. Only used in unit tests.
+LPTOP_LEVEL_EXCEPTION_FILTER g_previous_filter = NULL;
+
+// Prints the exception call stack.
+// This is the unit tests exception filter.
+long WINAPI StackDumpExceptionFilter(EXCEPTION_POINTERS* info) {
+ StackTrace(info).PrintBacktrace();
+ if (g_previous_filter)
+ return g_previous_filter(info);
+ return EXCEPTION_CONTINUE_SEARCH;
+}
+
+// Connects back to a console if available.
+// Only necessary on Windows, no-op on other platforms.
+void AttachToConsole() {
+ if (!AttachConsole(ATTACH_PARENT_PROCESS)) {
+ unsigned int result = GetLastError();
+ // Was probably already attached.
+ if (result == ERROR_ACCESS_DENIED)
+ return;
+
+ if (result == ERROR_INVALID_HANDLE || result == ERROR_INVALID_HANDLE) {
+ // TODO(maruel): Walk up the process chain if deemed necessary.
+ }
+ // Continue even if the function call fails.
+ AllocConsole();
+ }
+ // http://support.microsoft.com/kb/105305
+ int raw_out = _open_osfhandle(
+ reinterpret_cast<intptr_t>(GetStdHandle(STD_OUTPUT_HANDLE)), _O_TEXT);
+ *stdout = *_fdopen(raw_out, "w");
+ setvbuf(stdout, NULL, _IONBF, 0);
+
+ int raw_err = _open_osfhandle(
+ reinterpret_cast<intptr_t>(GetStdHandle(STD_ERROR_HANDLE)), _O_TEXT);
+ *stderr = *_fdopen(raw_err, "w");
+ setvbuf(stderr, NULL, _IONBF, 0);
+
+ int raw_in = _open_osfhandle(
+ reinterpret_cast<intptr_t>(GetStdHandle(STD_INPUT_HANDLE)), _O_TEXT);
+ *stdin = *_fdopen(raw_in, "r");
+ setvbuf(stdin, NULL, _IONBF, 0);
+ // Fix all cout, wcout, cin, wcin, cerr, wcerr, clog and wclog.
+ std::ios::sync_with_stdio();
+}
+
} // namespace
-namespace base {
-
ProcessId GetCurrentProcId() {
return ::GetCurrentProcessId();
}
@@ -763,6 +815,14 @@
HeapSetInformation(NULL, HeapEnableTerminationOnCorruption, NULL, 0);
}
+bool EnableInProcessStackDumping() {
+ // Add stack dumping support on exception on windows. Similar to OS_POSIX
+ // signal() handling in process_util_posix.cc.
+ g_previous_filter = SetUnhandledExceptionFilter(&StackDumpExceptionFilter);
+ AttachToConsole();
+ return true;
+}
+
void RaiseProcessToHighPriority() {
SetPriorityClass(GetCurrentProcess(), HIGH_PRIORITY_CLASS);
}
« no previous file with comments | « base/process_util_posix.cc ('k') | base/test/test_suite.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698