This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]