Skip to content

Commit

Permalink
runtime: allow OutputDebugString to be sent to debugger
Browse files Browse the repository at this point in the history
We mark DBG_PRINTEXCEPTION_C messages in VEH handler
as handled, thus preventing debugger from seeing them.
I don't see reason for doing that. The comment warns
of crashes, but I added test and don't see any crashes.

This is also simplify VEH handler before making
changes to fix issue 8006.

Update #8006

LGTM=rsc
R=golang-codereviews, rsc
CC=golang-codereviews
https://golang.org/cl/146800043
  • Loading branch information
alexbrainman committed Sep 19, 2014
1 parent dd8f29e commit 2ed209e
Show file tree
Hide file tree
Showing 3 changed files with 6 additions and 30 deletions.
15 changes: 0 additions & 15 deletions src/runtime/os_windows_386.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,6 @@ runtime·dumpregs(Context *r)
runtime·printf("gs %x\n", r->SegGs);
}

#define DBG_PRINTEXCEPTION_C 0x40010006

// Called by sigtramp from Windows VEH handler.
// Return value signals whether the exception has been handled (-1)
// or should be made available to other handlers in the chain (0).
Expand All @@ -36,19 +34,6 @@ runtime·sighandler(ExceptionRecord *info, Context *r, G *gp)
uintptr *sp;
extern byte runtime·text[], runtime·etext[];

if(info->ExceptionCode == DBG_PRINTEXCEPTION_C) {
// This exception is intended to be caught by debuggers.
// There is a not-very-informational message like
// "Invalid parameter passed to C runtime function"
// sitting at info->ExceptionInformation[0] (a wchar_t*),
// with length info->ExceptionInformation[1].
// The default behavior is to ignore this exception,
// but somehow returning 0 here (meaning keep going)
// makes the program crash instead. Maybe Windows has no
// other handler registered? In any event, ignore it.
return -1;
}

// Only handle exception if executing instructions in Go binary
// (not Windows library code).
if(r->Eip < (uint32)runtime·text || (uint32)runtime·etext < r->Eip)
Expand Down
15 changes: 0 additions & 15 deletions src/runtime/os_windows_amd64.c
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,6 @@ runtime·dumpregs(Context *r)
runtime·printf("gs %X\n", (uint64)r->SegGs);
}

#define DBG_PRINTEXCEPTION_C 0x40010006

// Called by sigtramp from Windows VEH handler.
// Return value signals whether the exception has been handled (-1)
// or should be made available to other handlers in the chain (0).
Expand All @@ -44,19 +42,6 @@ runtime·sighandler(ExceptionRecord *info, Context *r, G *gp)
uintptr *sp;
extern byte runtime·text[], runtime·etext[];

if(info->ExceptionCode == DBG_PRINTEXCEPTION_C) {
// This exception is intended to be caught by debuggers.
// There is a not-very-informational message like
// "Invalid parameter passed to C runtime function"
// sitting at info->ExceptionInformation[0] (a wchar_t*),
// with length info->ExceptionInformation[1].
// The default behavior is to ignore this exception,
// but somehow returning 0 here (meaning keep going)
// makes the program crash instead. Maybe Windows has no
// other handler registered? In any event, ignore it.
return -1;
}

// Only handle exception if executing instructions in Go binary
// (not Windows library code).
if(r->Rip < (uint64)runtime·text || (uint64)runtime·etext < r->Rip)
Expand Down
6 changes: 6 additions & 0 deletions src/runtime/syscall_windows_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -488,3 +488,9 @@ func TestRegisterClass(t *testing.T) {
t.Fatalf("UnregisterClass failed: %v", err)
}
}

func TestOutputDebugString(t *testing.T) {
d := GetDLL(t, "kernel32.dll")
p := syscall.StringToUTF16Ptr("testing OutputDebugString")
d.Proc("OutputDebugStringW").Call(uintptr(unsafe.Pointer(p)))
}

0 comments on commit 2ed209e

Please sign in to comment.