microsoft/MIEngine

`EnsureProperPathSeparators()` causes wrong paths with Cygwin

oold opened this issue · 0 comments

oold commented

LinesForFile() fails to get the source lines for binaries built with Cygwin tools.

An incorrect path is returned from EnsureProperPathSeparators():

private async Task<SourceLineMap> LinesForFile(string file)
{
string cmd = "-symbol-list-lines " + _process.EnsureProperPathSeparators(file);

This is because EnsureProperPathSeparators() calls MapWindowsToCygwin() when debugging with a Cygwin gdb:

internal string EnsureProperPathSeparators(string path, bool isRemote = false, bool ignoreSpaces = false)
{
if (IsCygwin)
{
path = CygwinFilePathMapper.MapWindowsToCygwin(path);

MapWindowsToCygwin() calls UnixPathToWindowsPath() and this is the actual mistake that leads to the incorrect result:

string windowsPath = PlatformUtilities.UnixPathToWindowsPath(origWindowsPath);

UnixPathToWindowsPath() replaces the slashes with backslashes:

return unixPath.Replace('/', '\\');

When LaunchCygPathAndReadResult() receives the "Windows" path, it doesn't look like an absolute path anymore, so it prepends the current working drive.

if (!LaunchCygPathAndReadResult(windowsPath, localLaunchOptions.MIDebuggerPath, convertToWindowsPath: false, out string cygwinPath))

This fails if, for example, a breakpoint is created, GetBoundBreakpoint() gets called, and the fullname contains a Cygwin path.

Expected result for EnsureProperPathSeparators():
Input: /c/src/a.cpp
Conversion: /c/src/a.cpp -> /c/src/a.cpp -> /c/src/a.cpp
Output: /c/src/a.cpp

Actual result for EnsureProperPathSeparators():
Input: /c/src/a.cpp
Conversion: /c/src/a.cpp -> \c\src\a.cpp -> /c/c/src/a.cpp
Output: /c/c/src/a.cpp