aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoel Brobecker <brobecker@gnat.com>2011-12-27 04:03:58 +0000
committerJoel Brobecker <brobecker@gnat.com>2011-12-27 04:03:58 +0000
commit9c5e43861d58bff3581fcd76db1b23639877838c (patch)
tree191571886b84fddbb08212a5020350ae82fe954a
parentca5202fb326422b2963305329a893606ea295efa (diff)
downloadgdb-9c5e43861d58bff3581fcd76db1b23639877838c.zip
gdb-9c5e43861d58bff3581fcd76db1b23639877838c.tar.gz
gdb-9c5e43861d58bff3581fcd76db1b23639877838c.tar.bz2
Improve gdb_realpath for Windows hosts
On Windows hosts, gdb_realpath is just an xstrdup. This makes filename comparisons on Windows very chancy. Normally, we would normalize both paths, and then compare. But since the normalization doesn't do anything, two equivalent names on Windows might not match. This can happen when trying to insert a breakpoint using the fullpath of a file. For instance, if the compiler generated debug info that says that the compilation directory is: `c:\\some\\double\\slashes\\dir', then trying to insert a breakpoint on `c:/some/double/slashes/dir/foo.c:4' does not work: (gdb) b c:/some/double/slashes/dir/foo.c:4 No source file named c:/some/double/slashes/dir/foo.c:4. (gdb) b c:\some\double\slashes\dir\foo.c:4 No source file named c:\some\double\slashes\dir\foo.c:4. This fixes the problem by enhancing gdb_realpath on Windows hosts. The code is inspired from libiberty's lrealpath. gdb/ChangeLog: * utils.c (gdb_realpath): Add better support for Windows hosts.
-rw-r--r--gdb/ChangeLog4
-rw-r--r--gdb/utils.c19
2 files changed, 23 insertions, 0 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 6065377..a58e7c6 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,7 @@
+2011-12-27 Joel Brobecker <brobecker@adacore.com>
+
+ * utils.c (gdb_realpath): Add better support for Windows hosts.
+
2011-12-23 Kevin Pouget <kevin.pouget@st.com>
Introduce gdb.FinishBreakpoint in Python.
diff --git a/gdb/utils.c b/gdb/utils.c
index 16405d1..d55e6f1 100644
--- a/gdb/utils.c
+++ b/gdb/utils.c
@@ -3341,6 +3341,25 @@ 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. */
+ /* The file system is case-insensitive but case-preserving.
+ So we do not lowercase the path. Otherwise, we might not
+ be able to display the original casing in a given path. */
+#if defined (_WIN32)
+ {
+ char buf[MAX_PATH];
+ DWORD len = GetFullPathName (filename, MAX_PATH, buf, NULL);
+
+ if (len > 0 && len < MAX_PATH)
+ return xstrdup (buf);
+ }
+#endif
+
/* This system is a lost cause, just dup the buffer. */
return xstrdup (filename);
}