1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
"""
Test that the lldb-mi driver works with -stack-xxx commands
"""
import os
import unittest2
import lldb
from lldbtest import *
class MiStackTestCase(TestBase):
mydir = TestBase.compute_mydir(__file__)
myexe = "a.out"
@classmethod
def classCleanup(cls):
"""Cleanup the test byproducts."""
try:
os.remove("child_send.txt")
os.remove("child_read.txt")
os.remove(cls.myexe)
except:
pass
@lldbmi_test
def test_lldbmi_stackargs(self):
"""Test that 'lldb-mi --interpreter' can shows arguments."""
import pexpect
self.buildDefault()
# So that the child gets torn down after the test.
self.child = pexpect.spawn('%s --interpreter' % (self.lldbMiExec))
child = self.child
child.setecho(True)
# Turn on logging for input/output to/from the child.
with open('child_send.txt', 'w') as f_send:
with open('child_read.txt', 'w') as f_read:
child.logfile_send = f_send
child.logfile_read = f_read
# Load executable
child.sendline("-file-exec-and-symbols %s" % (self.myexe))
child.expect("\^done")
# Run to main
child.sendline("-break-insert -f main")
child.expect("\^done,bkpt={number=\"1\"")
child.sendline("-exec-run")
child.expect("\^running")
child.expect("\*stopped,reason=\"breakpoint-hit\"")
# Test arguments
child.sendline("-stack-list-arguments 0")
child.expect("\^done,stack-args=\[frame={level=\"0\",args=\[{name=\"argc\",value=\"1\"},{name=\"argv\",value=\".*\"}\]}")
# Now that the necessary logging is done, restore logfile to None to
# stop further logging.
child.logfile_send = None
child.logfile_read = None
with open('child_send.txt', 'r') as fs:
if self.TraceOn():
print "\n\nContents of child_send.txt:"
print fs.read()
with open('child_read.txt', 'r') as fr:
from_child = fr.read()
if self.TraceOn():
print "\n\nContents of child_read.txt:"
print from_child
@lldbmi_test
def test_lldbmi_locals(self):
"""Test that 'lldb-mi --interpreter' can shows local variables."""
import pexpect
self.buildDefault()
# So that the child gets torn down after the test.
self.child = pexpect.spawn('%s --interpreter' % (self.lldbMiExec))
child = self.child
child.setecho(True)
# Turn on logging for input/output to/from the child.
with open('child_send.txt', 'w') as f_send:
with open('child_read.txt', 'w') as f_read:
child.logfile_send = f_send
child.logfile_read = f_read
# Load executable
child.sendline("-file-exec-and-symbols %s" % (self.myexe))
child.expect("\^done")
# Run to main
self.line = line_number('main.c', '//BP_localstest')
child.sendline("-break-insert --file main.c:%d" % (self.line))
child.expect("\^done,bkpt={number=\"1\"")
child.sendline("-exec-run")
child.expect("\^running")
child.expect("\*stopped,reason=\"breakpoint-hit\"")
# Test locals
child.sendline("-stack-list-locals 0")
child.expect("\^done,locals=\[{name=\"a\",value=\"10\"},{name=\"b\",value=\"20\"}\]")
# Now that the necessary logging is done, restore logfile to None to
# stop further logging.
child.logfile_send = None
child.logfile_read = None
with open('child_send.txt', 'r') as fs:
if self.TraceOn():
print "\n\nContents of child_send.txt:"
print fs.read()
with open('child_read.txt', 'r') as fr:
from_child = fr.read()
if self.TraceOn():
print "\n\nContents of child_read.txt:"
print from_child
if __name__ == '__main__':
import atexit
lldb.SBDebugger.Initialize()
atexit.register(lambda: lldb.SBDebugger.Terminate())
unittest2.main()
|