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 123 124 125 126 127 128 129 130 131 132 133 134 135
|
"""
Test that the language option for breakpoints works correctly
with symbol load on-demand.
"""
import lldb
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
import lldbsuite.test.lldbutil as lldbutil
class TestBreakpointLanguage(TestBase):
def check_location_file(self, bp, loc, test_name):
bp_loc = bp.GetLocationAtIndex(loc)
addr = bp_loc.GetAddress()
comp_unit = addr.GetCompileUnit()
comp_name = comp_unit.GetFileSpec().GetFilename()
return comp_name == test_name
@skipIfWindows
def test_regex_breakpoint_language(self):
"""Test that the name regex breakpoint commands obey the language filter."""
self.build()
# Load symbols on-demand
self.runCmd("settings set symbols.load-on-demand true")
# Create a target by the debugger.
exe = self.getBuildArtifact("a.out")
error = lldb.SBError()
# Don't read in dependencies so we don't come across false matches that
# add unwanted breakpoint hits.
self.target = self.dbg.CreateTarget(exe, None, None, False, error)
self.assertTrue(self.target, VALID_TARGET)
cpp_bp = self.target.BreakpointCreateByRegex(
"func_from",
lldb.eLanguageTypeC_plus_plus,
lldb.SBFileSpecList(),
lldb.SBFileSpecList())
self.assertEqual(
cpp_bp.GetNumLocations(), 1,
"Only one C++ symbol matches")
self.assertTrue(self.check_location_file(cpp_bp, 0, "cpp_lang.cpp"))
c_bp = self.target.BreakpointCreateByRegex(
"func_from",
lldb.eLanguageTypeC,
lldb.SBFileSpecList(),
lldb.SBFileSpecList())
self.assertEqual(
c_bp.GetNumLocations(), 1,
"Only one C symbol matches")
self.assertTrue(self.check_location_file(c_bp, 0, "c_lang.c"))
objc_bp = self.target.BreakpointCreateByRegex(
"func_from",
lldb.eLanguageTypeObjC,
lldb.SBFileSpecList(),
lldb.SBFileSpecList())
self.assertEqual(
objc_bp.GetNumLocations(), 0,
"No ObjC symbol matches")
@skipIfWindows
def test_by_name_breakpoint_language(self):
"""Test that the name regex breakpoint commands obey the language filter."""
self.build()
# Load symbols on-demand
self.runCmd("settings set symbols.load-on-demand true")
# Create a target by the debugger.
exe = self.getBuildArtifact("a.out")
error = lldb.SBError()
# Don't read in dependencies so we don't come across false matches that
# add unwanted breakpoint hits.
self.target = self.dbg.CreateTarget(exe, None, None, False, error)
self.assertTrue(self.target, VALID_TARGET)
cpp_bp = self.target.BreakpointCreateByName(
"func_from_cpp",
lldb.eFunctionNameTypeAuto,
lldb.eLanguageTypeC_plus_plus,
lldb.SBFileSpecList(),
lldb.SBFileSpecList())
self.assertEqual(
cpp_bp.GetNumLocations(), 1,
"Only one C++ symbol matches")
self.assertTrue(self.check_location_file(cpp_bp, 0, "cpp_lang.cpp"))
no_cpp_bp = self.target.BreakpointCreateByName(
"func_from_c",
lldb.eFunctionNameTypeAuto,
lldb.eLanguageTypeC_plus_plus,
lldb.SBFileSpecList(),
lldb.SBFileSpecList())
self.assertEqual(
no_cpp_bp.GetNumLocations(), 0,
"And the C one doesn't match")
c_bp = self.target.BreakpointCreateByName(
"func_from_c",
lldb.eFunctionNameTypeAuto,
lldb.eLanguageTypeC,
lldb.SBFileSpecList(),
lldb.SBFileSpecList())
self.assertEqual(
c_bp.GetNumLocations(), 1,
"Only one C symbol matches")
self.assertTrue(self.check_location_file(c_bp, 0, "c_lang.c"))
no_c_bp = self.target.BreakpointCreateByName(
"func_from_cpp",
lldb.eFunctionNameTypeAuto,
lldb.eLanguageTypeC,
lldb.SBFileSpecList(),
lldb.SBFileSpecList())
self.assertEqual(
no_c_bp.GetNumLocations(), 0,
"And the C++ one doesn't match")
objc_bp = self.target.BreakpointCreateByName(
"func_from_cpp",
lldb.eFunctionNameTypeAuto,
lldb.eLanguageTypeObjC,
lldb.SBFileSpecList(),
lldb.SBFileSpecList())
self.assertEqual(
objc_bp.GetNumLocations(), 0,
"No ObjC symbol matches")
|