mirror of
https://github.com/golang/go
synced 2024-11-23 04:50:06 -07:00
runtime: allow OutputDebugString to be sent to debugger
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
This commit is contained in:
parent
dd8f29e3fe
commit
2ed209eaf5
@ -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).
|
||||
@ -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)
|
||||
|
@ -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).
|
||||
@ -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)
|
||||
|
@ -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)))
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user