I like seeing the windows debugger plug-in getting fixes. LLDB currently encourages everyone to add native debugging support to lldb-server. Then you get remote debugging support for free. It seems like you are putting in some time on the windows fixes, so I thought I would pass this along. The ProcessGDBRemote is the most tested protocol in LLDB currently so I am guessing things might be easier in the long run if you go that route.
FYI: ds2 is an open source GDB server that actually already supports windows: https://github.com/facebook/ds2 It is a separate GDB remote server that was not built using any LLDB sources. It would be interesting to possibly port the windows changes over into LLDB's lldb-server. Let me know what you think, Greg Clayton > On Jun 13, 2018, at 12:02 PM, Stella Stamenova via lldb-commits > <lldb-commits@lists.llvm.org> wrote: > > Author: stella.stamenova > Date: Wed Jun 13 12:02:44 2018 > New Revision: 334642 > > URL: http://llvm.org/viewvc/llvm-project?rev=334642&view=rev > Log: > [lit] Split test_set_working_dir TestProcessLaunch into two tests and fix it > on Windows > > Summary: > test_set_working_dir was testing two scenario: failure to set the working dir > because of a non existent directory and succeeding to set the working > directory. Since the negative case fails on both Linux and Windows, the > positive case was never tested. I split the test into two which allows us to > always run both the negative and positive cases. The positive case now > succeeds on Linux and the negative case still fails. > During the investigation, it turned out that lldbtest.py will try to execute > a process launch command up to 3 times if the command failed. This means that > we could be covering up intermittent failures by running any test that does > process launch multiple times without ever realizing it. I've changed the > counter to 1 (though it can still be overwritten with the environment > variable). > This change also fixes both the positive and negative cases on Windows. There > were a few issues: > 1) In ProcessLauncherWindows::LaunchProcess, the error was not retrieved > until CloseHandle was possibly called. Since CloseHandle is also a system > API, its success would overwrite any existing error that could be retrieved > using GetLastError. So by the time the error was retrieved, it was now a > success. > 2) In DebuggerThread::StopDebugging TerminateProcess was called on the > process handle regardless of whether it was a valid handle. This was causing > the process to crash when the handle was LLDB_INVALID_PROCESS (0xFFFFFFFF). > 3) In ProcessWindows::DoLaunch we need to check that the working directory > exists before launching the process to have the same behavior as other > platforms which first check the directory and then launch process. This way > we also control the exact error string. > > Reviewers: labath, zturner, asmith, jingham > > Reviewed By: labath > > Subscribers: llvm-commits > > Differential Revision: https://reviews.llvm.org/D48050 > > Modified: > > lldb/trunk/packages/Python/lldbsuite/test/functionalities/process_launch/TestProcessLaunch.py > lldb/trunk/packages/Python/lldbsuite/test/lldbtest.py > lldb/trunk/source/Host/windows/ProcessLauncherWindows.cpp > lldb/trunk/source/Plugins/Process/Windows/Common/DebuggerThread.cpp > lldb/trunk/source/Plugins/Process/Windows/Common/ProcessWindows.cpp > > Modified: > lldb/trunk/packages/Python/lldbsuite/test/functionalities/process_launch/TestProcessLaunch.py > URL: > http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/functionalities/process_launch/TestProcessLaunch.py?rev=334642&r1=334641&r2=334642&view=diff > ============================================================================== > --- > lldb/trunk/packages/Python/lldbsuite/test/functionalities/process_launch/TestProcessLaunch.py > (original) > +++ > lldb/trunk/packages/Python/lldbsuite/test/functionalities/process_launch/TestProcessLaunch.py > Wed Jun 13 12:02:44 2018 > @@ -85,7 +85,34 @@ class ProcessLaunchTestCase(TestBase): > # not working? > @not_remote_testsuite_ready > @expectedFailureAll(oslist=["linux"], bugnumber="llvm.org/pr20265") > - def test_set_working_dir(self): > + def test_set_working_dir_nonexisting(self): > + """Test that '-w dir' fails to set the working dir when running the > inferior with a dir which doesn't exist.""" > + d = {'CXX_SOURCES': 'print_cwd.cpp'} > + self.build(dictionary=d) > + self.setTearDownCleanup(d) > + exe = self.getBuildArtifact("a.out") > + self.runCmd("file " + exe) > + > + mywd = 'my_working_dir' > + out_file_name = "my_working_dir_test.out" > + err_file_name = "my_working_dir_test.err" > + > + my_working_dir_path = self.getBuildArtifact(mywd) > + out_file_path = os.path.join(my_working_dir_path, out_file_name) > + err_file_path = os.path.join(my_working_dir_path, err_file_name) > + > + # Check that we get an error when we have a nonexisting path > + invalid_dir_path = mywd + 'z' > + launch_command = "process launch -w %s -o %s -e %s" % ( > + invalid_dir_path, out_file_path, err_file_path) > + > + self.expect( > + launch_command, error=True, patterns=[ > + "error:.* No such file or directory: %s" % > + invalid_dir_path]) > + > + @not_remote_testsuite_ready > + def test_set_working_dir_existing(self): > """Test that '-w dir' sets the working dir when running the > inferior.""" > d = {'CXX_SOURCES': 'print_cwd.cpp'} > self.build(dictionary=d) > @@ -109,16 +136,6 @@ class ProcessLaunchTestCase(TestBase): > except OSError: > pass > > - # Check that we get an error when we have a nonexisting path > - launch_command = "process launch -w %s -o %s -e %s" % ( > - my_working_dir_path + 'z', out_file_path, err_file_path) > - > - self.expect( > - launch_command, error=True, patterns=[ > - "error:.* No such file or directory: %sz" % > - my_working_dir_path]) > - > - # Really launch the process > launch_command = "process launch -w %s -o %s -e %s" % ( > my_working_dir_path, out_file_path, err_file_path) > > > Modified: lldb/trunk/packages/Python/lldbsuite/test/lldbtest.py > URL: > http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/lldbtest.py?rev=334642&r1=334641&r2=334642&view=diff > ============================================================================== > --- lldb/trunk/packages/Python/lldbsuite/test/lldbtest.py (original) > +++ lldb/trunk/packages/Python/lldbsuite/test/lldbtest.py Wed Jun 13 12:02:44 > 2018 > @@ -1833,7 +1833,7 @@ class TestBase(Base): > > # Maximum allowed attempts when launching the inferior process. > # Can be overridden by the LLDB_MAX_LAUNCH_COUNT environment variable. > - maxLaunchCount = 3 > + maxLaunchCount = 1 > > # Time to wait before the next launching attempt in second(s). > # Can be overridden by the LLDB_TIME_WAIT_NEXT_LAUNCH environment > variable. > > Modified: lldb/trunk/source/Host/windows/ProcessLauncherWindows.cpp > URL: > http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/windows/ProcessLauncherWindows.cpp?rev=334642&r1=334641&r2=334642&view=diff > ============================================================================== > --- lldb/trunk/source/Host/windows/ProcessLauncherWindows.cpp (original) > +++ lldb/trunk/source/Host/windows/ProcessLauncherWindows.cpp Wed Jun 13 > 12:02:44 2018 > @@ -96,6 +96,12 @@ ProcessLauncherWindows::LaunchProcess(co > wexecutable.c_str(), &wcommandLine[0], NULL, NULL, TRUE, flags, > env_block, > wworkingDirectory.size() == 0 ? NULL : wworkingDirectory.c_str(), > &startupinfo, &pi); > + > + if (!result) { > + // Call GetLastError before we make any other system calls. > + error.SetError(::GetLastError(), eErrorTypeWin32); > + } > + > if (result) { > // Do not call CloseHandle on pi.hProcess, since we want to pass that back > // through the HostProcess. > @@ -110,7 +116,8 @@ ProcessLauncherWindows::LaunchProcess(co > ::CloseHandle(stderr_handle); > > if (!result) > - error.SetError(::GetLastError(), eErrorTypeWin32); > + return HostProcess(); > + > return HostProcess(pi.hProcess); > } > > > Modified: lldb/trunk/source/Plugins/Process/Windows/Common/DebuggerThread.cpp > URL: > http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/Windows/Common/DebuggerThread.cpp?rev=334642&r1=334641&r2=334642&view=diff > ============================================================================== > --- lldb/trunk/source/Plugins/Process/Windows/Common/DebuggerThread.cpp > (original) > +++ lldb/trunk/source/Plugins/Process/Windows/Common/DebuggerThread.cpp Wed > Jun 13 12:02:44 2018 > @@ -181,13 +181,19 @@ Status DebuggerThread::StopDebugging(boo > lldb::process_t handle = m_process.GetNativeProcess().GetSystemHandle(); > > if (terminate) { > - // Initiate the termination before continuing the exception, so that the > - // next debug event we get is the exit process event, and not some other > - // event. > - BOOL terminate_suceeded = TerminateProcess(handle, 0); > - LLDB_LOG(log, > - "calling TerminateProcess({0}, 0) (inferior={1}), success={2}", > - handle, pid, terminate_suceeded); > + if (handle != nullptr && handle != LLDB_INVALID_PROCESS) { > + // Initiate the termination before continuing the exception, so that > the > + // next debug event we get is the exit process event, and not some > other > + // event. > + BOOL terminate_suceeded = TerminateProcess(handle, 0); > + LLDB_LOG(log, > + "calling TerminateProcess({0}, 0) (inferior={1}), > success={2}", > + handle, pid, terminate_suceeded); > + } else { > + LLDB_LOG(log, > + "NOT calling TerminateProcess because the inferior is not > valid ({0}, 0) (inferior={1})", > + handle, pid); > + } > } > > // If we're stuck waiting for an exception to continue (e.g. the user is at > a > > Modified: lldb/trunk/source/Plugins/Process/Windows/Common/ProcessWindows.cpp > URL: > http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/Windows/Common/ProcessWindows.cpp?rev=334642&r1=334641&r2=334642&view=diff > ============================================================================== > --- lldb/trunk/source/Plugins/Process/Windows/Common/ProcessWindows.cpp > (original) > +++ lldb/trunk/source/Plugins/Process/Windows/Common/ProcessWindows.cpp Wed > Jun 13 12:02:44 2018 > @@ -234,6 +234,16 @@ Status ProcessWindows::DoLaunch(Module * > > Log *log = ProcessWindowsLog::GetLogIfAny(WINDOWS_LOG_PROCESS); > Status result; > + > + FileSpec working_dir = launch_info.GetWorkingDirectory(); > + namespace fs = llvm::sys::fs; > + if (working_dir && (!working_dir.ResolvePath() || > + !fs::is_directory(working_dir.GetPath()))) { > + result.SetErrorStringWithFormat("No such file or directory: %s", > + working_dir.GetCString()); > + return result; > + } > + > if (!launch_info.GetFlags().Test(eLaunchFlagDebug)) { > StreamString stream; > stream.Printf("ProcessWindows unable to launch '%s'. ProcessWindows can " > > > _______________________________________________ > lldb-commits mailing list > lldb-commits@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits