From e3de6b0a4d7fc1f00b5961edc9e8e5a7a9e0a09e Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Sun, 30 Aug 2015 21:35:23 +0200 Subject: [PATCH] cygcheck.cc: Fix debugger problem * cygcheck.cc (load_cygwin): Only unload cygwin DLL if not running under a debugger. Explain why. Signed-off-by: Corinna Vinschen --- winsup/utils/ChangeLog | 5 +++++ winsup/utils/cygcheck.cc | 12 ++++++++---- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/winsup/utils/ChangeLog b/winsup/utils/ChangeLog index 080502ef4..d60691afd 100644 --- a/winsup/utils/ChangeLog +++ b/winsup/utils/ChangeLog @@ -1,3 +1,8 @@ +2015-08-30 Corinna Vinschen + + * cygcheck.cc (load_cygwin): Only unload cygwin DLL if not running + under a debugger. Explain why. + 2015-08-30 Corinna Vinschen * cygcheck.cc (dump_sysinfo): Correctly handle Windows 10/Server 2016. diff --git a/winsup/utils/cygcheck.cc b/winsup/utils/cygcheck.cc index 1cf487591..4538e1b94 100644 --- a/winsup/utils/cygcheck.cc +++ b/winsup/utils/cygcheck.cc @@ -2340,7 +2340,8 @@ load_cygwin (int& argc, char **&argv) char **av = (char **) cygwin_internal (CW_ARGV); if (av && ((uintptr_t) av != (uintptr_t) -1)) { - /* Copy cygwin's idea of the argument list into this Window application. */ + /* Copy cygwin's idea of the argument list into this Window + application. */ for (argc = 0; av[argc]; argc++) continue; argv = (char **) calloc (argc + 1, sizeof (char *)); @@ -2352,8 +2353,8 @@ load_cygwin (int& argc, char **&argv) char **envp = (char **) cygwin_internal (CW_ENVP); if (envp && ((uintptr_t) envp != (uintptr_t) -1)) { - /* Store path and revert to this value, otherwise path gets overwritten - by the POSIXy Cygwin variation, which breaks cygcheck. + /* Store path and revert to this value, otherwise path gets + overwritten by the POSIXy Cygwin variation, which breaks cygcheck. Another approach would be to use the Cygwin PATH and convert it to Win32 again. */ char *path = NULL; @@ -2371,7 +2372,10 @@ load_cygwin (int& argc, char **&argv) putenv (path); } } - FreeLibrary (h); + /* GDB chokes when the DLL got unloaded and, for some reason, fails to set + any breakpoint after the fact. */ + if (!IsDebuggerPresent ()) + FreeLibrary (h); } int