This is the mail archive of the 
gdb@sourceware.org
mailing list for the GDB project.
Re: setting a breakpoint on a dll, relative path or absolute path issue[solved with a patch]
- From: asmwarrior <asmwarrior at gmail dot com>
- To: gdb at sourceware dot org,  MinGW Users List <mingw-users at lists dot sourceforge dot net>
- Date: Tue, 14 Jun 2011 13:23:29 +0800
- Subject: Re: setting a breakpoint on a dll, relative path or absolute path issue[solved with a patch]
- References: <4DF31EB0.6080006@gmail.com> <4DF37ADA.3070905@users.sourceforge.net> <4DF4513A.3090902__7466.60719528354$1307866544$gmane$org@gmail.com> <4DF5AE48.9050202@gmail.com> <83ips9acr7.fsf@gnu.org>
Sounds like I have fix this problem by using the patches below.
(I'm sorry I'm only a beginner of git, so correct me if I'm wrong)
 gdb/linespec.c |    3 ++-
 gdb/source.c   |   48 +++++++++++++++++++++++++++---------------------
 gdb/utils.c    |   24 ++++++++++++++++++++++++
 3 files changed, 53 insertions(+), 22 deletions(-)
diff --git a/gdb/linespec.c b/gdb/linespec.c
index c820539..c8251c5 100644
--- a/gdb/linespec.c
+++ b/gdb/linespec.c
@@ -1211,7 +1211,8 @@ locate_first_half (char **argptr, int 
*is_quote_enclosed)
      quotes we do not break on enclosed spaces.  */
       if (!*p
       || p[0] == '\t'
-      || (p[0] == ':')
+      || ((p[0] == ':')
+ && ((p[1] == ':') || (strchr (p + 1, ':') == NULL)))
       || ((p[0] == ' ') && !*is_quote_enclosed))
     break;
       if (p[0] == '.' && strchr (p, ':') == NULL)
diff --git a/gdb/source.c b/gdb/source.c
index 70890e1..77dc249 100644
--- a/gdb/source.c
+++ b/gdb/source.c
@@ -149,7 +149,7 @@ get_lines_to_list (void)
 /* Return the current source file for listing and next line to list.
    NOTE: The returned sal pc and end fields are not valid.  */
-
+
 struct symtab_and_line
 get_current_source_symtab_and_line (void)
 {
@@ -160,7 +160,7 @@ get_current_source_symtab_and_line (void)
   cursal.line = current_source_line;
   cursal.pc = 0;
   cursal.end = 0;
-
+
   return cursal;
 }
@@ -171,7 +171,7 @@ get_current_source_symtab_and_line (void)
    process of determining a new default may call the caller!
    Use get_current_source_symtab_and_line only to get whatever
    we have without erroring out or trying to get a default.  */
-
+
 void
 set_default_source_symtab_and_line (void)
 {
@@ -187,7 +187,7 @@ set_default_source_symtab_and_line (void)
    (the returned sal pc and end fields are not valid.)
    and set the current default to whatever is in SAL.
    NOTE: The returned sal pc and end fields are not valid.  */
-
+
 struct symtab_and_line
 set_current_source_symtab_and_line (const struct symtab_and_line *sal)
 {
@@ -702,7 +702,7 @@ is_regular_file (const char *name)
    the actual file opened (this string will always start with a "/").  We
    have to take special pains to avoid doubling the "/" between the 
directory
    and the file, sigh!  Emacs gets confuzzed by this when we print the
-   source file name!!!
+   source file name!!!
    If a file is found, return the descriptor.
    Otherwise, return -1, with errno set for the last name we tried to 
open.  */
@@ -924,7 +924,7 @@ substitute_path_rule_matches (const struct 
substitute_path_rule *rule,
   /* Make sure that the region in the path that matches the substitution
      rule is immediately followed by a directory separator (or the end of
      string character).  */
-
+
   if (path[from_len] != '\0' && !IS_DIR_SEPARATOR (path[from_len]))
     return 0;
@@ -948,17 +948,17 @@ get_substitute_path_rule (const char *path)
 /* If the user specified a source path substitution rule that applies
    to PATH, then apply it and return the new path.  This new path must
    be deallocated afterwards.
-
+
    Return NULL if no substitution rule was specified by the user,
    or if no rule applied to the given PATH.  */
-
+
 static char *
 rewrite_source_path (const char *path)
 {
   const struct substitute_path_rule *rule = get_substitute_path_rule 
(path);
   char *new_path;
   int from_len;
-
+
   if (rule == NULL)
     return NULL;
@@ -985,7 +985,7 @@ rewrite_source_path (const char *path)
      Space for the path must have been malloc'd.  If a path substitution
      is applied we free the old value and set a new one.
-   On Success
+   On Success
      A valid file descriptor is returned (the return value is positive).
      FULLNAME is set to the absolute path to the file just opened.
      The caller is responsible for freeing FULLNAME.
@@ -1002,6 +1002,7 @@ find_and_open_source (const char *filename,
   char *path = source_path;
   const char *p;
   int result;
+  char *lpath;
   /* Quick way out if we already know its full name.  */
@@ -1010,7 +1011,7 @@ find_and_open_source (const char *filename,
       /* The user may have requested that source paths be rewritten
          according to substitution rules he provided.  If a substitution
          rule applies to this path, then apply it.  */
-      char *rewritten_fullname = rewrite_source_path (*fullname);
+      char *rewritten_fullname = rewrite_source_path (*fullname);
       if (rewritten_fullname != NULL)
         {
@@ -1020,7 +1021,12 @@ find_and_open_source (const char *filename,
       result = open (*fullname, OPEN_MODE);
       if (result >= 0)
-    return result;
+      {
+        lpath = gdb_realpath(*fullname);
+        xfree(*fullname);
+        *fullname = lpath;
+        return result;
+      }
       /* Didn't work -- free old one, try again.  */
       xfree (*fullname);
       *fullname = NULL;
@@ -1038,7 +1044,7 @@ find_and_open_source (const char *filename,
           make_cleanup (xfree, rewritten_dirname);
           dirname = rewritten_dirname;
         }
-
+
       /* Replace a path entry of $cdir with the compilation directory
      name.  */
 #define    cdir_len    5
@@ -1072,7 +1078,7 @@ find_and_open_source (const char *filename,
           filename = rewritten_filename;
         }
     }
-
+
   result = openp (path, OPF_SEARCH_IN_PATH, filename, OPEN_MODE, 
fullname);
   if (result < 0)
     {
@@ -1086,8 +1092,8 @@ find_and_open_source (const char *filename,
 }
 /* Open a source file given a symtab S.  Returns a file descriptor or
-   negative number for error.
-
+   negative number for error.
+
    This function is a convience function to find_and_open_source.  */
 int
@@ -1159,7 +1165,7 @@ find_source_lines (struct symtab *s, int desc)
   {
     struct cleanup *old_cleanups;
-    /* st_size might be a large type, but we only support source files 
whose
+    /* st_size might be a large type, but we only support source files 
whose
        size fits in an int.  */
     size = (int) st.st_size;
@@ -1773,7 +1779,7 @@ show_substitute_path_command (char *args, int 
from_tty)
   struct substitute_path_rule *rule = substitute_path_rules;
   char **argv;
   char *from = NULL;
-
+
   argv = gdb_buildargv (args);
   make_cleanup_freeargv (argv);
@@ -1843,7 +1849,7 @@ unset_substitute_path_command (char *args, int 
from_tty)
       rule = next;
     }
-
+
   /* If the user asked for a specific rule to be deleted but
      we could not find it, then report an error.  */
@@ -1860,7 +1866,7 @@ set_substitute_path_command (char *args, int from_tty)
 {
   char **argv;
   struct substitute_path_rule *rule;
-
+
   argv = gdb_buildargv (args);
   make_cleanup_freeargv (argv);
@@ -1884,7 +1890,7 @@ set_substitute_path_command (char *args, int from_tty)
   rule = find_substitute_path_rule (argv[0]);
   if (rule != NULL)
     delete_substitute_path_rule (rule);
-
+
   /* Insert the new substitution rule.  */
   add_substitute_path_rule (argv[0], argv[1]);
diff --git a/gdb/utils.c b/gdb/utils.c
index d10669a..14944da 100644
--- a/gdb/utils.c
+++ b/gdb/utils.c
@@ -3442,6 +3442,30 @@ gdb_realpath (const char *filename)
   }
 #endif
+  /* The MS Windows method.  If we don't have realpath, we assume we
+     don't have symlinks and just canonicalize to a Windows absolute
+     path.  GetFullPath converts ../ and ./ in relative paths to
+     absolute paths, filling in current drive if one is not given
+     or using the current directory of a specified drive (eg, "E:foo").
+     It also converts all forward slashes to back slashes.  */
+#if defined (_WIN32)
+  {
+    char buf[MAX_PATH];
+    char* basename;
+    DWORD len = GetFullPathName (filename, MAX_PATH, buf, &basename);
+    if (len == 0 || len > MAX_PATH - 1)
+      return xstrdup (filename);
+    else
+      {
+    /* The file system is case-preserving but case-insensitive,
+       Canonicalize to lowercase, using the codepage associated
+       with the process locale.  */
+        CharLowerBuff (buf, len);
+        return xstrdup (buf);
+      }
+  }
+#endif
+
   /* This system is a lost cause, just dup the buffer.  */
   return xstrdup (filename);
 }
asmwarrior
ollydbg from codeblocks' forum