[RFC 2nd ver] New info command for win32 native target

Pierre Muller
2002-02-18T14:01:15Z

After the remarks from Eli and Christopher, I
change my patch to try to complete their requests.

At 12:22 06/02/2002 , Eli Zaretskii a Ã©crit:

>On Wed, 6 Feb 2002, Pierre Muller wrote:
>
> > This patch adds a new win32 native specific command:
> > "info sel"
>
>Thanks. A couple of comments:
>
> - this command needs to be documented in gdb.texinfo, similarly to
> "info dos ldt" and friends (and in the same chapter, but in a
> different subsection);

I added some very basic stuff, but I then also realized that none
of the win32 specific commands are documented while quite a few are win32 specific:
info dll
dll-symbols
set/show debugevents
set/show debugexec
set/show debugexception
set/show debugmemory
info dll

I added some entries to some of these commands, but probably Christopher could do
that better than I did...

> - since it's a Windows-specific command, I suggest to name it
> "info w32 sel" or "info windows sel" or maybe "info cygwin sel":
> something that will tell it's not available on every platform
> (actually, using ``seg'' instead of ``sel'' might probably be even
> better, since the information you show is about a segment whose
> selector is passed as an argument);

I moved it to become "info w32 selector"

> - I think it's a good idea to make the format used to print the segment
> as similar as possible to the one used by "info dos ..." commands;

I tried to make it as similar as possible.

> - why do you only print CS, DS, and FS if no argument is given? why not
> all of the segment registers? I think at least SS and GS might be
> interesting

I also changed this to simply display all 6 segment registers.

<<<<Variant without argument>>>>>
(top-gdb) info w32 sel
Selector $cs
0x01b: base=0x00000000 limit=0xffffffff 32-bit Code (Exec/Read, N.Conf)
Priviledge level = 3. Page granular.
Selector $ds
0x023: base=0x00000000 limit=0xffffffff 32-bit Data (Read/Write, Exp-up)
Priviledge level = 3. Page granular.
Selector $es
0x023: base=0x00000000 limit=0xffffffff 32-bit Data (Read/Write, Exp-up)
Priviledge level = 3. Page granular.
Selector $ss
0x023: base=0x00000000 limit=0xffffffff 32-bit Data (Read/Write, Exp-up)
Priviledge level = 3. Page granular.
Selector $fs
0x038: base=0x7ffde000 limit=0x00000fff 32-bit Data (Read/Write, Exp-up)
Priviledge level = 3. Byte granular.
Selector $gs
0x000: Segment not present

<<<<Variant with argument>>>>>

(top-gdb) info w32 sel 0x11
Selector "0x11"
0x011: base=0x00000000 limit=0xffffffff 32-bit Data (Read/Write, Exp-up)
Priviledge level = 0. Page granular.

2002-02-18 Pierre Muller <muller@ics.u-strasbg.fr>

* win32-nat.c (display_selector): New function. Displays information
about the information returned by GetThreadSelectorEntry API function.
(display_selectors): New function. Displays the infomation of
the selector given as argument, or of CS, DS ans FS selectors
if no argument is given.
( _initialize_inftarg): Add "w32" as info prefix command.
Add "info w32 selector" as command calling display_selectors.

Index: win32-nat.c
===================================================================
RCS file: /cvs/src/src/gdb/win32-nat.c,v
retrieving revision 1.51
diff -b -u -p -r1.51 win32-nat.c
--- win32-nat.c 2002/02/16 02:33:24 1.51
+++ win32-nat.c 2002/02/18 13:33:31
@@ -820,6 +820,126 @@ handle_output_debug_string (struct targe
return gotasig;
}

