[Lldb-commits] [PATCH] test: ignore IOError in Base.deletePexpectChild and clean TestMySyntax test

Abid, Hafiz Hafiz_Abid at mentor.com
Mon Jan 12 09:32:50 PST 2015


It seems that your 2nd patch is needed. I will look at it tomorrow.

Thanks,
Abid

From: Ilia K [mailto:ki.stfu at gmail.com]
Sent: 12 January 2015 13:27
To: Abid, Hafiz
Cc: lldb-commits at cs.uiuc.edu
Subject: Re: [Lldb-commits] [PATCH] test: ignore IOError in Base.deletePexpectChild and clean TestMySyntax test

Hello,

One more test failed:
{code}
======================================================================
ERROR: test_lldbmi_sourceoption (TestMiStartupOptions.MiStartupOptionsTestCase)
    Test that 'lldb-mi --interpreter' can execute a prepared file which passed via --source option.
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/IliaK/p/llvm/tools/lldb/test/lldbtest.py", line 1767, in tearDown
    Base.tearDown(self)
  File "/Users/IliaK/p/llvm/tools/lldb/test/lldbtest.py", line 1087, in tearDown
    self.deletePexpectChild()
  File "/Users/IliaK/p/llvm/tools/lldb/test/lldbtest.py", line 1072, in deletePexpectChild
    self.child.sendline('settings set interpreter.prompt-on-quit false')
  File "/Users/IliaK/p/llvm/tools/lldb/test/pexpect-2.4/pexpect.py", line 966, in sendline
    n = self.send(s)
  File "/Users/IliaK/p/llvm/tools/lldb/test/pexpect-2.4/pexpect.py", line 958, in send
    c = os.write(self.child_fd, s)
OSError: [Errno 5] Input/output error
Config=x86_64-clang
{code}

Thanks,
Ilia


On Mon, Jan 12, 2015 at 4:24 PM, Ilia K <ki.stfu at gmail.com<mailto:ki.stfu at gmail.com>> wrote:
Hello Abid,

Cleanup didn't help and I got the error again:
{code}
======================================================================
ERROR: test_lldbmi_eval (TestMiEvaluate.MiEvaluateTestCase)
    Test that 'lldb-mi --interpreter' works for evaluating.
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/IliaK/p/llvm/tools/lldb/test/lldbtest.py", line 1767, in tearDown
    Base.tearDown(self)
  File "/Users/IliaK/p/llvm/tools/lldb/test/lldbtest.py", line 1087, in tearDown
    self.deletePexpectChild()
  File "/Users/IliaK/p/llvm/tools/lldb/test/lldbtest.py", line 1072, in deletePexpectChild
    self.child.sendline('settings set interpreter.prompt-on-quit false')
  File "/Users/IliaK/p/llvm/tools/lldb/test/pexpect-2.4/pexpect.py", line 966, in sendline
    n = self.send(s)
  File "/Users/IliaK/p/llvm/tools/lldb/test/pexpect-2.4/pexpect.py", line 958, in send
    c = os.write(self.child_fd, s)
OSError: [Errno 5] Input/output error
Config=x86_64-clang
{code}

Could you submit IOError patch?

Thanks,
Ilia


On Tue, Dec 30, 2014 at 9:16 PM, Ilia K <ki.stfu at gmail.com<mailto:ki.stfu at gmail.com>> wrote:
Nope, it didn't help:

{code}
======================================================================
ERROR: test_lldbmi_pendbreakonsym (TestMiBreakpoint.MiBreakpointTestCase)
   Test that 'lldb-mi --interpreter' works for pending symbol breakpoints.
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/IliaK/p/llvm/tools/lldb/test/lldbtest.py", line 1765, in tearDown
    Base.tearDown(self)
  File "/Users/IliaK/p/llvm/tools/lldb/test/lldbtest.py", line 1087, in tearDown
    self.deletePexpectChild()
  File "/Users/IliaK/p/llvm/tools/lldb/test/lldbtest.py", line 1072, in deletePexpectChild
    self.child.sendline('settings set interpreter.prompt-on-quit false')
  File "/Users/IliaK/p/llvm/tools/lldb/test/pexpect-2.4/pexpect.py", line 966, in sendline
    n = self.send(s)
  File "/Users/IliaK/p/llvm/tools/lldb/test/pexpect-2.4/pexpect.py", line 958, in send
    c = os.write(self.child_fd, s)
OSError: [Errno 5] Input/output error
Config=x86_64-clang
{code}

Thanks,
Ilia


On Tue, Dec 30, 2014 at 8:15 PM, Abid, Hafiz <Hafiz_Abid at mentor.com<mailto:Hafiz_Abid at mentor.com>> wrote:
I committed the cleanup in 224990. Please have a look and let me know if you see a problem.

Regards,
Abid
________________________________
From: Ilia K [ki.stfu at gmail.com<mailto:ki.stfu at gmail.com>]
Sent: Tuesday, December 30, 2014 4:50 PM

To: Abid, Hafiz
Cc: lldb-commits at cs.uiuc.edu<mailto:lldb-commits at cs.uiuc.edu>
Subject: Re: [Lldb-commits] [PATCH] test: ignore IOError in Base.deletePexpectChild and clean TestMySyntax test

Now I have modified breakpoint's test and IOError sometimes happens:
{code}
$ ./dotest.py -v --executable $BUILDDIR/bin/lldb -f MiBreakpointTestCase.test_lldbmi_pendbreakonsym
['./dotest.py', '-v', '--executable', '/Users/IliaK/p/llvm/build_ninja/bin/lldb', '-f', 'MiBreakpointTestCase.test_lldbmi_pendbreakonsym']
LLDB library dir: /Users/IliaK/p/llvm/build_ninja/bin
lldb-330.99.0
lldb.pre_flight: None
lldb.post_flight: None

Session logs for test failures/errors/unexpected successes will go into directory '2014-12-30-19_45_12'
Command invoked: ./dotest.py -v --executable /Users/IliaK/p/llvm/build_ninja/bin/lldb -f MiBreakpointTestCase.test_lldbmi_pendbreakonsym
compilers=['clang']

Configuration: arch=x86_64 compiler=clang
----------------------------------------------------------------------
Collected 1 test

1: test_lldbmi_pendbreakonsym (TestMiBreakpoint.MiBreakpointTestCase)
   Test that 'lldb-mi --interpreter' works for pending symbol breakpoints. ... ERROR

======================================================================
ERROR: test_lldbmi_pendbreakonsym (TestMiBreakpoint.MiBreakpointTestCase)
   Test that 'lldb-mi --interpreter' works for pending symbol breakpoints.
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/IliaK/p/llvm/tools/lldb/test/lldbtest.py", line 1765, in tearDown
    Base.tearDown(self)
  File "/Users/IliaK/p/llvm/tools/lldb/test/lldbtest.py", line 1087, in tearDown
    self.deletePexpectChild()
  File "/Users/IliaK/p/llvm/tools/lldb/test/lldbtest.py", line 1072, in deletePexpectChild
    self.child.sendline('settings set interpreter.prompt-on-quit false')
  File "/Users/IliaK/p/llvm/tools/lldb/test/pexpect-2.4/pexpect.py", line 966, in sendline
    n = self.send(s)
  File "/Users/IliaK/p/llvm/tools/lldb/test/pexpect-2.4/pexpect.py", line 958, in send
    c = os.write(self.child_fd, s)
OSError: [Errno 5] Input/output error
Config=x86_64-clang
----------------------------------------------------------------------
{code}

Here are my changes:
{code}
Index: test/tools/lldb-mi/TestMiBreakpoint.py
===================================================================
--- test/tools/lldb-mi/TestMiBreakpoint.py      (revision 224982)
+++ test/tools/lldb-mi/TestMiBreakpoint.py      (working copy)
@@ -48,17 +48,13 @@
                 child.expect("\^done,bkpt={number=\"1\"")

                 child.sendline("-exec-run")
-                child.sendline("") # FIXME: lldb-mi hangs here, so extra return is needed
                 child.expect("\^running")
                 child.expect("\*stopped,reason=\"breakpoint-hit\"")

                 child.sendline("-exec-continue")
                 child.expect("\^running")
                 child.expect("\*stopped,reason=\"exited-normally\"")
-                child.expect_exact(prompt)

-                child.sendline("quit")
-
         # Now that the necessary logging is done, restore logfile to None to
         # stop further logging.
         child.logfile_send = None
{code}

Thanks,
Ilia


On Tue, Dec 30, 2014 at 7:39 PM, Abid, Hafiz <Hafiz_Abid at mentor.com<mailto:Hafiz_Abid at mentor.com>> wrote:
I also found in the existing test cases that both ways have been used. So I will remove that prompt and 'quit' from the lldb-mi test cases as you have done from one of them. Then if you still get the IOError then we can apply your 2nd patch.

Thanks,
Abid
________________________________
From: Ilia K [ki.stfu at gmail.com<mailto:ki.stfu at gmail.com>]
Sent: Tuesday, December 30, 2014 4:29 PM
To: Abid, Hafiz
Cc: lldb-commits at cs.uiuc.edu<mailto:lldb-commits at cs.uiuc.edu>
Subject: RE: [Lldb-commits] [PATCH] test: ignore IOError in Base.deletePexpectChild and clean TestMySyntax test

As I understood both of them are legal (in theory) but in practice I faced with IOError. I think we should ignore IOError because we can't fix isalive() method.

Thanks,
Ilia
On 30 Dec 2014 19:21, "Abid, Hafiz" <Hafiz_Abid at mentor.com<mailto:Hafiz_Abid at mentor.com>> wrote:
Thanks for quick reply. Your patch is removing the following line from lldb-mi test case.
-                child.sendline("quit")

I am wondering what is the convention of terminating the executable that we invoked. Do the test is supposed to kill it (using 'quit') command or it can be left to the other part of testing code which as you noted also use sendline('quit').

Regards,
Abid
________________________________
From: Ilia K [ki.stfu at gmail.com<mailto:ki.stfu at gmail.com>]
Sent: Tuesday, December 30, 2014 4:11 PM
To: Abid, Hafiz
Cc: lldb-commits at cs.uiuc.edu<mailto:lldb-commits at cs.uiuc.edu>
Subject: Re: [Lldb-commits] [PATCH] test: ignore IOError in Base.deletePexpectChild and clean TestMySyntax test
** it will cause a IOError because later it will try to kill process using 'sendline(quit)'.

Thanks,
Ilia

On Tue, Dec 30, 2014 at 7:06 PM, Ilia K <ki.stfu at gmail.com<mailto:ki.stfu at gmail.com>> wrote:
Hello Abid,

I'm glad to see you.

>RE: IMHO once we have removed the extra quit call from the test cases, we will not need the check for OSErrror.
Unfortunately it's not. The deletePexpectChild() sometimes causes that problem when isalive returns a false positive result.
{code}
        # This is for the case of directly spawning 'lldb' and interacting with it
        # using pexpect.
        if self.child and self.child.isalive(): <--here
            import pexpect
            with recording(self, traceAlways) as sbuf:
                print >> sbuf, "tearing down the child process...."
            try:
                if self.child_in_script_interpreter:
                    self.child.sendline('quit()')
                    self.child.expect_exact(self.child_prompt)
                self.child.sendline('settings set interpreter.prompt-on-quit false')
                self.child.sendline('quit')
                self.child.expect(pexpect.EOF)
            except (ValueError, OSError, pexpect.ExceptionPexpect):
                # child is already terminated
                pass
            finally:
                # Give it one final blow to make sure the child is terminated.
                self.child.close()
{code}
The pexpect's isalive() method is nonblocking. It checks whether process was terminated or not. But the problem is that process may be terminated after isalive() was called -- it will cause a IOError.

