[Lldb-commits] [lldb] r228570 - Fix descriptor leak in multi-target debugging

Ilia K ki.stfu at gmail.com
Mon Feb 9 08:31:25 PST 2015


Hello,

This test doesn't work on OS X:

======================================================================
> FAIL: test_fd_leak_multitarget (TestFdLeak.AvoidsFdLeakTestCase)
> ----------------------------------------------------------------------
> Traceback (most recent call last):
>   File "/Users/testuser/build/workspace/LLDB_master_release_OSX/llvm_master/tools/lldb/test/lldbtest.py", line 690, in wrapper
>     func(*args, **kwargs)
>   File "/Users/testuser/build/workspace/LLDB_master_release_OSX/llvm_master/tools/lldb/test/functionalities/avoids-fd-leak/TestFdLeak.py", line 52, in test_fd_leak_multitarget
>     self.assertTrue(process1.GetState() == lldb.eStateStopped, "Process should have been stopped.")
> AssertionError: False is not True : Process should have been stopped.
> Config=x86_64-clang
>
>
Thanks,
Ilia

On Mon, Feb 9, 2015 at 2:37 PM, Pavel Labath <labath at google.com> wrote:

> Author: labath
> Date: Mon Feb  9 05:37:56 2015
> New Revision: 228570
>
> URL: http://llvm.org/viewvc/llvm-project?rev=228570&view=rev
> Log:
> Fix descriptor leak in multi-target debugging
>
> Summary:
> When debugging two targets concurrently, the pseude terminal master fd
> from the first one would
> leak into the second. This fixes the problem by setting O_CLOEXEC on the
> master fd. Test
> included.
>
> Reviewers: clayborg, vharron
>
> Subscribers: lldb-commits
>
> Differential Revision: http://reviews.llvm.org/D7466
>
> Modified:
>     lldb/trunk/source/Utility/PseudoTerminal.cpp
>     lldb/trunk/test/functionalities/avoids-fd-leak/TestFdLeak.py
>
> Modified: lldb/trunk/source/Utility/PseudoTerminal.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Utility/PseudoTerminal.cpp?rev=228570&r1=228569&r2=228570&view=diff
>
> ==============================================================================
> --- lldb/trunk/source/Utility/PseudoTerminal.cpp (original)
> +++ lldb/trunk/source/Utility/PseudoTerminal.cpp Mon Feb  9 05:37:56 2015
> @@ -239,7 +239,7 @@ PseudoTerminal::Fork (char *error_str, s
>          error_str[0] = '\0';
>
>      pid_t pid = LLDB_INVALID_PROCESS_ID;
> -    if (OpenFirstAvailableMaster (O_RDWR, error_str, error_len))
> +    if (OpenFirstAvailableMaster (O_RDWR | O_CLOEXEC, error_str,
> error_len))
>      {
>          // Successfully opened our master pseudo terminal
>
> @@ -258,7 +258,8 @@ PseudoTerminal::Fork (char *error_str, s
>              if (OpenSlave (O_RDWR, error_str, error_len))
>              {
>                  // Successfully opened slave
> -                // We are done with the master in the child process so
> lets close it
> +
> +                // Master FD should have O_CLOEXEC set, but let's close
> it just in case...
>                  CloseMasterFileDescriptor ();
>
>  #if defined(TIOCSCTTY)
>
> Modified: lldb/trunk/test/functionalities/avoids-fd-leak/TestFdLeak.py
> URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/avoids-fd-leak/TestFdLeak.py?rev=228570&r1=228569&r2=228570&view=diff
>
> ==============================================================================
> --- lldb/trunk/test/functionalities/avoids-fd-leak/TestFdLeak.py (original)
> +++ lldb/trunk/test/functionalities/avoids-fd-leak/TestFdLeak.py Mon Feb
> 9 05:37:56 2015
> @@ -36,6 +36,29 @@ class AvoidsFdLeakTestCase(TestBase):
>          self.assertTrue(process.GetExitStatus() == 0,
>                  "Process returned non-zero status. Were incorrect file
> descriptors passed?")
>
> +    @skipIfWindows # The check for descriptor leakage needs to be
> implemented differently here.
> +    def test_fd_leak_multitarget (self):
> +        self.buildDefault()
> +        exe = os.path.join (os.getcwd(), "a.out")
> +
> +        target = self.dbg.CreateTarget(exe)
> +
> +        listener = lldb.SBListener()
> +        error = lldb.SBError()
> +        process1 = target.Launch (listener, None, None, None, None, None,
> +                self.get_process_working_directory(), 0, True, # stop at
> entry
> +                error)
> +        self.assertTrue(process1, PROCESS_IS_VALID)
> +        self.assertTrue(process1.GetState() == lldb.eStateStopped,
> "Process should have been stopped.")
> +
> +        target2 = self.dbg.CreateTarget(exe)
> +        process2 = target2.LaunchSimple (None, None,
> self.get_process_working_directory())
> +        self.assertTrue(process2, PROCESS_IS_VALID)
> +
> +        self.assertTrue(process2.GetState() == lldb.eStateExited,
> "Process should have exited.")
> +        self.assertTrue(process2.GetExitStatus() == 0,
> +                "Process returned non-zero status. Were incorrect file
> descriptors passed?")
> +
>
>  if __name__ == '__main__':
>      import atexit
>
>
> _______________________________________________
> lldb-commits mailing list
> lldb-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20150209/f3fa131c/attachment.html>


More information about the lldb-commits mailing list