diff options
author | Hannes Domani <ssbssa@yahoo.de> | 2020-05-24 22:59:33 +0200 |
---|---|---|
committer | Hannes Domani <ssbssa@yahoo.de> | 2020-05-27 19:15:53 +0200 |
commit | ac637ec30dd9a3b19a02d1967a80e4ddf739706e (patch) | |
tree | a30550c2b68d8865e23bb924a9b121e89b7f86b4 /gdb | |
parent | 198204a7f0255c0e25dcda6b7d6a72e666d689c1 (diff) | |
download | fsf-binutils-gdb-ac637ec30dd9a3b19a02d1967a80e4ddf739706e.zip fsf-binutils-gdb-ac637ec30dd9a3b19a02d1967a80e4ddf739706e.tar.gz fsf-binutils-gdb-ac637ec30dd9a3b19a02d1967a80e4ddf739706e.tar.bz2 |
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 <ssbssa@yahoo.de>
* nat/windows-nat.c (windows_thread_info::~windows_thread_info):
Don't close thread handle.
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/nat/windows-nat.c | 1 |
2 files changed, 5 insertions, 1 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 0879dfa..08641e5 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2020-05-27 Hannes Domani <ssbssa@yahoo.de> + + * nat/windows-nat.c (windows_thread_info::~windows_thread_info): + Don't close thread handle. + 2020-05-27 Tom Tromey <tom@tromey.com> Simon Marchi <simon.marchi@efficios.com> diff --git a/gdb/nat/windows-nat.c b/gdb/nat/windows-nat.c index 8c2092a..709a9d3 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 |