+static int
+display_selector (HANDLE thread, DWORD sel)
+{
+ LDT_ENTRY info;
+ if (GetThreadSelectorEntry (thread, sel, &info))
+ {
+ int base, limit;
+ printf_filtered ("0x%03lx: ", sel);
+ if (!info.HighWord.Bits.Pres)
+ {
+ puts_filtered ("Segment not present\n");
+ return 0;
+ }
+ base = (info.HighWord.Bits.BaseHi << 24) +
+ (info.HighWord.Bits.BaseMid << 16)
+ + info.BaseLow;
+ limit = (info.HighWord.Bits.LimitHi << 16) + info.LimitLow;
+ if (info.HighWord.Bits.Granularity)
+ limit = (limit << 12) | 0xfff;
+ printf_filtered ("base=0x%08x limit=0x%08x", base, limit);
+ if (info.HighWord.Bits.Default_Big)
+ puts_filtered(" 32-bit ");
+ else
+ puts_filtered(" 16-bit ");
+ switch ((info.HighWord.Bits.Type & 0xf) >> 1)
+ {
+ case 0:
+ puts_filtered ("Data (Read-Only, Exp-up");
+ break;
+ case 1:
+ puts_filtered ("Data (Read/Write, Exp-up");
+ break;
+ case 2:
+ puts_filtered ("Unused segment (");
+ break;
+ case 3:
+ puts_filtered ("Data (Read/Write, Exp-down");
+ break;
+ case 4:
+ puts_filtered ("Code (Exec-Only, N.Conf");
+ break;
+ case 5:
+ puts_filtered ("Code (Exec/Read, N.Conf");
+ break;
+ case 6:
+ puts_filtered ("Code (Exec-Only, Conf");
+ break;
+ case 7:
+ puts_filtered ("Code (Exec/Read, Conf");
+ break;
+ default:
+ printf_filtered ("Unknown type 0x%x",info.HighWord.Bits.Type);
+ }
+ if ((info.HighWord.Bits.Type & 0x1) == 0)
+ puts_filtered(", N.Acc");
+ puts_filtered (")\n");
+ if ((info.HighWord.Bits.Type & 0x10) == 0)
+ puts_filtered("System selector ");
+ printf_filtered ("Priviledge level = %d. ", info.HighWord.Bits.Dpl);
+ if (info.HighWord.Bits.Granularity)
+ puts_filtered ("Page granular.\n");
+ else
+ puts_filtered ("Byte granular.\n");
+ return 1;
+ }
+ else
+ {
+ printf_filtered ("Invalid selector 0x%lx.\n",sel);
+ return 0;
+ }
+}
+
+static void
+display_selectors (char * args, int from_tty)
+{
+ if (!current_thread)
+ {
+ puts_filtered ("Impossible to display selectors now.\n");
+ return;
+ }
+ if (!args)
+ {
+
+ puts_filtered ("Selector $cs\n");
+ display_selector (current_thread->h,
+ current_thread->context.SegCs);
+ puts_filtered ("Selector $ds\n");
+ display_selector (current_thread->h,
+ current_thread->context.SegDs);
+ puts_filtered ("Selector $es\n");
+ display_selector (current_thread->h,
+ current_thread->context.SegEs);
+ puts_filtered ("Selector $ss\n");
+ display_selector (current_thread->h,
+ current_thread->context.SegSs);
+ puts_filtered ("Selector $fs\n");
+ display_selector (current_thread->h,
+ current_thread->context.SegFs);
+ puts_filtered ("Selector $gs\n");
+ display_selector (current_thread->h,
+ current_thread->context.SegGs);
+ }
+ else
+ {
+ int sel;
+ sel = parse_and_eval_long (args);
+ printf_filtered ("Selector \"%s\"\n",args);
+ display_selector (current_thread->h, sel);
+ }
+}
+
+static struct cmd_list_element *info_w32_cmdlist = NULL;
+
+static void
+info_w32_command (char *args, int from_tty)
+{
+ help_list (info_w32_cmdlist, "info w32 ", class_info, gdb_stdout);
+}
+
+
#define DEBUG_EXCEPTION_SIMPLE(x) if (debug_exceptions) \
printf_unfiltered ("gdb: Target exception %s at 0x%08lx\n", x, \
(DWORD) current_event.u.Exception.ExceptionRecord.ExceptionAddress)
@@ -1757,6 +1877,14 @@ _initialize_inftarg (void)

add_info ("dll", info_dll_command, "Status of loaded DLLs.");
add_info_alias ("sharedlibrary", "dll", 1);
+
+ add_prefix_cmd ("w32", class_info, info_w32_command,
+ "Print information specific to Win32 debugging.",
+ &info_w32_cmdlist, "info w32 ", 0, &infolist);
+
+ add_cmd ("selector", class_info, display_selectors,
+ "Display selectors infos.",
+ &info_w32_cmdlist);

add_target (&child_ops);
}
Index: doc/gdb.texinfo
===================================================================
RCS file: /cvs/src/src/gdb/doc/gdb.texinfo,v
retrieving revision 1.90
diff -b -u -p -r1.90 gdb.texinfo
--- gdb.texinfo 2002/02/15 19:06:33 1.90
+++ gdb.texinfo 2002/02/18 13:33:36
@@ -10487,6 +10487,7 @@ configurations.
* HP-UX:: HP-UX
* SVR4 Process Information:: SVR4 process information
* DJGPP Native:: Features specific to the DJGPP port
+* Win32 Native:: Features specific to the Cygwin port
@end menu

@node HP-UX
@@ -10685,6 +10686,61 @@ mapped 1:1, i.e.@: the physical and line
This command is supported only with some DPMI servers.
@end table

+@node Win32 Native
+@subsection Features for Debugging @sc{Win32} Programs
+@cindex @sc{Win32} debugging
+@cindex native @sc{Win32} debugging
+@cindex Win32-specific commands
+
+@value{GDBN} supports native debugging of @sc{Win32} programs, and
+defines a few commands specific to the @sc{Win32} port. This
+subsection describes those commands.
+
+@table @code
+@kindex info w32
+@item info w32
+This is a prefix of @sc{w32}-specific commands which print
+information about the target system and important OS structures.
+
+@kindex selector
+@cindex Win32 selector info
+@item info w32 selector
+This command displays information returned by
+the Win32 API GetThreadSelectorEntry function.
+It takes an optional argument that is evaluated to
+a long value to give the information about this given selector.
+Without argument, this command displays information
+about the the six segment registers.
+
+@kindex new-console
+@item new-console
+This boolean value controls whether the debuggee should
+be started in a new console or in the same console as the debugger.
+
+@kindex new-group
+@item new-group
+This boolean value controls whether the debuggee should
+start a new group or stay in the same group as the debugger.
+This affects the handling of certain Win32 exceptions.
+
+@kindex debugevents
+@item debugevents
+This boolean value adds debug output concerning events seen by the debugger.
+
+@kindex debugexec
+@item debugexec
+This boolean value adds debug output concerning execute events seen by the debugger.
+
+@kindex debugexceptions
+@item debugexceptions
+This boolean value adds debug ouptut concerning exception events seen by the debugger.
+
+@kindex debugmemory
+@item debugmemory
+This boolean value adds debug ouptut concerning memory events seen by the debugger.
+
+@end table
+
@node Embedded OS
@section Embedded Operating Systems

Pierre Muller
Institut Charles Sadron
6,rue Boussingault
F 67083 STRASBOURG CEDEX (France)
mailto:muller@ics.u-strasbg.fr
Phone : (33)-3-88-41-40-07 Fax : (33)-3-88-41-40-99