blob: 6c8fdd10d785862fba8a814694cfa755d17ce102 [file] [log] [blame]
"""Test breakpoint by file/line number; and list variables with array types."""
import os, time
import unittest2
import lldb
from lldbtest import *
class ArrayTypesTestCase(TestBase):
mydir = "array_types"
@unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
def test_with_dsym_and_run_command(self):
"""Test 'frame variable var_name' on some variables with array types."""
self.buildDsym()
self.array_types()
@unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
def test_with_dsym_and_python_api(self):
"""Use Python APIs to inspect variables with array types."""
self.buildDsym()
self.array_types_python()
def test_with_dwarf_and_run_command(self):
"""Test 'frame variable var_name' on some variables with array types."""
self.buildDwarf()
self.array_types()
def test_with_dwarf_and_python_api(self):
"""Use Python APIs to inspect variables with array types."""
self.buildDwarf()
self.array_types_python()
def array_types(self):
"""Test 'frame variable var_name' on some variables with array types."""
exe = os.path.join(os.getcwd(), "a.out")
self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
# Break on line 42 inside main().
self.expect("breakpoint set -f main.c -l 42", BREAKPOINT_CREATED,
startstr = "Breakpoint created: 1: file ='main.c', line = 42, locations = 1")
self.runCmd("run", RUN_SUCCEEDED)
# The stop reason of the thread should be breakpoint.
self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
substrs = ['state is Stopped',
'stop reason = breakpoint'])
# The breakpoint should have a hit count of 1.
self.expect("breakpoint list", BREAKPOINT_HIT_ONCE,
substrs = ['resolved, hit count = 1'])
# Issue 'variable list' command on several array-type variables.
self.expect("frame variable strings", VARIABLES_DISPLAYED_CORRECTLY,
startstr = '(char *[4])',
substrs = ['(char *) strings[0]',
'(char *) strings[1]',
'(char *) strings[2]',
'(char *) strings[3]',
'Hello',
'Hola',
'Bonjour',
'Guten Tag'])
self.expect("frame variable char_16", VARIABLES_DISPLAYED_CORRECTLY,
substrs = ['(char) char_16[0]',
'(char) char_16[15]'])
self.expect("frame variable ushort_matrix", VARIABLES_DISPLAYED_CORRECTLY,
startstr = '(unsigned short [2][3])')
self.expect("frame variable long_6", VARIABLES_DISPLAYED_CORRECTLY,
startstr = '(long [6])')
def array_types_python(self):
"""Use Python APIs to inspect variables with array types."""
exe = os.path.join(os.getcwd(), "a.out")
target = self.dbg.CreateTarget(exe)
self.assertTrue(target.IsValid(), VALID_TARGET)
breakpoint = target.BreakpointCreateByLocation("main.c", 42)
self.assertTrue(breakpoint.IsValid(), VALID_BREAKPOINT)
self.runCmd("run", RUN_SUCCEEDED, setCookie=False)
# This does not work, and results in the process stopped at dyld_start?
#process = target.LaunchProcess([''], [''], os.ctermid(), False)
# The stop reason of the thread should be breakpoint.
thread = target.GetProcess().GetThreadAtIndex(0)
self.assertTrue(thread.GetStopReason() == StopReasonEnum("Breakpoint"),
STOPPED_DUE_TO_BREAKPOINT)
# The breakpoint should have a hit count of 1.
self.assertTrue(breakpoint.GetHitCount() == 1, BREAKPOINT_HIT_ONCE)
# Lookup the "strings" string array variable.
frame = thread.GetFrameAtIndex(0)
variable = frame.LookupVar("strings")
self.DebugSBValue(frame, variable)
self.assertTrue(variable.GetNumChildren() == 4,
"Variable 'strings' should have 4 children")
child3 = variable.GetChildAtIndex(3)
self.DebugSBValue(frame, child3)
self.assertTrue(child3.GetSummary(frame) == '"Guten Tag"',
'strings[3] == "Guten Tag"')
# Lookup the "char_16" char array variable.
variable = frame.LookupVar("char_16")
self.DebugSBValue(frame, variable)
self.assertTrue(variable.GetNumChildren() == 16,
"Variable 'char_16' should have 16 children")
# Lookup the "ushort_matrix" ushort[] array variable.
variable = frame.LookupVar("ushort_matrix")
self.DebugSBValue(frame, variable)
self.assertTrue(variable.GetNumChildren() == 2,
"Variable 'ushort_matrix' should have 2 children")
child0 = variable.GetChildAtIndex(0)
self.DebugSBValue(frame, child0)
self.assertTrue(child0.GetNumChildren() == 3,
"Variable 'ushort_matrix[0]' should have 3 children")
child0_2 = child0.GetChildAtIndex(2)
self.DebugSBValue(frame, child0_2)
self.assertTrue(int(child0_2.GetValue(frame), 16) == 3,
"ushort_matrix[0][2] == 3")
# Lookup the "long_6" char array variable.
variable = frame.LookupVar("long_6")
self.DebugSBValue(frame, variable)
self.assertTrue(variable.GetNumChildren() == 6,
"Variable 'long_6' should have 6 children")
child5 = variable.GetChildAtIndex(5)
self.DebugSBValue(frame, child5)
self.assertTrue(long(child5.GetValue(frame)) == 6,
"long_6[5] == 6")
# Now kill the process, and we are done.
rc = target.GetProcess().Kill()
self.assertTrue(rc.Success())
if __name__ == '__main__':
import atexit
lldb.SBDebugger.Initialize()
atexit.register(lambda: lldb.SBDebugger.Terminate())
unittest2.main()