199451b44SJordan Rupprecht# encoding: utf-8 299451b44SJordan Rupprecht""" 399451b44SJordan RupprechtTest lldb's frame recognizers. 499451b44SJordan Rupprecht""" 599451b44SJordan Rupprecht 699451b44SJordan Rupprechtimport lldb 799451b44SJordan Rupprechtfrom lldbsuite.test.decorators import * 899451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import * 999451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil 1099451b44SJordan Rupprecht 1199451b44SJordan Rupprechtimport recognizer 1299451b44SJordan Rupprecht 132238dcc3SJonas Devlieghere 1499451b44SJordan Rupprechtclass FrameRecognizerTestCase(TestBase): 1599451b44SJordan Rupprecht NO_DEBUG_INFO_TESTCASE = True 1699451b44SJordan Rupprecht 1799451b44SJordan Rupprecht def test_frame_recognizer_1(self): 1899451b44SJordan Rupprecht self.build() 19db31e2e1SMed Ismail Bennani exe = self.getBuildArtifact("a.out") 20d8d252feSAdrian Vogelsgesang target, process, thread, _ = lldbutil.run_to_name_breakpoint( 21d8d252feSAdrian Vogelsgesang self, "foo", exe_name=exe 22d8d252feSAdrian Vogelsgesang ) 23*7293455cSDave Lee frame = thread.selected_frame 2499451b44SJordan Rupprecht 2599451b44SJordan Rupprecht # Clear internal & plugins recognizers that get initialized at launch 2699451b44SJordan Rupprecht self.runCmd("frame recognizer clear") 2799451b44SJordan Rupprecht 282238dcc3SJonas Devlieghere self.runCmd( 292238dcc3SJonas Devlieghere "command script import " 302238dcc3SJonas Devlieghere + os.path.join(self.getSourceDir(), "recognizer.py") 312238dcc3SJonas Devlieghere ) 3299451b44SJordan Rupprecht 332238dcc3SJonas Devlieghere self.expect("frame recognizer list", substrs=["no matching results found."]) 3499451b44SJordan Rupprecht 352238dcc3SJonas Devlieghere self.runCmd( 362238dcc3SJonas Devlieghere "frame recognizer add -l recognizer.MyFrameRecognizer -s a.out -n foo" 372238dcc3SJonas Devlieghere ) 3899451b44SJordan Rupprecht 392238dcc3SJonas Devlieghere self.expect( 402238dcc3SJonas Devlieghere "frame recognizer list", 41dd060bdeSAdrian Vogelsgesang substrs=[ 42dd060bdeSAdrian Vogelsgesang "0: recognizer.MyFrameRecognizer, module a.out, demangled symbol foo" 43dd060bdeSAdrian Vogelsgesang ], 442238dcc3SJonas Devlieghere ) 4599451b44SJordan Rupprecht 462238dcc3SJonas Devlieghere self.runCmd( 472238dcc3SJonas Devlieghere "frame recognizer add -l recognizer.MyOtherFrameRecognizer -s a.out -n bar -x" 482238dcc3SJonas Devlieghere ) 4999451b44SJordan Rupprecht 5099451b44SJordan Rupprecht self.expect( 5199451b44SJordan Rupprecht "frame recognizer list", 5299451b44SJordan Rupprecht substrs=[ 53dd060bdeSAdrian Vogelsgesang "1: recognizer.MyOtherFrameRecognizer, module a.out, demangled symbol regex bar", 54dd060bdeSAdrian Vogelsgesang "0: recognizer.MyFrameRecognizer, module a.out, demangled symbol foo", 552238dcc3SJonas Devlieghere ], 562238dcc3SJonas Devlieghere ) 5799451b44SJordan Rupprecht 5899451b44SJordan Rupprecht self.runCmd("frame recognizer delete 0") 5999451b44SJordan Rupprecht 605477fbc2SRaphael Isemann # Test that it deleted the recognizer with id 0. 612238dcc3SJonas Devlieghere self.expect( 622238dcc3SJonas Devlieghere "frame recognizer list", 632238dcc3SJonas Devlieghere substrs=[ 64fc517973SAdrian Vogelsgesang "1: recognizer.MyOtherFrameRecognizer, module a.out, demangled symbol regex bar" 652238dcc3SJonas Devlieghere ], 662238dcc3SJonas Devlieghere ) 672238dcc3SJonas Devlieghere self.expect( 682238dcc3SJonas Devlieghere "frame recognizer list", matching=False, substrs=["MyFrameRecognizer"] 692238dcc3SJonas Devlieghere ) 705477fbc2SRaphael Isemann 715477fbc2SRaphael Isemann # Test that an invalid index and deleting the same index again 725477fbc2SRaphael Isemann # is an error and doesn't do any changes. 732238dcc3SJonas Devlieghere self.expect( 742238dcc3SJonas Devlieghere "frame recognizer delete 2", 752238dcc3SJonas Devlieghere error=True, 762238dcc3SJonas Devlieghere substrs=["error: '2' is not a valid recognizer id."], 772238dcc3SJonas Devlieghere ) 782238dcc3SJonas Devlieghere self.expect( 792238dcc3SJonas Devlieghere "frame recognizer delete 0", 802238dcc3SJonas Devlieghere error=True, 812238dcc3SJonas Devlieghere substrs=["error: '0' is not a valid recognizer id."], 822238dcc3SJonas Devlieghere ) 835477fbc2SRaphael Isemann # Recognizers should have the same state as above. 842238dcc3SJonas Devlieghere self.expect( 852238dcc3SJonas Devlieghere "frame recognizer list", 862238dcc3SJonas Devlieghere substrs=[ 87fc517973SAdrian Vogelsgesang "1: recognizer.MyOtherFrameRecognizer, module a.out, demangled symbol regex bar" 882238dcc3SJonas Devlieghere ], 892238dcc3SJonas Devlieghere ) 902238dcc3SJonas Devlieghere self.expect( 912238dcc3SJonas Devlieghere "frame recognizer list", matching=False, substrs=["MyFrameRecognizer"] 922238dcc3SJonas Devlieghere ) 9399451b44SJordan Rupprecht 9499451b44SJordan Rupprecht self.runCmd("frame recognizer clear") 9599451b44SJordan Rupprecht 962238dcc3SJonas Devlieghere self.expect("frame recognizer list", substrs=["no matching results found."]) 9799451b44SJordan Rupprecht 982238dcc3SJonas Devlieghere self.runCmd( 992238dcc3SJonas Devlieghere "frame recognizer add -l recognizer.MyFrameRecognizer -s a.out -n foo" 1002238dcc3SJonas Devlieghere ) 10199451b44SJordan Rupprecht 1022238dcc3SJonas Devlieghere self.expect("frame variable", substrs=["(int) a = 42", "(int) b = 56"]) 10399451b44SJordan Rupprecht 10499451b44SJordan Rupprecht # Recognized arguments don't show up by default... 10599451b44SJordan Rupprecht variables = frame.GetVariables(lldb.SBVariablesOptions()) 10699451b44SJordan Rupprecht self.assertEqual(variables.GetSize(), 0) 10799451b44SJordan Rupprecht 10899451b44SJordan Rupprecht # ...unless you set target.display-recognized-arguments to 1... 10999451b44SJordan Rupprecht self.runCmd("settings set target.display-recognized-arguments 1") 11099451b44SJordan Rupprecht variables = frame.GetVariables(lldb.SBVariablesOptions()) 11199451b44SJordan Rupprecht self.assertEqual(variables.GetSize(), 2) 11299451b44SJordan Rupprecht 11399451b44SJordan Rupprecht # ...and you can reset it back to 0 to hide them again... 11499451b44SJordan Rupprecht self.runCmd("settings set target.display-recognized-arguments 0") 11599451b44SJordan Rupprecht variables = frame.GetVariables(lldb.SBVariablesOptions()) 11699451b44SJordan Rupprecht self.assertEqual(variables.GetSize(), 0) 11799451b44SJordan Rupprecht 11899451b44SJordan Rupprecht # ... or explicitly ask for them with SetIncludeRecognizedArguments(True). 11999451b44SJordan Rupprecht opts = lldb.SBVariablesOptions() 12099451b44SJordan Rupprecht opts.SetIncludeRecognizedArguments(True) 12199451b44SJordan Rupprecht variables = frame.GetVariables(opts) 12299451b44SJordan Rupprecht 12399451b44SJordan Rupprecht self.assertEqual(variables.GetSize(), 2) 12499451b44SJordan Rupprecht self.assertEqual(variables.GetValueAtIndex(0).name, "a") 12599451b44SJordan Rupprecht self.assertEqual(variables.GetValueAtIndex(0).signed, 42) 1262238dcc3SJonas Devlieghere self.assertEqual( 1272238dcc3SJonas Devlieghere variables.GetValueAtIndex(0).GetValueType(), lldb.eValueTypeVariableArgument 1282238dcc3SJonas Devlieghere ) 12999451b44SJordan Rupprecht self.assertEqual(variables.GetValueAtIndex(1).name, "b") 13099451b44SJordan Rupprecht self.assertEqual(variables.GetValueAtIndex(1).signed, 56) 1312238dcc3SJonas Devlieghere self.assertEqual( 1322238dcc3SJonas Devlieghere variables.GetValueAtIndex(1).GetValueType(), lldb.eValueTypeVariableArgument 1332238dcc3SJonas Devlieghere ) 13499451b44SJordan Rupprecht 1352238dcc3SJonas Devlieghere self.expect( 1362238dcc3SJonas Devlieghere "frame recognizer info 0", 1372238dcc3SJonas Devlieghere substrs=["frame 0 is recognized by recognizer.MyFrameRecognizer"], 1382238dcc3SJonas Devlieghere ) 13999451b44SJordan Rupprecht 1402238dcc3SJonas Devlieghere self.expect( 1412238dcc3SJonas Devlieghere "frame recognizer info 999", error=True, substrs=["no frame with index 999"] 1422238dcc3SJonas Devlieghere ) 14399451b44SJordan Rupprecht 1442238dcc3SJonas Devlieghere self.expect( 1452238dcc3SJonas Devlieghere "frame recognizer info 1", 1462238dcc3SJonas Devlieghere substrs=["frame 1 not recognized by any recognizer"], 1472238dcc3SJonas Devlieghere ) 14899451b44SJordan Rupprecht 14999451b44SJordan Rupprecht # FIXME: The following doesn't work yet, but should be fixed. 15099451b44SJordan Rupprecht """ 151db31e2e1SMed Ismail Bennani target, process, thread, _ = lldbutil.run_to_name_breakpoint(self, "bar", 152db31e2e1SMed Ismail Bennani exe_name = exe) 153db31e2e1SMed Ismail Bennani frame = thread.GetSelectedFrame() 15499451b44SJordan Rupprecht 15599451b44SJordan Rupprecht self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT, 15699451b44SJordan Rupprecht substrs=['stopped', 'stop reason = breakpoint']) 15799451b44SJordan Rupprecht 15899451b44SJordan Rupprecht self.expect("frame variable -t", 15999451b44SJordan Rupprecht substrs=['(int *) a = ']) 16099451b44SJordan Rupprecht 16199451b44SJordan Rupprecht self.expect("frame variable -t *a", 16299451b44SJordan Rupprecht substrs=['*a = 78']) 16399451b44SJordan Rupprecht """ 164db31e2e1SMed Ismail Bennani 1653c0fba4fSAdrian Prantl def test_frame_recognizer_hiding(self): 1663c0fba4fSAdrian Prantl self.build() 1673c0fba4fSAdrian Prantl 1683c0fba4fSAdrian Prantl target, process, thread, _ = lldbutil.run_to_name_breakpoint(self, "nested") 169*7293455cSDave Lee frame = thread.selected_frame 1703c0fba4fSAdrian Prantl 1713c0fba4fSAdrian Prantl # Sanity check. 1723c0fba4fSAdrian Prantl self.expect( 1733c0fba4fSAdrian Prantl "thread backtrace", patterns=["frame.*nested", "frame.*baz", "frame.*main"] 1743c0fba4fSAdrian Prantl ) 1753c0fba4fSAdrian Prantl 1763c0fba4fSAdrian Prantl self.expect("frame recognizer clear") 1773c0fba4fSAdrian Prantl self.expect( 1783c0fba4fSAdrian Prantl "command script import " 1793c0fba4fSAdrian Prantl + os.path.join(self.getSourceDir(), "recognizer.py") 1803c0fba4fSAdrian Prantl ) 1813c0fba4fSAdrian Prantl 1823c0fba4fSAdrian Prantl self.expect( 1833c0fba4fSAdrian Prantl "frame recognizer add -l recognizer.BazFrameRecognizer -f false -s a.out -n baz" 1843c0fba4fSAdrian Prantl ) 1853c0fba4fSAdrian Prantl 1863c0fba4fSAdrian Prantl self.expect( 1873c0fba4fSAdrian Prantl "frame recognizer list", 1883c0fba4fSAdrian Prantl substrs=["0: recognizer.BazFrameRecognizer"], 1893c0fba4fSAdrian Prantl ) 1903c0fba4fSAdrian Prantl 1913c0fba4fSAdrian Prantl # Now main should be hidden. 1923c0fba4fSAdrian Prantl self.expect("thread backtrace", matching=False, patterns=["frame.*baz"]) 1933c0fba4fSAdrian Prantl self.assertFalse(frame.IsHidden()) 1943c0fba4fSAdrian Prantl frame = thread.SetSelectedFrame(1) 1953c0fba4fSAdrian Prantl self.assertIn("baz", frame.name) 1963c0fba4fSAdrian Prantl self.assertTrue(frame.IsHidden()) 1973c0fba4fSAdrian Prantl 1983c0fba4fSAdrian Prantl # Test StepOut. 1993c0fba4fSAdrian Prantl frame = thread.SetSelectedFrame(0) 2003c0fba4fSAdrian Prantl thread.StepOut() 2013c0fba4fSAdrian Prantl frame = thread.GetSelectedFrame() 2023c0fba4fSAdrian Prantl self.assertIn("main", frame.name) 2033c0fba4fSAdrian Prantl 204db31e2e1SMed Ismail Bennani def test_frame_recognizer_multi_symbol(self): 205db31e2e1SMed Ismail Bennani self.build() 206db31e2e1SMed Ismail Bennani exe = self.getBuildArtifact("a.out") 207db31e2e1SMed Ismail Bennani 208db31e2e1SMed Ismail Bennani # Clear internal & plugins recognizers that get initialized at launch 209db31e2e1SMed Ismail Bennani self.runCmd("frame recognizer clear") 210db31e2e1SMed Ismail Bennani 2112238dcc3SJonas Devlieghere self.runCmd( 2122238dcc3SJonas Devlieghere "command script import " 2132238dcc3SJonas Devlieghere + os.path.join(self.getSourceDir(), "recognizer.py") 2142238dcc3SJonas Devlieghere ) 215db31e2e1SMed Ismail Bennani 2162238dcc3SJonas Devlieghere self.expect("frame recognizer list", substrs=["no matching results found."]) 217db31e2e1SMed Ismail Bennani 2182238dcc3SJonas Devlieghere self.runCmd( 2192238dcc3SJonas Devlieghere "frame recognizer add -l recognizer.MyFrameRecognizer -s a.out -n foo -n bar" 2202238dcc3SJonas Devlieghere ) 221db31e2e1SMed Ismail Bennani 2222238dcc3SJonas Devlieghere self.expect( 2232238dcc3SJonas Devlieghere "frame recognizer list", 2242238dcc3SJonas Devlieghere substrs=[ 225dd060bdeSAdrian Vogelsgesang "recognizer.MyFrameRecognizer, module a.out, demangled symbol foo, bar" 2262238dcc3SJonas Devlieghere ], 2272238dcc3SJonas Devlieghere ) 228db31e2e1SMed Ismail Bennani 2292238dcc3SJonas Devlieghere target, process, thread, _ = lldbutil.run_to_name_breakpoint( 2302238dcc3SJonas Devlieghere self, "foo", exe_name=exe 2312238dcc3SJonas Devlieghere ) 232db31e2e1SMed Ismail Bennani 2332238dcc3SJonas Devlieghere self.expect( 2342238dcc3SJonas Devlieghere "frame recognizer info 0", 2352238dcc3SJonas Devlieghere substrs=["frame 0 is recognized by recognizer.MyFrameRecognizer"], 2362238dcc3SJonas Devlieghere ) 237db31e2e1SMed Ismail Bennani 2382238dcc3SJonas Devlieghere target, process, thread, _ = lldbutil.run_to_name_breakpoint( 2392238dcc3SJonas Devlieghere self, "bar", exe_name=exe 2402238dcc3SJonas Devlieghere ) 241db31e2e1SMed Ismail Bennani 2422238dcc3SJonas Devlieghere self.expect( 2432238dcc3SJonas Devlieghere "frame recognizer info 0", 2442238dcc3SJonas Devlieghere substrs=["frame 0 is recognized by recognizer.MyFrameRecognizer"], 2452238dcc3SJonas Devlieghere ) 2469010cef2SRaphael Isemann 2471b7c9eaeSRaphael Isemann def test_frame_recognizer_target_specific(self): 2481b7c9eaeSRaphael Isemann self.build() 2491b7c9eaeSRaphael Isemann exe = self.getBuildArtifact("a.out") 2501b7c9eaeSRaphael Isemann 2511b7c9eaeSRaphael Isemann # Clear internal & plugins recognizers that get initialized at launch 2521b7c9eaeSRaphael Isemann self.runCmd("frame recognizer clear") 2531b7c9eaeSRaphael Isemann 2541b7c9eaeSRaphael Isemann # Create a target. 2552238dcc3SJonas Devlieghere target, process, thread, _ = lldbutil.run_to_name_breakpoint( 2562238dcc3SJonas Devlieghere self, "foo", exe_name=exe 2572238dcc3SJonas Devlieghere ) 2581b7c9eaeSRaphael Isemann 2592238dcc3SJonas Devlieghere self.runCmd( 2602238dcc3SJonas Devlieghere "command script import " 2612238dcc3SJonas Devlieghere + os.path.join(self.getSourceDir(), "recognizer.py") 2622238dcc3SJonas Devlieghere ) 2631b7c9eaeSRaphael Isemann 2641b7c9eaeSRaphael Isemann # Check that this doesn't contain our own FrameRecognizer somehow. 2652238dcc3SJonas Devlieghere self.expect( 2662238dcc3SJonas Devlieghere "frame recognizer list", matching=False, substrs=["MyFrameRecognizer"] 2672238dcc3SJonas Devlieghere ) 2681b7c9eaeSRaphael Isemann 2691b7c9eaeSRaphael Isemann # Add a frame recognizer in that target. 2702238dcc3SJonas Devlieghere self.runCmd( 2712238dcc3SJonas Devlieghere "frame recognizer add -l recognizer.MyFrameRecognizer -s a.out -n foo -n bar" 2722238dcc3SJonas Devlieghere ) 2731b7c9eaeSRaphael Isemann 2742238dcc3SJonas Devlieghere self.expect( 2752238dcc3SJonas Devlieghere "frame recognizer list", 2762238dcc3SJonas Devlieghere substrs=[ 277dd060bdeSAdrian Vogelsgesang "recognizer.MyFrameRecognizer, module a.out, demangled symbol foo, bar" 2782238dcc3SJonas Devlieghere ], 2792238dcc3SJonas Devlieghere ) 2801b7c9eaeSRaphael Isemann 2812238dcc3SJonas Devlieghere self.expect( 2822238dcc3SJonas Devlieghere "frame recognizer info 0", 2832238dcc3SJonas Devlieghere substrs=["frame 0 is recognized by recognizer.MyFrameRecognizer"], 2842238dcc3SJonas Devlieghere ) 2851b7c9eaeSRaphael Isemann 2861b7c9eaeSRaphael Isemann # Create a second target. That one shouldn't have the frame recognizer. 2872238dcc3SJonas Devlieghere target, process, thread, _ = lldbutil.run_to_name_breakpoint( 2882238dcc3SJonas Devlieghere self, "bar", exe_name=exe 2892238dcc3SJonas Devlieghere ) 2901b7c9eaeSRaphael Isemann 2912238dcc3SJonas Devlieghere self.expect( 2922238dcc3SJonas Devlieghere "frame recognizer info 0", 2932238dcc3SJonas Devlieghere substrs=["frame 0 not recognized by any recognizer"], 2942238dcc3SJonas Devlieghere ) 2951b7c9eaeSRaphael Isemann 2961b7c9eaeSRaphael Isemann # Add a frame recognizer to the new target. 2972238dcc3SJonas Devlieghere self.runCmd( 2982238dcc3SJonas Devlieghere "frame recognizer add -l recognizer.MyFrameRecognizer -s a.out -n bar" 2992238dcc3SJonas Devlieghere ) 3001b7c9eaeSRaphael Isemann 3012238dcc3SJonas Devlieghere self.expect( 3022238dcc3SJonas Devlieghere "frame recognizer list", 303dd060bdeSAdrian Vogelsgesang substrs=[ 304dd060bdeSAdrian Vogelsgesang "recognizer.MyFrameRecognizer, module a.out, demangled symbol bar" 305dd060bdeSAdrian Vogelsgesang ], 3062238dcc3SJonas Devlieghere ) 3071b7c9eaeSRaphael Isemann 3081b7c9eaeSRaphael Isemann # Now the new target should also recognize the frame. 3092238dcc3SJonas Devlieghere self.expect( 3102238dcc3SJonas Devlieghere "frame recognizer info 0", 3112238dcc3SJonas Devlieghere substrs=["frame 0 is recognized by recognizer.MyFrameRecognizer"], 3122238dcc3SJonas Devlieghere ) 3131b7c9eaeSRaphael Isemann 31454c496daSRoman Podoliaka def test_frame_recognizer_not_only_first_instruction(self): 31554c496daSRoman Podoliaka self.build() 31654c496daSRoman Podoliaka exe = self.getBuildArtifact("a.out") 31754c496daSRoman Podoliaka 31854c496daSRoman Podoliaka # Clear internal & plugins recognizers that get initialized at launch. 31954c496daSRoman Podoliaka self.runCmd("frame recognizer clear") 32054c496daSRoman Podoliaka 3212238dcc3SJonas Devlieghere self.runCmd( 3222238dcc3SJonas Devlieghere "command script import " 3232238dcc3SJonas Devlieghere + os.path.join(self.getSourceDir(), "recognizer.py") 3242238dcc3SJonas Devlieghere ) 32554c496daSRoman Podoliaka 3262238dcc3SJonas Devlieghere self.expect("frame recognizer list", substrs=["no matching results found."]) 32754c496daSRoman Podoliaka 32854c496daSRoman Podoliaka # Create a target. 3292238dcc3SJonas Devlieghere target, process, thread, _ = lldbutil.run_to_name_breakpoint( 3302238dcc3SJonas Devlieghere self, "foo", exe_name=exe 3312238dcc3SJonas Devlieghere ) 33254c496daSRoman Podoliaka 33354c496daSRoman Podoliaka # Move the PC one instruction further. 33454c496daSRoman Podoliaka self.runCmd("next") 33554c496daSRoman Podoliaka 33654c496daSRoman Podoliaka # Add a frame recognizer in that target. 3372238dcc3SJonas Devlieghere self.runCmd( 3382238dcc3SJonas Devlieghere "frame recognizer add -l recognizer.MyFrameRecognizer -s a.out -n foo -n bar" 3392238dcc3SJonas Devlieghere ) 34054c496daSRoman Podoliaka 34154c496daSRoman Podoliaka # It's not applied to foo(), because frame's PC is not at the first instruction of the function. 3422238dcc3SJonas Devlieghere self.expect( 3432238dcc3SJonas Devlieghere "frame recognizer info 0", 3442238dcc3SJonas Devlieghere substrs=["frame 0 not recognized by any recognizer"], 3452238dcc3SJonas Devlieghere ) 34654c496daSRoman Podoliaka 34754c496daSRoman Podoliaka # Add a frame recognizer with --first-instruction-only=true. 34854c496daSRoman Podoliaka self.runCmd("frame recognizer clear") 34954c496daSRoman Podoliaka 3502238dcc3SJonas Devlieghere self.runCmd( 3512238dcc3SJonas Devlieghere "frame recognizer add -l recognizer.MyFrameRecognizer -s a.out -n foo -n bar --first-instruction-only=true" 3522238dcc3SJonas Devlieghere ) 35354c496daSRoman Podoliaka 35454c496daSRoman Podoliaka # It's not applied to foo(), because frame's PC is not at the first instruction of the function. 3552238dcc3SJonas Devlieghere self.expect( 3562238dcc3SJonas Devlieghere "frame recognizer info 0", 3572238dcc3SJonas Devlieghere substrs=["frame 0 not recognized by any recognizer"], 3582238dcc3SJonas Devlieghere ) 35954c496daSRoman Podoliaka 36054c496daSRoman Podoliaka # Now add a frame recognizer with --first-instruction-only=false. 36154c496daSRoman Podoliaka self.runCmd("frame recognizer clear") 36254c496daSRoman Podoliaka 3632238dcc3SJonas Devlieghere self.runCmd( 3642238dcc3SJonas Devlieghere "frame recognizer add -l recognizer.MyFrameRecognizer -s a.out -n foo -n bar --first-instruction-only=false" 3652238dcc3SJonas Devlieghere ) 36654c496daSRoman Podoliaka 36754c496daSRoman Podoliaka # This time it should recognize the frame. 3682238dcc3SJonas Devlieghere self.expect( 3692238dcc3SJonas Devlieghere "frame recognizer info 0", 3702238dcc3SJonas Devlieghere substrs=["frame 0 is recognized by recognizer.MyFrameRecognizer"], 3712238dcc3SJonas Devlieghere ) 37254c496daSRoman Podoliaka 37354c496daSRoman Podoliaka opts = lldb.SBVariablesOptions() 37454c496daSRoman Podoliaka opts.SetIncludeRecognizedArguments(True) 375*7293455cSDave Lee frame = thread.selected_frame 37654c496daSRoman Podoliaka variables = frame.GetVariables(opts) 37754c496daSRoman Podoliaka 37854c496daSRoman Podoliaka self.assertEqual(variables.GetSize(), 2) 37954c496daSRoman Podoliaka self.assertEqual(variables.GetValueAtIndex(0).name, "a") 38054c496daSRoman Podoliaka self.assertEqual(variables.GetValueAtIndex(0).signed, 42) 3812238dcc3SJonas Devlieghere self.assertEqual( 3822238dcc3SJonas Devlieghere variables.GetValueAtIndex(0).GetValueType(), lldb.eValueTypeVariableArgument 3832238dcc3SJonas Devlieghere ) 38454c496daSRoman Podoliaka self.assertEqual(variables.GetValueAtIndex(1).name, "b") 38554c496daSRoman Podoliaka self.assertEqual(variables.GetValueAtIndex(1).signed, 56) 3862238dcc3SJonas Devlieghere self.assertEqual( 3872238dcc3SJonas Devlieghere variables.GetValueAtIndex(1).GetValueType(), lldb.eValueTypeVariableArgument 3882238dcc3SJonas Devlieghere ) 38954c496daSRoman Podoliaka 390d8d252feSAdrian Vogelsgesang def test_frame_recognizer_disable(self): 391d8d252feSAdrian Vogelsgesang self.build() 392d8d252feSAdrian Vogelsgesang exe = self.getBuildArtifact("a.out") 393d8d252feSAdrian Vogelsgesang target, process, thread, _ = lldbutil.run_to_name_breakpoint( 394d8d252feSAdrian Vogelsgesang self, "foo", exe_name=exe 395d8d252feSAdrian Vogelsgesang ) 396d8d252feSAdrian Vogelsgesang 397d8d252feSAdrian Vogelsgesang # Clear internal & plugins recognizers that get initialized at launch. 398d8d252feSAdrian Vogelsgesang self.runCmd("frame recognizer clear") 399d8d252feSAdrian Vogelsgesang 400d8d252feSAdrian Vogelsgesang self.runCmd( 401d8d252feSAdrian Vogelsgesang "command script import " 402d8d252feSAdrian Vogelsgesang + os.path.join(self.getSourceDir(), "recognizer.py") 403d8d252feSAdrian Vogelsgesang ) 404d8d252feSAdrian Vogelsgesang 405d8d252feSAdrian Vogelsgesang # Add a frame recognizer in that target. 406d8d252feSAdrian Vogelsgesang self.runCmd( 407d8d252feSAdrian Vogelsgesang "frame recognizer add -l recognizer.MyFrameRecognizer -s a.out -n foo -n bar" 408d8d252feSAdrian Vogelsgesang ) 409d8d252feSAdrian Vogelsgesang 410d8d252feSAdrian Vogelsgesang # The frame is recognized 411d8d252feSAdrian Vogelsgesang self.expect( 412d8d252feSAdrian Vogelsgesang "frame recognizer info 0", 413d8d252feSAdrian Vogelsgesang substrs=["frame 0 is recognized by recognizer.MyFrameRecognizer"], 414d8d252feSAdrian Vogelsgesang ) 415d8d252feSAdrian Vogelsgesang 416d8d252feSAdrian Vogelsgesang # Disable the recognizer 417d8d252feSAdrian Vogelsgesang self.runCmd("frame recognizer disable 0") 418d8d252feSAdrian Vogelsgesang 419d8d252feSAdrian Vogelsgesang self.expect( 420d8d252feSAdrian Vogelsgesang "frame recognizer list", 421d8d252feSAdrian Vogelsgesang substrs=[ 422d8d252feSAdrian Vogelsgesang "0: [disabled] recognizer.MyFrameRecognizer, module a.out, demangled symbol foo" 423d8d252feSAdrian Vogelsgesang ], 424d8d252feSAdrian Vogelsgesang ) 425d8d252feSAdrian Vogelsgesang 426d8d252feSAdrian Vogelsgesang self.expect( 427d8d252feSAdrian Vogelsgesang "frame recognizer info 0", 428d8d252feSAdrian Vogelsgesang substrs=["frame 0 not recognized by any recognizer"], 429d8d252feSAdrian Vogelsgesang ) 430d8d252feSAdrian Vogelsgesang 431d8d252feSAdrian Vogelsgesang # Re-enable the recognizer 432d8d252feSAdrian Vogelsgesang self.runCmd("frame recognizer enable 0") 433d8d252feSAdrian Vogelsgesang 434d8d252feSAdrian Vogelsgesang self.expect( 435d8d252feSAdrian Vogelsgesang "frame recognizer list", 436d8d252feSAdrian Vogelsgesang substrs=[ 437d8d252feSAdrian Vogelsgesang "0: recognizer.MyFrameRecognizer, module a.out, demangled symbol foo" 438d8d252feSAdrian Vogelsgesang ], 439d8d252feSAdrian Vogelsgesang ) 440d8d252feSAdrian Vogelsgesang 441d8d252feSAdrian Vogelsgesang self.expect( 442d8d252feSAdrian Vogelsgesang "frame recognizer info 0", 443d8d252feSAdrian Vogelsgesang substrs=["frame 0 is recognized by recognizer.MyFrameRecognizer"], 444d8d252feSAdrian Vogelsgesang ) 445d8d252feSAdrian Vogelsgesang 4469010cef2SRaphael Isemann @no_debug_info_test 4479010cef2SRaphael Isemann def test_frame_recognizer_delete_invalid_arg(self): 4482238dcc3SJonas Devlieghere self.expect( 4492238dcc3SJonas Devlieghere "frame recognizer delete a", 4502238dcc3SJonas Devlieghere error=True, 4512238dcc3SJonas Devlieghere substrs=["error: 'a' is not a valid recognizer id."], 4522238dcc3SJonas Devlieghere ) 4532238dcc3SJonas Devlieghere self.expect( 4542238dcc3SJonas Devlieghere 'frame recognizer delete ""', 4552238dcc3SJonas Devlieghere error=True, 4562238dcc3SJonas Devlieghere substrs=["error: '' is not a valid recognizer id."], 4572238dcc3SJonas Devlieghere ) 4582238dcc3SJonas Devlieghere self.expect( 4592238dcc3SJonas Devlieghere "frame recognizer delete -1", 4602238dcc3SJonas Devlieghere error=True, 4612238dcc3SJonas Devlieghere substrs=["error: '-1' is not a valid recognizer id."], 4622238dcc3SJonas Devlieghere ) 4632238dcc3SJonas Devlieghere self.expect( 4642238dcc3SJonas Devlieghere "frame recognizer delete 4294967297", 4652238dcc3SJonas Devlieghere error=True, 4662238dcc3SJonas Devlieghere substrs=["error: '4294967297' is not a valid recognizer id."], 4672238dcc3SJonas Devlieghere ) 4689010cef2SRaphael Isemann 4699010cef2SRaphael Isemann @no_debug_info_test 4709010cef2SRaphael Isemann def test_frame_recognizer_info_invalid_arg(self): 4712238dcc3SJonas Devlieghere self.expect( 4722238dcc3SJonas Devlieghere "frame recognizer info a", 4732238dcc3SJonas Devlieghere error=True, 4742238dcc3SJonas Devlieghere substrs=["error: 'a' is not a valid frame index."], 4752238dcc3SJonas Devlieghere ) 4762238dcc3SJonas Devlieghere self.expect( 4772238dcc3SJonas Devlieghere 'frame recognizer info ""', 4782238dcc3SJonas Devlieghere error=True, 4792238dcc3SJonas Devlieghere substrs=["error: '' is not a valid frame index."], 4802238dcc3SJonas Devlieghere ) 4812238dcc3SJonas Devlieghere self.expect( 4822238dcc3SJonas Devlieghere "frame recognizer info -1", 4832238dcc3SJonas Devlieghere error=True, 4842238dcc3SJonas Devlieghere substrs=["error: '-1' is not a valid frame index."], 4852238dcc3SJonas Devlieghere ) 4862238dcc3SJonas Devlieghere self.expect( 4872238dcc3SJonas Devlieghere "frame recognizer info 4294967297", 4882238dcc3SJonas Devlieghere error=True, 4892238dcc3SJonas Devlieghere substrs=["error: '4294967297' is not a valid frame index."], 4902238dcc3SJonas Devlieghere ) 49154c496daSRoman Podoliaka 49254c496daSRoman Podoliaka @no_debug_info_test 49354c496daSRoman Podoliaka def test_frame_recognizer_add_invalid_arg(self): 4942238dcc3SJonas Devlieghere self.expect( 4952238dcc3SJonas Devlieghere "frame recognizer add -f", 4962238dcc3SJonas Devlieghere error=True, 4972238dcc3SJonas Devlieghere substrs=["error: last option requires an argument"], 4982238dcc3SJonas Devlieghere ) 4992238dcc3SJonas Devlieghere self.expect( 5002238dcc3SJonas Devlieghere "frame recognizer add -f -1", 5012238dcc3SJonas Devlieghere error=True, 5022238dcc3SJonas Devlieghere substrs=["error: invalid boolean value '-1' passed for -f option"], 5032238dcc3SJonas Devlieghere ) 5042238dcc3SJonas Devlieghere self.expect( 5052238dcc3SJonas Devlieghere "frame recognizer add -f foo", 5062238dcc3SJonas Devlieghere error=True, 5072238dcc3SJonas Devlieghere substrs=["error: invalid boolean value 'foo' passed for -f option"], 5082238dcc3SJonas Devlieghere ) 509