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

Pavel Labath labath at google.com
Mon Feb 9 09:46:33 PST 2015


I have committed a modified test case that works on mac.

If anyone knows why target.Launch(stop_on_entry=true) behaves differently
on linux and mac I would be very interested to know.

regards,
pavel


On 9 February 2015 at 17:19, Pavel Labath <labath at google.com> wrote:

> Funny, I thought I had tested this... Will check asap.
>
> On 9 February 2015 at 16:31, Ilia K <ki.stfu at gmail.com> wrote:
>
>> 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/6c3e1912/attachment.html>


More information about the lldb-commits mailing list