Home | History | Annotate | Download | only in symbol-context
      1 """
      2 Test SBSymbolContext APIs.
      3 """
      4 
      5 import os, time
      6 import re
      7 import unittest2
      8 import lldb, lldbutil
      9 from lldbtest import *
     10 
     11 class SymbolContextAPITestCase(TestBase):
     12 
     13     mydir = os.path.join("python_api", "symbol-context")
     14 
     15     @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
     16     @python_api_test
     17     @dsym_test
     18     def test_with_dsym(self):
     19         """Exercise SBSymbolContext API extensively."""
     20         self.buildDsym()
     21         self.symbol_context()
     22 
     23     @python_api_test
     24     @dwarf_test
     25     def test_with_dwarf(self):
     26         """Exercise SBSymbolContext API extensively."""
     27         self.buildDwarf()
     28         self.symbol_context()
     29 
     30     def setUp(self):
     31         # Call super's setUp().
     32         TestBase.setUp(self)
     33         # Find the line number to of function 'c'.
     34         self.line = line_number('main.c', '// Find the line number of function "c" here.')
     35 
     36     def symbol_context(self):
     37         """Get an SBSymbolContext object and call its many methods."""
     38         exe = os.path.join(os.getcwd(), "a.out")
     39 
     40         # Create a target by the debugger.
     41         target = self.dbg.CreateTarget(exe)
     42         self.assertTrue(target, VALID_TARGET)
     43 
     44         # Now create a breakpoint on main.c by name 'c'.
     45         breakpoint = target.BreakpointCreateByName('c', 'a.out')
     46         #print "breakpoint:", breakpoint
     47         self.assertTrue(breakpoint and
     48                         breakpoint.GetNumLocations() == 1,
     49                         VALID_BREAKPOINT)
     50 
     51         # Now launch the process, and do not stop at entry point.
     52         process = target.LaunchSimple(None, None, os.getcwd())
     53         self.assertTrue(process, PROCESS_IS_VALID)
     54 
     55         # Frame #0 should be on self.line.
     56         from lldbutil import get_stopped_thread
     57         thread = get_stopped_thread(process, lldb.eStopReasonBreakpoint)
     58         self.assertTrue(thread.IsValid(), "There should be a thread stopped due to breakpoint")
     59         frame0 = thread.GetFrameAtIndex(0)
     60         self.assertTrue(frame0.GetLineEntry().GetLine() == self.line)
     61 
     62         # Now get the SBSymbolContext from this frame.  We want everything. :-)
     63         context = frame0.GetSymbolContext(lldb.eSymbolContextEverything)
     64         self.assertTrue(context)
     65 
     66         # Get the description of this module.
     67         module = context.GetModule()
     68         desc = lldbutil.get_description(module)
     69         self.expect(desc, "The module should match", exe=False,
     70             substrs = [os.path.join(self.mydir, 'a.out')])
     71 
     72         compileUnit = context.GetCompileUnit()
     73         self.expect(str(compileUnit), "The compile unit should match", exe=False,
     74             substrs = [os.path.join(self.mydir, 'main.c')])
     75 
     76         function = context.GetFunction()
     77         self.assertTrue(function)
     78         #print "function:", function
     79 
     80         block = context.GetBlock()
     81         self.assertTrue(block)
     82         #print "block:", block
     83 
     84         lineEntry = context.GetLineEntry()
     85         #print "line entry:", lineEntry
     86         self.expect(lineEntry.GetFileSpec().GetDirectory(), "The line entry should have the correct directory",
     87                     exe=False,
     88             substrs = [self.mydir])
     89         self.expect(lineEntry.GetFileSpec().GetFilename(), "The line entry should have the correct filename",
     90                     exe=False,
     91             substrs = ['main.c'])
     92         self.assertTrue(lineEntry.GetLine() == self.line,
     93                         "The line entry's line number should match ")
     94 
     95         symbol = context.GetSymbol()
     96         self.assertTrue(function.GetName() == symbol.GetName() and symbol.GetName() == 'c',
     97                         "The symbol name should be 'c'")
     98 
     99         
    100 if __name__ == '__main__':
    101     import atexit
    102     lldb.SBDebugger.Initialize()
    103     atexit.register(lambda: lldb.SBDebugger.Terminate())
    104     unittest2.main()
    105