Thanks,
Ilia


On Tue, Dec 30, 2014 at 6:46 PM, Abid, Hafiz <Hafiz_Abid at mentor.com<mailto:Hafiz_Abid at mentor.com>> wrote:
I dont see any problem with the patch that cleans up the TestMiSyntax.py. But I see that similar cleanup is needed in  other tests too. I will make the change and then commit all of them.

IMHO once we have removed the extra quit call from the test cases, we will not need the check for OSErrror.

Thanks,
Abid
________________________________
From: Ilia K [ki.stfu at gmail.com<mailto:ki.stfu at gmail.com>]
Sent: Monday, December 22, 2014 11:54 AM
To: Abid, Hafiz; lldb-commits at cs.uiuc.edu<mailto:lldb-commits at cs.uiuc.edu>
Subject: Re: [Lldb-commits] [PATCH] test: ignore IOError in Base.deletePexpectChild and clean TestMySyntax test
Hello,

My previous messages left without answer. I'm posting them again (see below) with patch files.
The initial message: http://lists.cs.uiuc.edu/pipermail/lldb-commits/Week-of-Mon-20141215/014599.html

Thanks,
Ilia

On Tue, Dec 16, 2014 at 7:02 PM, Ilia K <ki.stfu at gmail.com<mailto:ki.stfu at gmail.com>> wrote:
Hello,

>RE: IOError may happen when child already exited but dotest has missed this and tries to exit using 'child.sendline("quit")'
Actually it's OSError (not IOError):

======================================================================
ERROR: test_lldbmi_tokens (TestMiSyntax.MiSyntaxTestCase)
   Test that 'lldb-mi --interpreter' echos command tokens.
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/IliaK/p/llvm_delphi/tools/lldb/test/lldbtest.py", line 1770, in tearDown
    Base.tearDown(self)
  File "/Users/IliaK/p/llvm_delphi/tools/lldb/test/lldbtest.py", line 1092, in tearDown
    self.deletePexpectChild()
  File "/Users/IliaK/p/llvm_delphi/tools/lldb/test/lldbtest.py", line 1074, in deletePexpectChild
    self.child.sendline('settings set interpreter.prompt-on-quit false')
  File "/Users/IliaK/p/llvm_delphi/tools/lldb/test/pexpect-2.4/pexpect.py", line 966, in sendline
    n = self.send(s)
  File "/Users/IliaK/p/llvm_delphi/tools/lldb/test/pexpect-2.4/pexpect.py", line 958, in send
    c = os.write(self.child_fd, s)
OSError: [Errno 5] Input/output error
Config=x86_64-clang

Therefore I updated lldbtest_ignore_ioerror_on_theardown.patch file.
Btw, may be better to filter only IO errors from OSError class? It'll look like:

{code}
try:
    ...
except (ValueError, pexpect.ExceptionPexpect):
    # child is already terminated
    pass
except OSError, e:
    if e.errno != errno.EIO:
        # unexpected exception
        raise
    # child is already terminated
    pass
finally:
    ...
{code}

Thanks,
Ilia


On Tue, Dec 16, 2014 at 4:42 PM, Ilia K <ki.stfu at gmail.com<mailto:ki.stfu at gmail.com>> wrote:
Hello,

I found the following:
IOError may happen when child already exited but dotest has missed this and tries to exit using 'child.sendline("quit")'

Also, I clean syntax test. -exec-run no hangs more and 'quit' isn't needed at exit.

Thanks,
Ilia







-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20150112/321364f4/attachment.html>


More information about the lldb-commits mailing list