Merged to release_90 in r367128.
On Wed, Jul 24, 2019 at 11:37 PM Pavel Labath via lldb-commits <lldb-commits@lists.llvm.org> wrote: > > Author: labath > Date: Wed Jul 24 23:38:33 2019 > New Revision: 366985 > > URL: http://llvm.org/viewvc/llvm-project?rev=366985&view=rev > Log: > LLGS: fix tracking execve on linux > > Summary: > Due to a logic error, lldb-server ended up asserting/crashing every time > the debugged process attempted an execve(). This fixes the error, and > extends TestExec to work on other platforms too. The "extension" > consists of avoiding non-standard posix_spawn extensions and using the > classic execve() call, which should be available on any platform that > actually supports re-execing. I change the test decorator from > @skipUnlessDarwin to @skipIfWindows. > > Reviewers: clayborg, jasonmolenda > > Subscribers: lldb-commits > > Differential Revision: https://reviews.llvm.org/D65207 > > Modified: > lldb/trunk/packages/Python/lldbsuite/test/functionalities/exec/TestExec.py > lldb/trunk/packages/Python/lldbsuite/test/functionalities/exec/main.cpp > lldb/trunk/source/Plugins/Process/Linux/NativeProcessLinux.cpp > > Modified: > lldb/trunk/packages/Python/lldbsuite/test/functionalities/exec/TestExec.py > URL: > http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/functionalities/exec/TestExec.py?rev=366985&r1=366984&r2=366985&view=diff > ============================================================================== > --- > lldb/trunk/packages/Python/lldbsuite/test/functionalities/exec/TestExec.py > (original) > +++ > lldb/trunk/packages/Python/lldbsuite/test/functionalities/exec/TestExec.py > Wed Jul 24 23:38:33 2019 > @@ -18,17 +18,17 @@ class ExecTestCase(TestBase): > > mydir = TestBase.compute_mydir(__file__) > > - @skipUnlessDarwin > @expectedFailureAll(archs=['i386'], bugnumber="rdar://28656532") > @expectedFailureAll(oslist=["ios", "tvos", "watchos", "bridgeos"], > bugnumber="rdar://problem/34559552") # this exec test has problems on ios > systems > @skipIfSanitized # rdar://problem/43756823 > + @skipIfWindows > def test_hitting_exec (self): > self.do_test(False) > > - @skipUnlessDarwin > @expectedFailureAll(archs=['i386'], bugnumber="rdar://28656532") > @expectedFailureAll(oslist=["ios", "tvos", "watchos", "bridgeos"], > bugnumber="rdar://problem/34559552") # this exec test has problems on ios > systems > @skipIfSanitized # rdar://problem/43756823 > + @skipIfWindows > def test_skipping_exec (self): > self.do_test(True) > > > Modified: > lldb/trunk/packages/Python/lldbsuite/test/functionalities/exec/main.cpp > URL: > http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/functionalities/exec/main.cpp?rev=366985&r1=366984&r2=366985&view=diff > ============================================================================== > --- lldb/trunk/packages/Python/lldbsuite/test/functionalities/exec/main.cpp > (original) > +++ lldb/trunk/packages/Python/lldbsuite/test/functionalities/exec/main.cpp > Wed Jul 24 23:38:33 2019 > @@ -1,76 +1,16 @@ > -#include <errno.h> > -#include <mach/mach.h> > -#include <signal.h> > -#include <stdio.h> > -#include <stdint.h> > -#include <stdlib.h> > -#include <spawn.h> > -#include <unistd.h> > +#include <cstdio> > +#include <cstdlib> > +#include <cstring> > #include <libgen.h> > #include <string> > +#include <unistd.h> > > -static void > -exit_with_errno (int err, const char *prefix) > -{ > - if (err) > - { > - fprintf (stderr, > - "%s%s", > - prefix ? prefix : "", > - strerror(err)); > - exit (err); > - } > -} > - > -static pid_t > -spawn_process (const char *progname, > - const char **argv, > - const char **envp, > - int &err) > -{ > - pid_t pid = 0; > - > - const posix_spawn_file_actions_t *file_actions = NULL; > - posix_spawnattr_t attr; > - err = posix_spawnattr_init (&attr); > - if (err) > - return pid; > - > - short flags = POSIX_SPAWN_SETEXEC | POSIX_SPAWN_SETSIGDEF | > POSIX_SPAWN_SETSIGMASK; > - err = posix_spawnattr_setflags (&attr, flags); > - if (err == 0) > - { > - // Use the default signal masks > - sigset_t no_signals; > - sigset_t all_signals; > - sigemptyset (&no_signals); > - sigfillset (&all_signals); > - posix_spawnattr_setsigmask(&attr, &no_signals); > - posix_spawnattr_setsigdefault(&attr, &all_signals); > - > - err = posix_spawn (&pid, > - progname, > - file_actions, > - &attr, > - (char * const *)argv, > - (char * const *)envp); > - > - posix_spawnattr_destroy(&attr); > - } > - return pid; > -} > - > -int > -main (int argc, char const **argv) > -{ > - char *buf = (char*) malloc (strlen (argv[0]) + 12); > - strlcpy (buf, argv[0], strlen (argv[0]) + 1); > - std::string directory_name (::dirname (buf)); > - > - std::string other_program = directory_name + "/secondprog"; > - int err = 0; // Set breakpoint 1 here > - spawn_process (other_program.c_str(), argv, NULL, err); > - if (err) > - exit_with_errno (err, "posix_spawn x86_64 error"); > - return 0; > +int main(int argc, char const **argv) { > + char *buf = strdup(argv[0]); // Set breakpoint 1 here > + std::string directory_name(::dirname(buf)); > + > + std::string other_program = directory_name + "/secondprog"; > + execve(other_program.c_str(), const_cast<char *const *>(argv), nullptr); > + perror("execve"); > + abort(); > } > > Modified: lldb/trunk/source/Plugins/Process/Linux/NativeProcessLinux.cpp > URL: > http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/Linux/NativeProcessLinux.cpp?rev=366985&r1=366984&r2=366985&view=diff > ============================================================================== > --- lldb/trunk/source/Plugins/Process/Linux/NativeProcessLinux.cpp (original) > +++ lldb/trunk/source/Plugins/Process/Linux/NativeProcessLinux.cpp Wed Jul 24 > 23:38:33 2019 > @@ -599,12 +599,9 @@ void NativeProcessLinux::MonitorSIGTRAP( > // which only copies the main thread. > LLDB_LOG(log, "exec received, stop tracking all but main thread"); > > - for (auto i = m_threads.begin(); i != m_threads.end();) { > - if ((*i)->GetID() == GetID()) > - i = m_threads.erase(i); > - else > - ++i; > - } > + llvm::erase_if(m_threads, [&](std::unique_ptr<NativeThreadProtocol> &t) { > + return t->GetID() != GetID(); > + }); > assert(m_threads.size() == 1); > auto *main_thread = static_cast<NativeThreadLinux *>(m_threads[0].get()); > > > > _______________________________________________ > lldb-commits mailing list > lldb-commits@lists.llvm.org > https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits