Home | History | Annotate | Download | only in array_types
      1 """Test breakpoint by file/line number; and list variables with array types."""
      2 
      3 import os, time
      4 import unittest2
      5 import lldb
      6 from lldbtest import *
      7 import lldbutil
      8 
      9 class ArrayTypesTestCase(TestBase):
     10 
     11     mydir = os.path.join("lang", "c", "array_types")
     12 
     13     @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
     14     @dsym_test
     15     def test_with_dsym_and_run_command(self):
     16         """Test 'frame variable var_name' on some variables with array types."""
     17         self.buildDsym()
     18         self.array_types()
     19 
     20     @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
     21     @python_api_test    
     22     @dsym_test
     23     def test_with_dsym_and_python_api(self):
     24         """Use Python APIs to inspect variables with array types."""
     25         self.buildDsym()
     26         self.array_types_python()
     27 
     28     @dwarf_test
     29     def test_with_dwarf_and_run_command(self):
     30         """Test 'frame variable var_name' on some variables with array types."""
     31         self.buildDwarf()
     32         self.array_types()
     33 
     34     @python_api_test
     35     @dwarf_test
     36     def test_with_dwarf_and_python_api(self):
     37         """Use Python APIs to inspect variables with array types."""
     38         self.buildDwarf()
     39         self.array_types_python()
     40 
     41     def setUp(self):
     42         # Call super's setUp().
     43         TestBase.setUp(self)
     44         # Find the line number to break inside main().
     45         self.line = line_number('main.c', '// Set break point at this line.')
     46 
     47     def array_types(self):
     48         """Test 'frame variable var_name' on some variables with array types."""
     49         exe = os.path.join(os.getcwd(), "a.out")
     50         self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
     51 
     52         lldbutil.run_break_set_by_file_and_line (self, "main.c", self.line, num_expected_locations=1, loc_exact=False)
     53 
     54         self.runCmd("run", RUN_SUCCEEDED)
     55 
     56         # The test suite sometimes shows that the process has exited without stopping.
     57         #
     58         # CC=clang ./dotest.py -v -t array_types
     59         # ...
     60         # Process 76604 exited with status = 0 (0x00000000)
     61         self.runCmd("process status")
     62 
     63         # The stop reason of the thread should be breakpoint.
     64         self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
     65             substrs = ['stopped',
     66                        'stop reason = breakpoint'])
     67 
     68         # The breakpoint should have a hit count of 1.
     69         self.expect("breakpoint list -f", BREAKPOINT_HIT_ONCE,
     70             substrs = ['resolved, hit count = 1'])
     71 
     72         # Issue 'variable list' command on several array-type variables.
     73 
     74         self.expect("frame variable --show-types strings", VARIABLES_DISPLAYED_CORRECTLY,
     75             startstr = '(char *[4])',
     76             substrs = ['(char *) [0]',
     77                        '(char *) [1]',
     78                        '(char *) [2]',
     79                        '(char *) [3]',
     80                        'Hello',
     81                        'Hola',
     82                        'Bonjour',
     83                        'Guten Tag'])
     84 
     85         self.expect("frame variable --show-types --raw -- char_16", VARIABLES_DISPLAYED_CORRECTLY,
     86             substrs = ['(char) [0]',
     87                        '(char) [15]'])
     88 
     89         self.expect("frame variable --show-types ushort_matrix", VARIABLES_DISPLAYED_CORRECTLY,
     90             startstr = '(unsigned short [2][3])')
     91 
     92         self.expect("frame variable --show-types long_6", VARIABLES_DISPLAYED_CORRECTLY,
     93             startstr = '(long [6])')
     94 
     95     def array_types_python(self):
     96         """Use Python APIs to inspect variables with array types."""
     97         exe = os.path.join(os.getcwd(), "a.out")
     98 
     99         target = self.dbg.CreateTarget(exe)
    100         self.assertTrue(target, VALID_TARGET)
    101 
    102         breakpoint = target.BreakpointCreateByLocation("main.c", self.line)
    103         self.assertTrue(breakpoint, VALID_BREAKPOINT)
    104 
    105         # Sanity check the print representation of breakpoint.
    106         bp = str(breakpoint)
    107         self.expect(bp, msg="Breakpoint looks good", exe=False,
    108             substrs = ["file = 'main.c'",
    109                        "line = %d" % self.line,
    110                        "locations = 1"])
    111         self.expect(bp, msg="Breakpoint is not resolved as yet", exe=False, matching=False,
    112             substrs = ["resolved = 1"])
    113 
    114         # Now launch the process, and do not stop at entry point.
    115         process = target.LaunchSimple(None, None, os.getcwd())
    116         self.assertTrue(process, PROCESS_IS_VALID)
    117 
    118         # Sanity check the print representation of process.
    119         proc = str(process)
    120         self.expect(proc, msg="Process looks good", exe=False,
    121             substrs = ["state = stopped",
    122                        "executable = a.out"])
    123 
    124         # The stop reason of the thread should be breakpoint.
    125         thread = process.GetThreadAtIndex(0)
    126         if thread.GetStopReason() != lldb.eStopReasonBreakpoint:
    127             from lldbutil import stop_reason_to_str
    128             self.fail(STOPPED_DUE_TO_BREAKPOINT_WITH_STOP_REASON_AS %
    129                       stop_reason_to_str(thread.GetStopReason()))
    130 
    131         # Sanity check the print representation of thread.
    132         thr = str(thread)
    133         self.expect(thr, "Thread looks good with stop reason = breakpoint", exe=False,
    134             substrs = ["tid = 0x%4.4x" % thread.GetThreadID()])
    135 
    136         # The breakpoint should have a hit count of 1.
    137         self.assertTrue(breakpoint.GetHitCount() == 1, BREAKPOINT_HIT_ONCE)
    138 
    139         # The breakpoint should be resolved by now.
    140         bp = str(breakpoint)
    141         self.expect(bp, "Breakpoint looks good and is resolved", exe=False,
    142             substrs = ["file = 'main.c'",
    143                        "line = %d" % self.line,
    144                        "locations = 1"])
    145 
    146         # Sanity check the print representation of frame.
    147         frame = thread.GetFrameAtIndex(0)
    148         frm = str(frame)
    149         self.expect(frm,
    150                     "Frame looks good with correct index %d" % frame.GetFrameID(),
    151                     exe=False,
    152             substrs = ["#%d" % frame.GetFrameID()])
    153 
    154         # Lookup the "strings" string array variable and sanity check its print
    155         # representation.
    156         variable = frame.FindVariable("strings")
    157         var = str(variable)
    158         self.expect(var, "Variable for 'strings' looks good with correct name", exe=False,
    159             substrs = ["%s" % variable.GetName()])
    160         self.DebugSBValue(variable)
    161         self.assertTrue(variable.GetNumChildren() == 4,
    162                         "Variable 'strings' should have 4 children")
    163 
    164         child3 = variable.GetChildAtIndex(3)
    165         self.DebugSBValue(child3)
    166         self.assertTrue(child3.GetSummary() == '"Guten Tag"',
    167                         'strings[3] == "Guten Tag"')
    168 
    169         # Lookup the "char_16" char array variable.
    170         variable = frame.FindVariable("char_16")
    171         self.DebugSBValue(variable)
    172         self.assertTrue(variable.GetNumChildren() == 16,
    173                         "Variable 'char_16' should have 16 children")
    174 
    175         # Lookup the "ushort_matrix" ushort[] array variable.
    176         # Notice the pattern of int(child0_2.GetValue(), 0).  We pass a
    177         # base of 0 so that the proper radix is determined based on the contents
    178         # of the string.  Same applies to long().
    179         variable = frame.FindVariable("ushort_matrix")
    180         self.DebugSBValue(variable)
    181         self.assertTrue(variable.GetNumChildren() == 2,
    182                         "Variable 'ushort_matrix' should have 2 children")
    183         child0 = variable.GetChildAtIndex(0)
    184         self.DebugSBValue(child0)
    185         self.assertTrue(child0.GetNumChildren() == 3,
    186                         "Variable 'ushort_matrix[0]' should have 3 children")
    187         child0_2 = child0.GetChildAtIndex(2)
    188         self.DebugSBValue(child0_2)
    189         self.assertTrue(int(child0_2.GetValue(), 0) == 3,
    190                         "ushort_matrix[0][2] == 3")
    191 
    192         # Lookup the "long_6" char array variable.
    193         variable = frame.FindVariable("long_6")
    194         self.DebugSBValue(variable)
    195         self.assertTrue(variable.GetNumChildren() == 6,
    196                         "Variable 'long_6' should have 6 children")
    197         child5 = variable.GetChildAtIndex(5)
    198         self.DebugSBValue(child5)
    199         self.assertTrue(long(child5.GetValue(), 0) == 6,
    200                         "long_6[5] == 6")
    201 
    202         # Last, check that "long_6" has a value type of eValueTypeVariableLocal
    203         # and "argc" has eValueTypeVariableArgument.
    204         from lldbutil import value_type_to_str
    205         self.assertTrue(variable.GetValueType() == lldb.eValueTypeVariableLocal,
    206                         "Variable 'long_6' should have '%s' value type." %
    207                         value_type_to_str(lldb.eValueTypeVariableLocal))
    208         argc = frame.FindVariable("argc")
    209         self.DebugSBValue(argc)
    210         self.assertTrue(argc.GetValueType() == lldb.eValueTypeVariableArgument,
    211                         "Variable 'argc' should have '%s' value type." %
    212                         value_type_to_str(lldb.eValueTypeVariableArgument))
    213 
    214 
    215 if __name__ == '__main__':
    216     import atexit
    217     lldb.SBDebugger.Initialize()
    218     atexit.register(lambda: lldb.SBDebugger.Terminate())
    219     unittest2.main()
    220