This is the mail archive of the gdb@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]

Re: External debug symbols


I have looked at this. I think it's a valuable thing to have.  I have
a few questions about the approach, and a few more specific comments
about the code. I haven't followed all the implications of this patch.
What do other folks think?

See below.

Alexander Larsson writes:
 > On Tue, 27 Aug 2002, Alexander Larsson wrote:
 > 
 > > On 21 Aug 2002, Jim Blandy wrote:
 > >  
 > > > Wow, that's a lot less work than I expected it to be.  It doesn't look
 > > > especially wrong to me.  Basically, the presence of a .debuglink
 > > > section tells GDB that, whenever it loads one objfile, it should also
 > > > load the other.  When the stripped objfile is freed, the other one is
 > > > freed, too.
 > > 
 > > Ok. Here is a new, more "productized" patch. It is slightly larger, since 
 > > it does a bit more. New in this patch is:
 > > * Some more memory handling code to handle the cases Jim mentioned.
 > > * Verify the crc32 checksum of the debug symbol file
 > > * look for separate debug files in several places:
 > >   1 - In the same directory as the original file
 > >   2 - In a .debug subdirectory
 > >   3 - In a gloal directory, with the full pathname appended.
 > >       So if the global path is /usr/lib/debug it would look for 
 > >       debug info for /usr/bin/ls in /usr/lib/debug/usr/bin/ls.
 > >       (global directory is settable in gdb, defaults to $libdir/debug)
 > > 
 > >   The last place is what we want to use for the Red Hat distribution. It 
 > >   makes it very nice from a packaging standpoint.
 > 
 > There was a slight bug in the old patch regarding the ALL_OBJFILES_SAFE 
 > macro, but here is an updated one that should work.
 > 
 > I'd like to hear some comments on this patch.
 > 
 > -- 
 > =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 >  Alexander Larsson                                            Red Hat, Inc 
 >                    alexl@redhat.com    alla@lysator.liu.se 
 > He's a globe-trotting neurotic grifter with acid for blood. She's a 
 > mistrustful antique-collecting snake charmer with the power to see death. They 
 > fight crime! 
 > diff --exclude '*~' --exclude '*.orig' --exclude '*.rej' --exclude '.#*' --exclude '*.o' --exclude CVS --exclude SCCS --exclude RCS --exclude '.*.flags' --exclude .cvsignore --exclude .depend -ur gdb-5.2.1/gdb/acconfig.h gdb-5.2.1.separate_debug_symbols/gdb/acconfig.h
 > --- gdb-5.2.1/gdb/acconfig.h	Sat Jan  5 19:36:32 2002
 > +++ gdb-5.2.1.separate_debug_symbols/gdb/acconfig.h	Mon Aug 26 16:44:14 2002
 > @@ -173,3 +173,7 @@
 >  
 >  /* nativefile */
 >  #undef GDB_NM_FILE
 > +
 > +/* debugdir */
 > +#undef DEBUGDIR
 > +
 > diff --exclude '*~' --exclude '*.orig' --exclude '*.rej' --exclude '.#*' --exclude '*.o' --exclude CVS --exclude SCCS --exclude RCS --exclude '.*.flags' --exclude .cvsignore --exclude .depend -ur gdb-5.2.1/gdb/acinclude.m4 gdb-5.2.1.separate_debug_symbols/gdb/acinclude.m4
 > --- gdb-5.2.1/gdb/acinclude.m4	Mon Apr 15 06:28:49 2002
 > +++ gdb-5.2.1.separate_debug_symbols/gdb/acinclude.m4	Mon Aug 26 11:16:40 2002
 > @@ -976,3 +976,18 @@
 >    *) CC="$CC $am_cv_prog_cc_stdc" ;;
 >  esac
 >  ])
 > +
 > +dnl written by Guido Draheim <guidod@gmx.de>, original by Alexandre Oliva 
 > +dnl Version 1.3 (2001/03/02)
 > +dnl source http://www.gnu.org/software/ac-archive/Miscellaneous/ac_define_dir.html
 > +
 > +AC_DEFUN([AC_DEFINE_DIR], [
 > +  test "x$prefix" = xNONE && prefix="$ac_default_prefix"
 > +  test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
 > +  ac_define_dir=`eval echo [$]$2`
 > +  ac_define_dir=`eval echo [$]ac_define_dir`
 > +  ifelse($3, ,
 > +    AC_DEFINE_UNQUOTED($1, "$ac_define_dir"),
 > +    AC_DEFINE_UNQUOTED($1, "$ac_define_dir", $3))
 > +])
 > +
 > diff --exclude '*~' --exclude '*.orig' --exclude '*.rej' --exclude '.#*' --exclude '*.o' --exclude CVS --exclude SCCS --exclude RCS --exclude '.*.flags' --exclude .cvsignore --exclude .depend -ur gdb-5.2.1/gdb/configure.in gdb-5.2.1.separate_debug_symbols/gdb/configure.in
 > --- gdb-5.2.1/gdb/configure.in	Thu Mar 28 05:28:00 2002
 > +++ gdb-5.2.1.separate_debug_symbols/gdb/configure.in	Mon Aug 26 17:02:48 2002
 > @@ -234,6 +234,14 @@
 >  AC_CHECK_LIB(socket, socketpair)
 >  AC_CHECK_FUNCS(socketpair)
 >  
 > +debugdir=${libdir}/debug
 > +	 
 > +AC_ARG_WITH(separate-debug-dir,
 > +[  --with-separate-debug-dir=path   Look for global separate debug info in this path [LIBDIR/debug]],
 > +[debugdir="${withval}"])
 > +	
 > +AC_DEFINE_DIR(DEBUGDIR, debugdir)
 > +#AC_DEFINE_UNQUOTED(DEBUGDIR, "$debugdir"),
 >  

Could this be done alternatively using an environment variable,
instead of being set at configure time? something like
DEBUG_INFO_PATH, or similar.  I don't have a strong preference, but
seems to me that an environment variable is more flexible. 


 >  BFD_NEED_DECLARATION(malloc)
 >  BFD_NEED_DECLARATION(realloc)
 > diff --exclude '*~' --exclude '*.orig' --exclude '*.rej' --exclude '.#*' --exclude '*.o' --exclude CVS --exclude SCCS --exclude RCS --exclude '.*.flags' --exclude .cvsignore --exclude .depend -ur gdb-5.2.1/gdb/objfiles.c gdb-5.2.1.separate_debug_symbols/gdb/objfiles.c
 > --- gdb-5.2.1/gdb/objfiles.c	Thu Dec  6 21:59:11 2001
 > +++ gdb-5.2.1.separate_debug_symbols/gdb/objfiles.c	Mon Sep 16 14:01:45 2002
 > @@ -325,6 +325,27 @@
 >    return (objfile);
 >  }
 >  
 > +void
 > +put_objfile_before (struct objfile *objfile, struct objfile *before_this)
 > +{
 > +  struct objfile **objp;
 > +
 > +  unlink_objfile (objfile);
 > +  
 > +  for (objp = &object_files; *objp != NULL; objp = &((*objp)->next))
 > +    {
 > +      if (*objp == before_this)
 > +	{
 > +	  objfile->next = *objp;
 > +	  *objp = objfile;
 > +	  return;
 > +	}
 > +    }
 > +  
 > +  internal_error (__FILE__, __LINE__,
 > +		  "put_objfile_before: before objfile not in list");
 > +}
 > +

Thinking out loud...

I wonder if it wouldn't be more intuitive to add the debug info to the
objfile, instead of creating another objfile.  So that in the end we
would have just a new field added to the objfile, indicating the name
of the debug info file.

It would definitely require more work. There are a few function you
can look at to see how to do this: add_symbol_file itself, of course,
and syms_from_objfile() (which is used in rs6000-tdep.c, in
objfile_symbol_add) (btw, would objfile_symbol_add still work with
your changes?).

Does the reread_symbols() function still work?  To see this you need
to run the inferior, then w/o quitting from gdb, modify the
executable/recompile and then issue a 'run' command.  That would cause
the excutable and symbols to be reread.  It walks the list of existing
objfiles and updates those that need it, but it doesn't call
symbol_file_add, so the crc check would not be done and the 2 files
could get out of sync.

What does the global variable symfile_objfile point to now?
I wonder if lookups of this type would still work:
  sym = lookup_minimal_symbol ("_Prelude", NULL, symfile_objfile);

If I understand correctly, we would have the minimal symbols hanging
off the exec objfile, but the symbol tables would hang off the symbol
objfile? (I haven't looked at this closely, maybe this is not the
case). No, wait, I think we would have 2 copies of the minimal symbols?


 >  /* Put OBJFILE at the front of the list.  */
 >  
 >  void
 > @@ -397,6 +418,18 @@
 >  void
 >  free_objfile (struct objfile *objfile)
 >  {
 > +  if (objfile->separate_debug_objfile)
 > +    {
 > +      free_objfile (objfile->separate_debug_objfile);
 > +    }
 > +  
 > +  if (objfile->separate_debug_objfile_backlink)
 > +    {
 > +      /* We freed the separate debug file, make sure the base objfile
 > +	 doesn't reference it.  */
 > +      objfile->separate_debug_objfile_backlink->separate_debug_objfile = NULL;
 > +    }
 > +  
 >    /* First do any symbol file specific actions required when we are
 >       finished with a particular symbol file.  Note that if the objfile
 >       is using reusable symbol information (via mmalloc) then each of
 > diff --exclude '*~' --exclude '*.orig' --exclude '*.rej' --exclude '.#*' --exclude '*.o' --exclude CVS --exclude SCCS --exclude RCS --exclude '.*.flags' --exclude .cvsignore --exclude .depend -ur gdb-5.2.1/gdb/objfiles.h gdb-5.2.1.separate_debug_symbols/gdb/objfiles.h
 > --- gdb-5.2.1/gdb/objfiles.h	Sat Jun 29 00:05:47 2002
 > +++ gdb-5.2.1.separate_debug_symbols/gdb/objfiles.h	Mon Sep 16 13:15:15 2002
 > @@ -409,6 +409,9 @@
 >      ExportEntry *export_list;
 >      int export_list_size;
 >  
 > +    struct objfile *separate_debug_objfile;
 > +    struct objfile *separate_debug_objfile_backlink;
 > +    

Could you add some comments, here and elsewhere?


 >      /* Place to stash various statistics about this objfile */
 >        OBJSTATS;
 >    };
 > @@ -500,6 +503,8 @@
 >  
 >  extern int build_objfile_section_table (struct objfile *);
 >  
 > +extern void put_objfile_before (struct objfile *, struct objfile *);
 > +
 >  extern void objfile_to_front (struct objfile *);
 >  
 >  extern void unlink_objfile (struct objfile *);
 > diff --exclude '*~' --exclude '*.orig' --exclude '*.rej' --exclude '.#*' --exclude '*.o' --exclude CVS --exclude SCCS --exclude RCS --exclude '.*.flags' --exclude .cvsignore --exclude .depend -ur gdb-5.2.1/gdb/symfile.c gdb-5.2.1.separate_debug_symbols/gdb/symfile.c
 > --- gdb-5.2.1/gdb/symfile.c	Sat Jun 22 18:49:33 2002
 > +++ gdb-5.2.1.separate_debug_symbols/gdb/symfile.c	Mon Sep 16 15:07:17 2002
 > @@ -160,6 +160,8 @@
 >  
 >  static void info_ext_lang_command (char *args, int from_tty);
 >  
 > +static char *find_separate_debug_file (struct objfile *objfile, const char *name);
 > +
 >  static void init_filename_language_table (void);
 >  
 >  void _initialize_symfile (void);
 > @@ -836,7 +838,12 @@
 >  {
 >    struct objfile *objfile;
 >    struct partial_symtab *psymtab;
 > +  char *debugfile;
 >    bfd *abfd;
 > +  struct section_addr_info orig_addrs;
 > +  
 > +  if (addrs)
 > +    orig_addrs = *addrs;
 >  
 >    /* Open a bfd for the file, and give user a chance to burp if we'd be
 >       interactively wiping out any existing symbols.  */
 > @@ -926,6 +933,21 @@
 >    if (target_new_objfile_hook)
 >      target_new_objfile_hook (objfile);
 >  
 > +  debugfile = find_separate_debug_file (objfile, name);
 > +  if (debugfile)
 > +    {
 > +      printf_filtered ("loading separate debug info from '%s'\n", debugfile);
 > +
 > +      objfile->separate_debug_objfile = symbol_file_add (debugfile, from_tty, (addrs != NULL) ? &orig_addrs : NULL, 0, flags);


Suggest using a simple conditional instead of a conditional expression.



 > +      objfile->separate_debug_objfile->separate_debug_objfile_backlink = objfile;
 > +      
 > +      /* Put the separate debug object before the normal one, this is so that
 > +         usage of the ALL_OBJFILES_SAFE macro will stay safe. */
 > +      put_objfile_before (objfile->separate_debug_objfile, objfile);
 > +      
 > +      xfree (debugfile);
 > +    }
 > +  
 >    return (objfile);
 >  }
 >  
 > @@ -985,6 +1007,188 @@
 >  #endif
 >  }
 >  
 > +static unsigned long crc32 (unsigned long crc, unsigned char *buf, size_t len)
 > +{
 > +  static const unsigned long crc32_table[256] =
 > +    {
 > +      0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419,
 > +      0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4,
 > +      0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07,
 > +      0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
 > +      0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856,
 > +      0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
 > +      0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4,
 > +      0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
 > +      0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3,
 > +      0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a,
 > +      0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599,
 > +      0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
 > +      0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190,
 > +      0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f,
 > +      0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e,
 > +      0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
 > +      0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed,
 > +      0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
 > +      0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3,
 > +      0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
 > +      0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a,
 > +      0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5,
 > +      0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010,
 > +      0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
 > +      0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17,
 > +      0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6,
 > +      0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615,
 > +      0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
 > +      0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344,
 > +      0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
 > +      0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a,
 > +      0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
 > +      0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1,
 > +      0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c,
 > +      0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef,
 > +      0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
 > +      0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe,
 > +      0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31,
 > +      0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c,
 > +      0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
 > +      0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b,
 > +      0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
 > +      0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1,
 > +      0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
 > +      0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278,
 > +      0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7,
 > +      0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66,
 > +      0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
 > +      0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605,
 > +      0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8,
 > +      0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b,
 > +      0x2d02ef8d
 > +    };
 > +  unsigned char *end;
 > +
 > +  crc = ~crc & 0xffffffff;
 > +  for (end = buf + len; buf < end; ++buf)
 > +    crc = crc32_table[(crc ^ *buf) & 0xff] ^ (crc >> 8);
 > +  return ~crc & 0xffffffff;;
 > +}
 > +

I don't think this function belongs in this file. It is general enough
that it could be pushed into utils.c. Maybe even into some directory
outside of gdb? It could be useful to other tools as well.


For the below, in theory is Ok, but I would suggest looking at the
function openp() (in source.c) and how it is used in the solib_open()
function in solib.c.  The tricky part is going to be assuring that the
filename is portable, i.e. working on windows/dos systems where the
directory separator is '\'. Look at IS_DIR_SEPARATOR, IS_ABSOLUTE_PATH
in the libiberty directory.

Once this is done, this change would need to be documented in the gdb
manual, and a testcase added to the testsuite.


Elena



 > +int
 > +separate_debug_file_exists (const char *name, unsigned long crc)
 > +{
 > +  unsigned long file_crc = 0;
 > +  int fd;
 > +  char buffer[8*1024];
 > +  int count;
 > +
 > +  fd = open (name, O_RDONLY);
 > +  if (fd < 0)
 > +    return 0;
 > +
 > +  while ((count = read (fd, buffer, sizeof (buffer))) > 0)
 > +    file_crc = crc32 (file_crc, buffer, count);
 > +
 > +  close (fd);
 > +
 > +  return crc == file_crc;
 > +}
 > +
 > +static char *debug_file_search_path = NULL;
 > +
 > +static char *
 > +find_separate_debug_file (struct objfile *objfile, const char *name)
 > +{
 > +  asection *sect;
 > +  char *basename;
 > +  char *dir;
 > +  char *debugfile;
 > +  char *name_copy;
 > +  bfd_size_type debuglink_size;
 > +  unsigned long crc32;
 > +  int crc_offset;
 > +  unsigned char *crc_data;
 > +  unsigned char *p;
 > +
 > +  sect = bfd_get_section_by_name (objfile->obfd, ".gnu_debuglink");
 > +
 > +  if (sect == NULL)
 > +    return NULL;
 > +
 > +  debuglink_size = bfd_section_size (objfile->obfd, sect);
 > +  
 > +  basename = alloca (debuglink_size);
 > +  bfd_get_section_contents (objfile->obfd, sect, basename,
 > +			    (file_ptr)0, (bfd_size_type)debuglink_size);
 > +
 > +  /* Crc value is stored after the filename, aligned up to 4 bytes. */
 > +  crc_offset = strlen (basename) + 1;
 > +  if (crc_offset & 3)
 > +    crc_offset += 4 - (crc_offset & 3);
 > +  crc_data = basename + crc_offset;
 > +
 > +  crc32 = 0;
 > +  if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
 > +    {
 > +      for (p = crc_data; p < crc_data + 4; ++p)
 > +	crc32 = (crc32 << 8) | *p;
 > +    }
 > +  else
 > +    {
 > +      for (p = crc_data + 4 - 1; p >= crc_data; --p)
 > +	crc32 = (crc32 << 8) | *p;
 > +    }
 > +  
 > +  dir = xstrdup (name);
 > +  p = strrchr (dir, '/');
 > +  if (p != NULL)
 > +    {
 > +      *(p+1) = 0;
 > +    }
 > +  else
 > +    {
 > +      *dir = 0;
 > +    }
 > +
 > +  debugfile = alloca (strlen (debug_file_search_path) + 1 +
 > +		      strlen (dir) + strlen (".debug/") + strlen (basename) + 1);
 > +
 > +  /* First try in the same directory as the original file: */
 > +  strcpy (debugfile, dir);
 > +  strcat (debugfile, basename);
 > +
 > +  if (separate_debug_file_exists (debugfile, crc32))
 > +    {
 > +      xfree (dir);
 > +      return xstrdup (debugfile);
 > +    }
 > +  
 > +  /* Then try in a subdirectory called .debug */
 > +  strcpy (debugfile, dir);
 > +  strcat (debugfile, ".debug/");
 > +  strcat (debugfile, basename);
 > +
 > +  if (separate_debug_file_exists (debugfile, crc32))
 > +    {
 > +      xfree (dir);
 > +      return xstrdup (debugfile);
 > +    }
 > +  
 > +  /* Then try in the global debugfile directory */
 > +  strcpy (debugfile, debug_file_search_path);
 > +  strcat (debugfile, "/");
 > +  strcat (debugfile, dir);
 > +  strcat (debugfile, "/");
 > +  strcat (debugfile, basename);
 > +
 > +  if (separate_debug_file_exists (debugfile, crc32))
 > +    {
 > +      xfree (dir);
 > +      return xstrdup (debugfile);
 > +    }
 > +  
 > +  return NULL;
 > +}
 > +
 > +
 >  /* This is the symbol-file command.  Read the file, analyze its
 >     symbols, and add a struct symtab to a symtab list.  The syntax of
 >     the command is rather bizarre--(1) buildargv implements various
 > @@ -3336,4 +3540,17 @@
 >  		  "cache.\n",
 >  		  &setlist),
 >       &showlist);
 > +
 > +  debug_file_search_path = xstrdup (DEBUGDIR);
 > +  c = add_set_cmd ("debug-file-search-path", class_support, var_string,
 > +		   (char *) &debug_file_search_path,
 > +		   "Set the search path for loading separate debug symbols.\n"
 > +		   "Separate debug symbols are first searched for in the same\n"
 > +		   "directory as the binary, then in the .debug subdirectory,\n"
 > +		   "and lastly at the path of the directory of the binary with\n"
 > +		   "the global debug-file search path prepended\n",
 > +		   &setlist);
 > +  add_show_from_set (c, &showlist);
 > +  c->completer = filename_completer;
 > +
 >  }


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