From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 18458 invoked by alias); 18 Feb 2002 14:01:15 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 18213 invoked from network); 18 Feb 2002 14:00:49 -0000 Received: from unknown (HELO cerbere.u-strasbg.fr) (130.79.112.7) by sources.redhat.com with SMTP; 18 Feb 2002 14:00:49 -0000 Received: from laocoon (laocoon.u-strasbg.fr [130.79.112.72]) by cerbere.u-strasbg.fr (8.9.3/8.8.7) with ESMTP id PAA19313; Mon, 18 Feb 2002 15:00:15 +0100 Message-Id: <4.2.0.58.20020218143531.013a7fa8@ics.u-strasbg.fr> X-Sender: muller@ics.u-strasbg.fr X-Mailer: QUALCOMM Windows Eudora Pro Version 4.2.0.58 Date: Mon, 18 Feb 2002 06:01:00 -0000 To: Eli Zaretskii From: Pierre Muller Subject: [RFC 2nd ver] New info command for win32 native target Cc: gdb-patches@sources.redhat.com In-Reply-To: References: <4.2.0.58.20020206103131.00ad1898@ics.u-strasbg.fr> Mime-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 8bit X-SW-Source: 2002-02/txt/msg00470.txt.bz2 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. <<<>>>> (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 <<<>>>> (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 * 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