From ac637ec30dd9a3b19a02d1967a80e4ddf739706e Mon Sep 17 00:00:00 2001 From: Hannes Domani Date: Sun, 24 May 2020 22:59:33 +0200 Subject: [PATCH] Don't close thread handles provided by WaitForDebugEvent I sometimes encountered a weird breakpoint failure when using start: (gdb) start Temporary breakpoint 2 at 0x40162d: file gdb-25911.c, line 4. Starting program: C:\src\tests\gdb-25911.exe Warning: Cannot insert breakpoint 2. Cannot access memory at address 0x401628 After trying a lot of combinations, I found a way to reproduce it: (gdb) file gdb-25987.exe Reading symbols from gdb-25987.exe... (gdb) start Temporary breakpoint 1 at 0x401638: file gdb-25987.cpp, line 13. Starting program: C:\src\tests\gdb-25987.exe Temporary breakpoint 1, main () at gdb-25987.cpp:13 13 int main() { (gdb) c Continuing. Program received signal SIGSEGV, Segmentation fault. MyClass::call (this=0x3d20d0) at gdb-25987.cpp:8 8 *(char*)(nullptr) = 1; (gdb) kill Kill the program being debugged? (y or n) y [Inferior 1 (process 1140) killed] (gdb) file gdb-25911.exe Load new symbol table from "gdb-25911.exe"? (y or n) y Reading symbols from gdb-25911.exe... (gdb) start Temporary breakpoint 2 at 0x40162d: file gdb-25911.c, line 4. Starting program: C:\src\tests\gdb-25911.exe Warning: Cannot insert breakpoint 2. Cannot access memory at address 0x401628 Command aborted. The actual failure was that ReadProcessMemory used a process handle that was no longer valid. And the underlying reason was that the windows_thread_info destructor closes a thread handle that was provided earlier by WaitForDebugEvent. But since this is not allowed (and it was actually already closed at this point, and the handle value reused), this closed another still-needed handle. gdb/ChangeLog: 2020-05-27 Hannes Domani * nat/windows-nat.c (windows_thread_info::~windows_thread_info): Don't close thread handle. --- gdb/ChangeLog | 5 +++++ gdb/nat/windows-nat.c | 1 - 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 0879dfab5c5..08641e5721b 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2020-05-27 Hannes Domani + + * nat/windows-nat.c (windows_thread_info::~windows_thread_info): + Don't close thread handle. + 2020-05-27 Tom Tromey Simon Marchi diff --git a/gdb/nat/windows-nat.c b/gdb/nat/windows-nat.c index 8c2092a51d7..709a9d3a31b 100644 --- a/gdb/nat/windows-nat.c +++ b/gdb/nat/windows-nat.c @@ -51,7 +51,6 @@ bool ignore_first_breakpoint = false; windows_thread_info::~windows_thread_info () { - CloseHandle (h); } void -- 2.30.2