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
|
"""Test convenience variables when you drop in from lldb prompt into an embedded interpreter."""
from __future__ import print_function
import os
import lldb
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
from lldbsuite.test import lldbutil
class ConvenienceVariablesCase(TestBase):
mydir = TestBase.compute_mydir(__file__)
def setUp(self):
# Call super's setUp().
TestBase.setUp(self)
# Find the line number to break on inside main.cpp.
self.line = line_number('main.c', 'Hello world.')
@skipIfFreeBSD # llvm.org/pr17228
@skipIfRemote
@expectedFailureAll(
oslist=["windows"],
bugnumber="llvm.org/pr22274: need a pexpect replacement for windows")
def test_with_run_commands(self):
"""Test convenience variables lldb.debugger, lldb.target, lldb.process, lldb.thread, and lldb.frame."""
self.build()
import pexpect
exe = self.getBuildArtifact("a.out")
prompt = "(lldb) "
python_prompt = ">>> "
# So that the child gets torn down after the test.
self.child = pexpect.spawn(
'%s %s %s' %
(lldbtest_config.lldbExec, self.lldbOption, exe))
child = self.child
# Turn on logging for what the child sends back.
if self.TraceOn():
child.logfile_read = sys.stdout
# Set the breakpoint, run the inferior, when it breaks, issue print on
# the various convenience variables.
child.expect_exact(prompt)
child.sendline('breakpoint set -f main.c -l %d' % self.line)
child.expect_exact(prompt)
child.sendline('run')
child.expect_exact("stop reason = breakpoint 1.1")
child.expect_exact(prompt)
child.sendline('script')
child.expect_exact(python_prompt)
# Set a flag so that we know during teardown time, we need to exit the
# Python interpreter, then the lldb interpreter.
self.child_in_script_interpreter = True
child.sendline('print(lldb.debugger)')
child.expect_exact(python_prompt)
self.expect(child.before, exe=False,
patterns=['Debugger \(instance: .*, id: \d\)'])
child.sendline('print(lldb.target)')
child.expect_exact(python_prompt)
self.expect(child.before, exe=False,
substrs=['a.out'])
child.sendline('print(lldb.process)')
child.expect_exact(python_prompt)
self.expect(child.before, exe=False, patterns=[
'SBProcess: pid = \d+, state = stopped, threads = \d, executable = a.out'])
child.sendline('print(lldb.thread.GetStopDescription(100))')
child.expect_exact(python_prompt)
self.expect(
child.before,
exe=False,
patterns=[
'breakpoint 1\.1'])
child.sendline('lldb.frame.GetLineEntry().GetLine()')
child.expect_exact(python_prompt)
line_number = "%d"%(self.line)
self.expect(
child.before,
exe=False,
substrs=[
line_number])
child.sendline('lldb.frame.GetLineEntry().GetFileSpec().GetFilename()')
child.expect_exact(python_prompt)
line_number = "%d"%(self.line)
self.expect(
child.before,
exe=False,
substrs=[
"main.c"])
child.sendline('lldb.frame.GetFunctionName()')
child.expect_exact(python_prompt)
line_number = "%d"%(self.line)
self.expect(
child.before,
exe=False,
substrs=[
"main"])
|