Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Paul Pluzhnikov <ppluzhnikov@google.com>
To: Joel Brobecker <brobecker@adacore.com>
Cc: tromey@redhat.com, Pedro Alves <pedro@codesourcery.com>,
	        gdb-patches@sourceware.org
Subject: Re: [patch] Fix a crash when displaying variables from shared  	library.
Date: Fri, 06 Mar 2009 22:06:00 -0000	[thread overview]
Message-ID: <8ac60eac0903061406t610ba1a1y1c62e5ee30332c7c@mail.gmail.com> (raw)
In-Reply-To: <20090306174822.GJ3744@adacore.com>

[-- Attachment #1: Type: text/plain, Size: 995 bytes --]

On Fri, Mar 6, 2009 at 9:48 AM, Joel Brobecker <brobecker@adacore.com> wrote:

>> C) the call to "solib_address (block->startaddr)" should be replaced with
>>    something like "solib_contains_p (solib, block->startaddr)" (which would
>>    then work independently of the so_list_head).
>
> Duh! Yes - this sounds like a pretty simple way to do this. We know
> which solib we're trying to match our expression against, why are we
> iterating over all SOs again? I like your suggestion.
>
> The body of solib_contains_p (can we rename it to "solib_contains_address"
> or "solib_has_address") can be extracted from solib_address.

Attached patch implements this; regtested on Linux/x86_64 with
no regressions.

Thanks,
-- 
Paul Pluzhnikov

2009-03-06  Paul Pluzhnikov  <ppluzhnikov@google.com>

	    * solib.c (solib_contains_address_p): New function.
	    (solib_name_from_address): Use it.
	    * printcmd.c (display_uses_solib_p): Use it.
	    * solib.h (solib_contains_address_p): Declare it.

[-- Attachment #2: gdb-display-crash-20090306.txt --]
[-- Type: text/plain, Size: 2652 bytes --]

Index: printcmd.c
===================================================================
RCS file: /cvs/src/src/gdb/printcmd.c,v
retrieving revision 1.146
diff -u -p -u -r1.146 printcmd.c
--- printcmd.c	6 Mar 2009 18:51:05 -0000	1.146
+++ printcmd.c	6 Mar 2009 20:32:59 -0000
@@ -1767,7 +1767,7 @@ display_uses_solib_p (const struct displ
   struct expression *const exp = d->exp;
 
   if (d->block != NULL
-      && solib_name_from_address (d->block->startaddr) == solib->so_name)
+      && solib_contains_address_p (solib, d->block->startaddr))
     return 1;
 
   for (i = 0; i < exp->nelts; )
@@ -1783,7 +1783,7 @@ display_uses_solib_p (const struct displ
 	    SYMBOL_OBJ_SECTION (symbol);
 
 	  if (block != NULL
-	      && solib_name_from_address (block->startaddr) == solib->so_name)
+	      && solib_contains_address_p (solib, block->startaddr))
 	    return 1;
 
 	  if (section && section->objfile == solib->objfile)
Index: solib.c
===================================================================
RCS file: /cvs/src/src/gdb/solib.c,v
retrieving revision 1.113
diff -u -p -u -r1.113 solib.c
--- solib.c	6 Mar 2009 18:51:05 -0000	1.113
+++ solib.c	6 Mar 2009 20:32:59 -0000
@@ -834,6 +834,21 @@ info_sharedlibrary_command (char *ignore
     }
 }
 
+/* Return 1 if ADDRESS lies within SOLIB.  */
+
+int
+solib_contains_address_p (const struct so_list *const solib,
+			  CORE_ADDR address)
+{
+  struct section_table *p;
+
+  for (p = solib->sections; p < solib->sections_end; p++)
+    if (p->addr <= address && address < p->endaddr)
+      return 1;
+
+  return 0;
+}
+
 /*
 
    GLOBAL FUNCTION
@@ -862,15 +877,8 @@ solib_name_from_address (CORE_ADDR addre
   struct so_list *so = 0;	/* link map state variable */
 
   for (so = so_list_head; so; so = so->next)
-    {
-      struct section_table *p;
-
-      for (p = so->sections; p < so->sections_end; p++)
-	{
-	  if (p->addr <= address && address < p->endaddr)
-	    return (so->so_name);
-	}
-    }
+    if (solib_contains_address_p (so, address))
+      return (so->so_name);
 
   return (0);
 }
Index: solib.h
===================================================================
RCS file: /cvs/src/src/gdb/solib.h,v
retrieving revision 1.22
diff -u -p -u -r1.22 solib.h
--- solib.h	6 Mar 2009 18:51:05 -0000	1.22
+++ solib.h	6 Mar 2009 20:32:59 -0000
@@ -47,6 +47,10 @@ extern void solib_create_inferior_hook (
 
 extern char *solib_name_from_address (CORE_ADDR);
 
+/* Return 1 if ADDR lies within SOLIB.  */
+
+extern int solib_contains_address_p (const struct so_list *, CORE_ADDR);
+
 /* Return 1 if PC lies in the dynamic symbol resolution code of the
    run time loader.  */
 

  parent reply	other threads:[~2009-03-06 22:06 UTC|newest]

Thread overview: 34+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-02-05  3:03 Paul Pluzhnikov
2009-02-06 21:38 ` Tom Tromey
2009-02-07  2:37   ` Paul Pluzhnikov
2009-02-11  1:46     ` Tom Tromey
2009-02-19  1:00       ` Paul Pluzhnikov
2009-02-19  7:52         ` Paul Pluzhnikov
2009-02-23  1:47         ` Joel Brobecker
2009-02-23 18:36           ` Paul Pluzhnikov
2009-03-03  2:31             ` Paul Pluzhnikov
2009-03-04  0:51               ` Tom Tromey
2009-03-04 19:26                 ` Paul Pluzhnikov
2009-03-05 20:04                   ` Joel Brobecker
2009-03-05 23:46                     ` Paul Pluzhnikov
2009-03-06  3:06                       ` Paul Pluzhnikov
2009-03-06  3:18                         ` Paul Pluzhnikov
2009-03-06 17:48                         ` Joel Brobecker
2009-03-06 18:31                           ` Paul Pluzhnikov
2009-03-06 18:47                             ` Joel Brobecker
2009-03-06 18:52                               ` Paul Pluzhnikov
2009-03-06 22:06                           ` Paul Pluzhnikov [this message]
2009-03-09 18:33                             ` Joel Brobecker
2009-03-10  2:05                               ` Paul Pluzhnikov
2009-03-10 14:31                                 ` Daniel Jacobowitz
2009-03-12  2:45                                   ` Paul Pluzhnikov
2009-03-20 20:32                                     ` Joel Brobecker
2009-03-20 20:53                                       ` Paul Pluzhnikov
2009-03-23 17:31                                         ` Joel Brobecker
2009-03-18  2:50                       ` Pedro Alves
2009-03-18  3:24                         ` [patch] Fix a crash when displaying variables from shared ?library Joel Brobecker
2009-03-18  4:06                           ` Paul Pluzhnikov
2009-03-18  4:19                             ` Pedro Alves
2009-03-18  6:54                               ` Paul Pluzhnikov
2009-03-18 17:32                                 ` Pedro Alves
2009-02-06 21:53 ` [patch] Fix a crash when displaying variables from shared library Pedro Alves

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=8ac60eac0903061406t610ba1a1y1c62e5ee30332c7c@mail.gmail.com \
    --to=ppluzhnikov@google.com \
    --cc=brobecker@adacore.com \
    --cc=gdb-patches@sourceware.org \
    --cc=pedro@codesourcery.com \
    --cc=tromey@redhat.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