mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2026-08-27 00:26:02 -04:00
Fix "set cwd ..." on Cygwin, part 2
Even after the previous patch, on both native and gdbserver Cygwin, we
get:
(gdb) set cwd /cygdrive/d/cygwin-gdb/build-testsuite/outputs/gdb.base/exitsignal
(gdb) start
Temporary breakpoint 3 at 0x100401094: file /home/alves/rocm/gdb/src/gdb/testsuite/gdb.base/segv.c, line 26.
Starting program: /cygdrive/d/cygwin-gdb/build-testsuite/outputs/gdb.base/exitsignal/exitsignal.exe
❌️ Error creating process /cygdrive/d/cygwin-gdb/build-testsuite/outputs/gdb.base/exitsignal/exitsignal.exe (error 6): The handle is invalid.
(gdb)
On the native side, this is because in
windows_nat_target::create_inferior, we unconditionally convert
forward slashes to backward slashes:
/cygdrive/d/cygwin-gdb/build-testsuite/outputs/gdb.base/exitsignal
=>
\cygdrive\d\cygwin-gdb\build-testsuite\outputs\gdb.base\exitsignal
and then cygwin_conv_path(CCP_POSIX_TO_WIN_W) does nothing on such
path, as the backward slashes make the path not look like a Unix-style
path.
CreateProcess then fails to CD into that directory, as that's not a
real Windows native path.
The fix is to not do the slashes replacement on Cygwin.
On the GDBserver side, we're just completely missing the
cygwin_conv_path logic. This commit adds it. The code isn't shared
with GDB because GDB uses wide chars, and GDBserver uses narrow char.
Approved-By: Tom Tromey <tom@tromey.com>
Change-Id: I004f2a562757a566423f6acb9aecfcc1a7f2f746
commit-id: 85aa8c22
This commit is contained in:
parent
e922d7b7c1
commit
342ed14c19
2 changed files with 33 additions and 11 deletions
|
|
@ -2881,10 +2881,17 @@ windows_nat_target::create_inferior (const char *exec_file,
|
|||
else
|
||||
{
|
||||
expanded_infcwd = gdb_tilde_expand (inferior_cwd);
|
||||
inferior_cwd = expanded_infcwd.c_str ();
|
||||
#ifndef __CYGWIN__
|
||||
/* Mirror slashes on inferior's cwd. */
|
||||
std::replace (expanded_infcwd.begin (), expanded_infcwd.end (),
|
||||
'/', '\\');
|
||||
inferior_cwd = expanded_infcwd.c_str ();
|
||||
#else
|
||||
if (cygwin_conv_path (CCP_POSIX_TO_WIN_W,
|
||||
inferior_cwd,
|
||||
infcwd, sizeof (infcwd)) < 0)
|
||||
error (_("Error converting inferior cwd: %d"), errno);
|
||||
#endif
|
||||
}
|
||||
|
||||
memset (&si, 0, sizeof (si));
|
||||
|
|
@ -2923,11 +2930,6 @@ windows_nat_target::create_inferior (const char *exec_file,
|
|||
flags |= DEBUG_PROCESS;
|
||||
}
|
||||
|
||||
if (inferior_cwd != NULL
|
||||
&& cygwin_conv_path (CCP_POSIX_TO_WIN_W, inferior_cwd,
|
||||
infcwd, sizeof (infcwd)) < 0)
|
||||
error (_("Error converting inferior cwd: %d"), errno);
|
||||
|
||||
args = (wchar_t *) alloca ((wcslen (toexec) + wcslen (cygallargs) + 2)
|
||||
* sizeof (wchar_t));
|
||||
wcscpy (args, toexec);
|
||||
|
|
|
|||
|
|
@ -448,9 +448,11 @@ static BOOL
|
|||
create_process (const char *program, char *args,
|
||||
DWORD flags, PROCESS_INFORMATION *pi)
|
||||
{
|
||||
const std::string &inferior_cwd = get_inferior_cwd ();
|
||||
BOOL ret;
|
||||
size_t argslen, proglen;
|
||||
#ifdef __CYGWIN__
|
||||
char infcwd_buf[PATH_MAX];
|
||||
#endif
|
||||
|
||||
proglen = strlen (program) + 1;
|
||||
argslen = strlen (args) + proglen;
|
||||
|
|
@ -458,6 +460,27 @@ create_process (const char *program, char *args,
|
|||
STARTUPINFOA si = { sizeof (STARTUPINFOA) };
|
||||
char *program_and_args = (char *) alloca (argslen + 1);
|
||||
|
||||
const char *inferior_cwd = get_inferior_cwd ().c_str ();
|
||||
std::string expanded_infcwd;
|
||||
if (*inferior_cwd == '\0')
|
||||
inferior_cwd = nullptr;
|
||||
else
|
||||
{
|
||||
expanded_infcwd = gdb_tilde_expand (inferior_cwd);
|
||||
inferior_cwd = expanded_infcwd.c_str ();
|
||||
#ifndef __CYGWIN__
|
||||
/* Mirror slashes on inferior's cwd. */
|
||||
std::replace (expanded_infcwd.begin (), expanded_infcwd.end (),
|
||||
'/', '\\');
|
||||
#else
|
||||
if (cygwin_conv_path (CCP_POSIX_TO_WIN_A,
|
||||
inferior_cwd,
|
||||
infcwd_buf, sizeof (infcwd_buf)) < 0)
|
||||
error (_("Error converting inferior cwd: %d"), errno);
|
||||
inferior_cwd = infcwd_buf;
|
||||
#endif
|
||||
}
|
||||
|
||||
strcpy (program_and_args, program);
|
||||
strcat (program_and_args, " ");
|
||||
strcat (program_and_args, args);
|
||||
|
|
@ -465,10 +488,7 @@ create_process (const char *program, char *args,
|
|||
program_and_args, /* command line */
|
||||
flags, /* start flags */
|
||||
NULL, /* environment */
|
||||
/* current directory */
|
||||
(inferior_cwd.empty ()
|
||||
? NULL
|
||||
: gdb_tilde_expand (inferior_cwd).c_str()),
|
||||
inferior_cwd, /* current directory */
|
||||
get_client_state ().disable_randomization,
|
||||
&si, /* start info */
|
||||
pi); /* proc info */
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue