Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-winehq
Commits
7af48607
Commit
7af48607
authored
Apr 01, 2020
by
Rémi Bernon
Committed by
Alexandre Julliard
Apr 01, 2020
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
winedbg: Store the current debug event in gdbctx.
Signed-off-by:
Rémi Bernon
<
rbernon@codeweavers.com
>
Signed-off-by:
Alexandre Julliard
<
julliard@winehq.org
>
parent
b434af66
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
18 additions
and
18 deletions
+18
-18
gdbproxy.c
programs/winedbg/gdbproxy.c
+18
-18
No files found.
programs/winedbg/gdbproxy.c
View file @
7af48607
...
...
@@ -87,6 +87,7 @@ struct gdb_context
int
exec_tid
;
/* tid used in step & continue */
int
other_tid
;
/* tid to be used in any other operation */
/* current Win32 trap env */
DEBUG_EVENT
de
;
unsigned
last_sig
;
BOOL
in_trap
;
/* Win32 information */
...
...
@@ -393,8 +394,10 @@ static BOOL handle_exception(struct gdb_context* gdbctx, EXCEPTION_DEBUG_INFO* e
return
ret
;
}
static
void
handle_debug_event
(
struct
gdb_context
*
gdbctx
,
DEBUG_EVENT
*
de
)
static
void
handle_debug_event
(
struct
gdb_context
*
gdbctx
)
{
DEBUG_EVENT
*
de
=
&
gdbctx
->
de
;
union
{
char
bufferA
[
256
];
WCHAR
buffer
[
256
];
...
...
@@ -575,12 +578,10 @@ static BOOL check_for_interrupt(struct gdb_context* gdbctx)
static
void
wait_for_debuggee
(
struct
gdb_context
*
gdbctx
)
{
DEBUG_EVENT
de
;
gdbctx
->
in_trap
=
FALSE
;
for
(;;)
{
if
(
!
WaitForDebugEvent
(
&
de
,
10
))
if
(
!
WaitForDebugEvent
(
&
gdbctx
->
de
,
10
))
{
if
(
GetLastError
()
==
ERROR_SEM_TIMEOUT
)
{
...
...
@@ -589,7 +590,7 @@ static void wait_for_debuggee(struct gdb_context* gdbctx)
ERR
(
"Failed to break into debuggee
\n
"
);
break
;
}
WaitForDebugEvent
(
&
de
,
INFINITE
);
WaitForDebugEvent
(
&
gdbctx
->
de
,
INFINITE
);
}
else
{
continue
;
}
...
...
@@ -597,13 +598,13 @@ static void wait_for_debuggee(struct gdb_context* gdbctx)
break
;
}
}
handle_debug_event
(
gdbctx
,
&
de
);
handle_debug_event
(
gdbctx
);
assert
(
!
gdbctx
->
process
||
gdbctx
->
process
->
pid
==
0
||
de
.
dwProcessId
==
gdbctx
->
process
->
pid
);
assert
(
!
dbg_curr_thread
||
de
.
dwThreadId
==
dbg_curr_thread
->
tid
);
gdbctx
->
de
.
dwProcessId
==
gdbctx
->
process
->
pid
);
assert
(
!
dbg_curr_thread
||
gdbctx
->
de
.
dwThreadId
==
dbg_curr_thread
->
tid
);
if
(
gdbctx
->
in_trap
)
break
;
ContinueDebugEvent
(
de
.
dwProcessId
,
de
.
dwThreadId
,
DBG_CONTINUE
);
ContinueDebugEvent
(
gdbctx
->
de
.
dwProcessId
,
gdbctx
->
de
.
dwThreadId
,
DBG_CONTINUE
);
}
}
...
...
@@ -1880,7 +1881,7 @@ static BOOL gdb_exec(const char* wine_path, unsigned port, unsigned flags)
return
TRUE
;
}
static
BOOL
gdb_startup
(
struct
gdb_context
*
gdbctx
,
DEBUG_EVENT
*
de
,
unsigned
flags
,
unsigned
port
)
static
BOOL
gdb_startup
(
struct
gdb_context
*
gdbctx
,
unsigned
flags
,
unsigned
port
)
{
int
sock
;
struct
sockaddr_in
s_addrs
=
{
0
};
...
...
@@ -1906,7 +1907,7 @@ static BOOL gdb_startup(struct gdb_context* gdbctx, DEBUG_EVENT* de, unsigned fl
goto
cleanup
;
/* step 2: do the process internal creation */
handle_debug_event
(
gdbctx
,
de
);
handle_debug_event
(
gdbctx
);
/* step3: get the wine loader name */
if
(
!
dbg_get_debuggee_info
(
gdbctx
->
process
->
handle
,
&
imh_mod
))
...
...
@@ -1969,7 +1970,6 @@ cleanup:
static
BOOL
gdb_init_context
(
struct
gdb_context
*
gdbctx
,
unsigned
flags
,
unsigned
port
)
{
DEBUG_EVENT
de
;
int
i
;
gdbctx
->
sock
=
-
1
;
...
...
@@ -1991,23 +1991,23 @@ static BOOL gdb_init_context(struct gdb_context* gdbctx, unsigned flags, unsigne
gdbctx
->
wine_segs
[
i
]
=
0
;
/* wait for first trap */
while
(
WaitForDebugEvent
(
&
de
,
INFINITE
))
while
(
WaitForDebugEvent
(
&
gdbctx
->
de
,
INFINITE
))
{
if
(
de
.
dwDebugEventCode
==
CREATE_PROCESS_DEBUG_EVENT
)
if
(
gdbctx
->
de
.
dwDebugEventCode
==
CREATE_PROCESS_DEBUG_EVENT
)
{
/* this should be the first event we get,
* and the only one of this type */
assert
(
gdbctx
->
process
==
NULL
&&
de
.
dwProcessId
==
dbg_curr_pid
);
assert
(
gdbctx
->
process
==
NULL
&&
gdbctx
->
de
.
dwProcessId
==
dbg_curr_pid
);
/* gdbctx->dwProcessId = pid; */
if
(
!
gdb_startup
(
gdbctx
,
&
de
,
flags
,
port
))
return
FALSE
;
if
(
!
gdb_startup
(
gdbctx
,
flags
,
port
))
return
FALSE
;
assert
(
!
gdbctx
->
in_trap
);
}
else
{
handle_debug_event
(
gdbctx
,
&
de
);
handle_debug_event
(
gdbctx
);
if
(
gdbctx
->
in_trap
)
break
;
}
ContinueDebugEvent
(
de
.
dwProcessId
,
de
.
dwThreadId
,
DBG_CONTINUE
);
ContinueDebugEvent
(
gdbctx
->
de
.
dwProcessId
,
gdbctx
->
de
.
dwThreadId
,
DBG_CONTINUE
);
}
return
TRUE
;
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment