https://github.com/slydiman updated https://github.com/llvm/llvm-project/pull/100659
>From 21fd03faa1224d44bd132a0b53d66d896210a044 Mon Sep 17 00:00:00 2001 From: Dmitry Vasilyev <dvassil...@accesssoftek.com> Date: Fri, 26 Jul 2024 01:48:35 +0400 Subject: [PATCH] [lldb] Improved lldb-server stability for remote launching We faced the issue running cross api tests in 8 threads. The executable is installed to the target by the process `lldb-server platform`, but launched by the another process `lldb-server gdbserver`. We got the error ETXTBSY on Linux and ERROR_SHARING_VIOLATION on Windows. It seems the known issue and ProcessLauncherPosixFork.cpp already contains the workaround, but it is not enough. Updated the workaround with the total timeout 5 seconds and added the same workaround to ProcessLauncherWindows.cpp too. --- .../Host/posix/ProcessLauncherPosixFork.cpp | 6 +++-- .../Host/windows/ProcessLauncherWindows.cpp | 26 +++++++++++++++---- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/lldb/source/Host/posix/ProcessLauncherPosixFork.cpp b/lldb/source/Host/posix/ProcessLauncherPosixFork.cpp index 0a832ebad13a7..637c2846e6bb2 100644 --- a/lldb/source/Host/posix/ProcessLauncherPosixFork.cpp +++ b/lldb/source/Host/posix/ProcessLauncherPosixFork.cpp @@ -201,7 +201,7 @@ struct ForkLaunchInfo { execve(info.argv[0], const_cast<char *const *>(info.argv), info.envp); #if defined(__linux__) - if (errno == ETXTBSY) { + for (int i = 0; i < 50; ++i) { // On android M and earlier we can get this error because the adb daemon // can hold a write handle on the executable even after it has finished // uploading it. This state lasts only a short time and happens only when @@ -210,7 +210,9 @@ struct ForkLaunchInfo { // shell" command in the fork() child before it has had a chance to exec.) // Since this state should clear up quickly, wait a while and then give it // one more go. - usleep(50000); + if (errno != ETXTBSY) + break; + usleep(100000); execve(info.argv[0], const_cast<char *const *>(info.argv), info.envp); } #endif diff --git a/lldb/source/Host/windows/ProcessLauncherWindows.cpp b/lldb/source/Host/windows/ProcessLauncherWindows.cpp index baa422c15cae2..ee5f8fda1d492 100644 --- a/lldb/source/Host/windows/ProcessLauncherWindows.cpp +++ b/lldb/source/Host/windows/ProcessLauncherWindows.cpp @@ -113,14 +113,30 @@ ProcessLauncherWindows::LaunchProcess(const ProcessLaunchInfo &launch_info, // command line is not empty, its contents may be modified by CreateProcessW. WCHAR *pwcommandLine = wcommandLine.empty() ? nullptr : &wcommandLine[0]; - BOOL result = ::CreateProcessW( - wexecutable.c_str(), pwcommandLine, NULL, NULL, TRUE, flags, env_block, - wworkingDirectory.size() == 0 ? NULL : wworkingDirectory.c_str(), - &startupinfo, &pi); + BOOL result; + DWORD last_error = 0; + // This is the workaround for the error "The process cannot access the file + // because it is being used by another process". Note the executable file is + // installed to the target by the process `lldb-server platform`, but launched + // by the process `lldb-server gdbserver`. Sometimes system may block the file + // for some time after copying. + for (int i = 0; i < 50; ++i) { + result = ::CreateProcessW( + wexecutable.c_str(), pwcommandLine, NULL, NULL, TRUE, flags, env_block, + wworkingDirectory.size() == 0 ? NULL : wworkingDirectory.c_str(), + &startupinfo, &pi); + if (!result) { + last_error = ::GetLastError(); + if (last_error != ERROR_SHARING_VIOLATION) + break; + ::Sleep(100); + } else + break; + } if (!result) { // Call GetLastError before we make any other system calls. - error.SetError(::GetLastError(), eErrorTypeWin32); + error.SetError(last_error, eErrorTypeWin32); // Note that error 50 ("The request is not supported") will occur if you // try debug a 64-bit inferior from a 32-bit LLDB. } _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits