From: Pedro Alves <pedro_alves@portugalmail.pt>
To: Lerele <lerele@champenstudios.com>
Cc: gdb-patches@sourceware.org
Subject: Re: [Patch] Win32 gdbserver new interrupt support, and attach to process fix.
Date: Mon, 05 Mar 2007 00:56:00 -0000 [thread overview]
Message-ID: <45EB6AC8.3090307@portugalmail.pt> (raw)
In-Reply-To: <45EB4D5A.7070703@champenstudios.com>
[-- Attachment #1: Type: text/plain, Size: 4508 bytes --]
Lerele wrote:
> Pedro Alves wrote:
>
>> Space around '?' and ':'. Personally, I liked the res != FALSE ? 0 :
>> -1 version better.
>>
>>
>> Honestly, I don't really care too much.
>> You guys decide.
>>
>>
>> I don't care much either, but I think the spaces around '?' and ':'
>> are mandatory.
>>
>> + return res ? 0 : -1;
>
>
> I was wrong, res is not a Win32 BOOL, it's plainly a 0 or a 1.
Then make it a BOOL, it makes the code clearer anyway. See attachment.
> Already fixed spacing, while you were uploading your patches.
> I'll send a new version for interrupt patch when I get some time to do
> it, I'll need get latest cvs and merge my changes, then resend patch.
>
> I guess that would have been sufficient. But since you already changed
> "target->send_signal" to "target->send_interrupt" I guess that is no
> longer necessary.
>
Yep, just change it to win32_send_interrupt (void), and drop the
if (sig == SIGINT) test.
>> I plan on eventually adding a third option to GenerateConsoleCtrlEvent
>> and DebugBreakProcess, that injects a thread into the debuggee, since
>> WinCE doesn't have any of the above. That should make every
>> stoppable process stoppable, in all Windows versions.
>>
>
> Do you find appropriate to use this method?
It is exactly what DebugBreakProcess does internally, so if you
have a problem with the approach, you shouldn't be using it :)
The thread is short-lived. It is something like:
//inferior's address space
void helper_thread (void*)
{
DebugBreak (); // stops here.
// and dies on resume.
}
// debugger's address space
DebugBreakProcess (pid)
{
if (debugger_present) // we are sure of this
// but this call can come from
// a 3rd process.
{
create_remote_thread (helper_thread, pid);
}
}
I stumbled on the fact that on WinCE there is no
CreateRemoteThread. There is an undocumented but widely used
PerformCallback4 that does a pretty good hack and can be used
to simulate CreateRemoteThread (haven't tested yet), but it
gone in WinCE >= 5, and I don't know the a replacement, that
doesn't need messing with the registry to inject a
dll into the inferior's address space, and start a thread
on DllMain. Still searching. Maybe it is possible
to stop one thread, and manually manipulate the stack to
insert a call into CreateThread with DebugBreak as
entry point. Although the prototype for DebugBreak is
different from what CreateThread expects, there should be
no problem, since WinCE is __cdecl. It may be problematic
to do this is a thread blocked inside a Win32 or kernel
call, or if the inferior thread chosen to do it is in a stack
corrupted state. The advantage of these approaches is that there
is a real breakpoint exception being thrown. Oh, you can't just
insert a breakpoint at the current PC, since it may be a ROM
address (real Flash/ROM, not locked pages).
> Isn't there any other way to do it on WinCE?
>
Probably. I would like to know how other debuggers do it.
> 1) May be solved by doing:
>
> 1. Create in gdbserver process as much threads as number of cpus -1 the
> computer has. These threads should consume all scheduled cpu for them.
> 2. SetPriorityClass on gdbserver process with real-time priority.
> 3. GetPriorityClass on child and store it to restore later on.
> 4. SetPriorityClass on child with below normal or idle.
> 5. Suspend all child threads.
> Child should be stopped here.
>
> Only problem I see with this can be if child changes its own priority
> class between steps 3 and 4 above, however this is a very remote
> possibility, because if this happens it is because child is already
> running in real-time priority, and in this case gdbserver possibly may
> not even work at all (unless you run gdbserver itself with this priority).
>
> What do you think about this?
I was leaving something like this as a last resort, but should be possible,
I guess. Would need extra logic to handle the fact that there isn't
any real breakpoint exception live (in resume, for instance).
> Does WinCE API have these required functions?
> It may seem a quite odd way of doing it, but if it works, that's what
> counts I think.
>
Don't know about WinCE > 5. The whole security model + address space model
has changed. I'm still looking at a portable way across all WinCEs from
Mobile 2003 to 6, and if I can simulate a DebugBreakProcess, it would
all be nicely encapsulated.
Thanks for the suggestions!
Cheers,
Pedro Alves
[-- Attachment #2: win32_attach --]
[-- Type: text/plain, Size: 1338 bytes --]
Index: src/gdb/gdbserver/win32-i386-low.c
===================================================================
--- src.orig/gdb/gdbserver/win32-i386-low.c 2007-03-03 19:52:56.000000000 +0000
+++ src/gdb/gdbserver/win32-i386-low.c 2007-03-05 00:01:52.000000000 +0000
@@ -673,7 +673,7 @@ win32_create_inferior (char *program, ch
static int
win32_attach (unsigned long pid)
{
- int res = 0;
+ BOOL res = FALSE;
winapi_DebugActiveProcessStop *DebugActiveProcessStop = NULL;
winapi_DebugSetProcessKillOnExit *DebugSetProcessKillOnExit = NULL;
@@ -683,7 +683,7 @@ win32_attach (unsigned long pid)
DebugSetProcessKillOnExit = (winapi_DebugSetProcessKillOnExit *)
GetProcAddress (kernel32, _T("DebugSetProcessKillOnExit"));
- res = DebugActiveProcess (pid) ? 1 : 0;
+ res = DebugActiveProcess (pid);
if (!res)
error ("Attach to process failed.");
@@ -696,7 +696,7 @@ win32_attach (unsigned long pid)
if (current_process_handle == NULL)
{
- res = 0;
+ res = FALSE;
if (DebugActiveProcessStop != NULL)
DebugActiveProcessStop (current_process_id);
}
@@ -707,7 +707,7 @@ win32_attach (unsigned long pid)
if (kernel32 != NULL)
FreeLibrary (kernel32);
- return res? 0:-1;
+ return (res != FALSE) ? 0 : -1;
}
/* Handle OUTPUT_DEBUG_STRING_EVENT from child process. */
next prev parent reply other threads:[~2007-03-05 0:56 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-02-23 23:52 Lerele
2007-02-24 12:07 ` Eli Zaretskii
2007-02-24 13:03 ` Lerele
2007-02-24 14:07 ` Eli Zaretskii
2007-02-24 15:23 ` Lerele
2007-02-24 19:10 ` Eli Zaretskii
2007-02-24 21:19 ` Pedro Alves
2007-02-24 21:44 ` Andreas Schwab
2007-02-24 23:35 ` Lerele
2007-02-25 0:15 ` Daniel Jacobowitz
2007-02-25 1:57 ` Pedro Alves
2007-02-25 22:46 ` Pedro Alves
2007-03-04 22:53 ` Lerele
2007-03-05 0:56 ` Pedro Alves [this message]
2007-03-05 1:21 ` Pedro Alves
2007-03-05 13:17 ` Lerele
2007-03-05 20:34 ` Lerele
2007-03-05 20:44 ` Pedro Alves
2007-03-06 0:04 ` Pedro Alves
2007-03-06 20:39 ` Pedro Alves
2007-03-06 22:18 ` Lerele
2007-03-06 23:22 ` Pedro Alves
2007-03-05 12:44 ` Daniel Jacobowitz
2007-03-05 20:30 ` Lerele
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=45EB6AC8.3090307@portugalmail.pt \
--to=pedro_alves@portugalmail.pt \
--cc=gdb-patches@sourceware.org \
--cc=lerele@champenstudios.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox