Skip to content

EnsureProperPathSeparators() causes wrong paths with Cygwin #1418

@oold

Description

@oold

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions