199451b44SJordan Rupprecht# Test the SBAPI for GetStatistics() 299451b44SJordan Rupprecht 399451b44SJordan Rupprechtimport json 499451b44SJordan Rupprechtimport lldb 599451b44SJordan Rupprechtfrom lldbsuite.test.decorators import * 699451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import * 799451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil 899451b44SJordan Rupprecht 999451b44SJordan Rupprecht 1099451b44SJordan Rupprechtclass TestStatsAPI(TestBase): 11d7b33853SGreg Clayton NO_DEBUG_INFO_TESTCASE = True 12d7b33853SGreg Clayton 1399451b44SJordan Rupprecht def test_stats_api(self): 1476706090Sjeffreytan81 """ 1576706090Sjeffreytan81 Test SBTarget::GetStatistics() API. 1676706090Sjeffreytan81 """ 1799451b44SJordan Rupprecht self.build() 1899451b44SJordan Rupprecht exe = self.getBuildArtifact("a.out") 192217837cSWanyi # Launch a process and break 202217837cSWanyi (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint( 212217837cSWanyi self, "break here", lldb.SBFileSpec("main.c") 222217837cSWanyi ) 2399451b44SJordan Rupprecht 2499451b44SJordan Rupprecht # Test enabling/disabling stats 2599451b44SJordan Rupprecht self.assertFalse(target.GetCollectingStats()) 2699451b44SJordan Rupprecht target.SetCollectingStats(True) 2799451b44SJordan Rupprecht self.assertTrue(target.GetCollectingStats()) 2899451b44SJordan Rupprecht target.SetCollectingStats(False) 2999451b44SJordan Rupprecht self.assertFalse(target.GetCollectingStats()) 3099451b44SJordan Rupprecht 3199451b44SJordan Rupprecht # Test the function to get the statistics in JSON'ish. 3299451b44SJordan Rupprecht stats = target.GetStatistics() 3399451b44SJordan Rupprecht stream = lldb.SBStream() 3499451b44SJordan Rupprecht res = stats.GetAsJSON(stream) 35c571988eSGreg Clayton debug_stats = json.loads(stream.GetData()) 361eeeab82SJordan Rupprecht self.assertIn( 371eeeab82SJordan Rupprecht "targets", 381eeeab82SJordan Rupprecht debug_stats, 392238dcc3SJonas Devlieghere 'Make sure the "targets" key in in target.GetStatistics()', 402238dcc3SJonas Devlieghere ) 411eeeab82SJordan Rupprecht self.assertIn( 421eeeab82SJordan Rupprecht "modules", 431eeeab82SJordan Rupprecht debug_stats, 442238dcc3SJonas Devlieghere 'Make sure the "modules" key in in target.GetStatistics()', 452238dcc3SJonas Devlieghere ) 462238dcc3SJonas Devlieghere stats_json = debug_stats["targets"][0] 471eeeab82SJordan Rupprecht self.assertIn( 481eeeab82SJordan Rupprecht "expressionEvaluation", 491eeeab82SJordan Rupprecht stats_json, 502238dcc3SJonas Devlieghere 'Make sure the "expressionEvaluation" key in in target.GetStatistics()["targets"][0]', 512238dcc3SJonas Devlieghere ) 521eeeab82SJordan Rupprecht self.assertIn( 531eeeab82SJordan Rupprecht "frameVariable", 541eeeab82SJordan Rupprecht stats_json, 552238dcc3SJonas Devlieghere 'Make sure the "frameVariable" key in in target.GetStatistics()["targets"][0]', 562238dcc3SJonas Devlieghere ) 572238dcc3SJonas Devlieghere expressionEvaluation = stats_json["expressionEvaluation"] 581eeeab82SJordan Rupprecht self.assertIn( 591eeeab82SJordan Rupprecht "successes", 601eeeab82SJordan Rupprecht expressionEvaluation, 612238dcc3SJonas Devlieghere 'Make sure the "successes" key in in "expressionEvaluation" dictionary"', 622238dcc3SJonas Devlieghere ) 631eeeab82SJordan Rupprecht self.assertIn( 641eeeab82SJordan Rupprecht "failures", 651eeeab82SJordan Rupprecht expressionEvaluation, 662238dcc3SJonas Devlieghere 'Make sure the "failures" key in in "expressionEvaluation" dictionary"', 672238dcc3SJonas Devlieghere ) 682238dcc3SJonas Devlieghere frameVariable = stats_json["frameVariable"] 691eeeab82SJordan Rupprecht self.assertIn( 701eeeab82SJordan Rupprecht "successes", 711eeeab82SJordan Rupprecht frameVariable, 722238dcc3SJonas Devlieghere 'Make sure the "successes" key in in "frameVariable" dictionary"', 732238dcc3SJonas Devlieghere ) 741eeeab82SJordan Rupprecht self.assertIn( 751eeeab82SJordan Rupprecht "failures", 761eeeab82SJordan Rupprecht frameVariable, 772238dcc3SJonas Devlieghere 'Make sure the "failures" key in in "frameVariable" dictionary"', 782238dcc3SJonas Devlieghere ) 7976706090Sjeffreytan81 802217837cSWanyi # Test statistics summary. 812217837cSWanyi stats_options = lldb.SBStatisticsOptions() 822217837cSWanyi stats_options.SetSummaryOnly(True) 832217837cSWanyi stats_summary = target.GetStatistics(stats_options) 842217837cSWanyi stream_summary = lldb.SBStream() 852217837cSWanyi stats_summary.GetAsJSON(stream_summary) 862217837cSWanyi debug_stats_summary = json.loads(stream_summary.GetData()) 872217837cSWanyi self.assertNotIn("modules", debug_stats_summary) 882217837cSWanyi self.assertNotIn("commands", debug_stats_summary) 892217837cSWanyi 902217837cSWanyi # Summary values should be the same as in full statistics. 91*ba7f52ccSAlex Langford # The exceptions to this are: 92*ba7f52ccSAlex Langford # - The parse time on Mac OS X is not deterministic. 93*ba7f52ccSAlex Langford # - Memory usage may grow over time due to the use of ConstString. 942217837cSWanyi for key, value in debug_stats_summary.items(): 952217837cSWanyi self.assertIn(key, debug_stats) 96*ba7f52ccSAlex Langford if key != "memory" and key != "targets" and not key.endswith("Time"): 972217837cSWanyi self.assertEqual(debug_stats[key], value) 982217837cSWanyi 9976706090Sjeffreytan81 def test_command_stats_api(self): 10076706090Sjeffreytan81 """ 10176706090Sjeffreytan81 Test GetCommandInterpreter::GetStatistics() API. 10276706090Sjeffreytan81 """ 10376706090Sjeffreytan81 self.build() 10476706090Sjeffreytan81 exe = self.getBuildArtifact("a.out") 10576706090Sjeffreytan81 lldbutil.run_to_name_breakpoint(self, "main") 10676706090Sjeffreytan81 10776706090Sjeffreytan81 interp = self.dbg.GetCommandInterpreter() 10876706090Sjeffreytan81 result = lldb.SBCommandReturnObject() 10976706090Sjeffreytan81 interp.HandleCommand("bt", result) 11076706090Sjeffreytan81 11176706090Sjeffreytan81 stream = lldb.SBStream() 11276706090Sjeffreytan81 res = interp.GetStatistics().GetAsJSON(stream) 11376706090Sjeffreytan81 command_stats = json.loads(stream.GetData()) 11476706090Sjeffreytan81 11576706090Sjeffreytan81 # Verify bt command is correctly parsed into final form. 11676706090Sjeffreytan81 self.assertEqual(command_stats["thread backtrace"], 1) 11776706090Sjeffreytan81 # Verify original raw command is not duplicatedly captured. 11876706090Sjeffreytan81 self.assertNotIn("bt", command_stats) 11976706090Sjeffreytan81 # Verify bt's regex command is not duplicatedly captured. 12076706090Sjeffreytan81 self.assertNotIn("_regexp-bt", command_stats) 121dd7386d8SWanyi 122dd7386d8SWanyi @add_test_categories(["dwo"]) 123dd7386d8SWanyi def test_command_stats_force(self): 124dd7386d8SWanyi """ 125dd7386d8SWanyi Test reporting all pssible debug info stats by force loading all debug 126dd7386d8SWanyi info. For example, dwo files 127dd7386d8SWanyi """ 128dd7386d8SWanyi src_dir = self.getSourceDir() 129dd7386d8SWanyi dwo_yaml_path = os.path.join(src_dir, "main-main.dwo.yaml") 130dd7386d8SWanyi exe_yaml_path = os.path.join(src_dir, "main.yaml") 131dd7386d8SWanyi dwo_path = self.getBuildArtifact("main-main.dwo") 132dd7386d8SWanyi exe_path = self.getBuildArtifact("main") 133dd7386d8SWanyi self.yaml2obj(dwo_yaml_path, dwo_path) 134dd7386d8SWanyi self.yaml2obj(exe_yaml_path, exe_path) 135dd7386d8SWanyi 136dd7386d8SWanyi # Turn on symbols on-demand loading 137dd7386d8SWanyi self.runCmd("settings set symbols.load-on-demand true") 138dd7386d8SWanyi 139dd7386d8SWanyi # We need the current working directory to be set to the build directory 140dd7386d8SWanyi os.chdir(self.getBuildDir()) 141dd7386d8SWanyi # Create a target with the object file we just created from YAML 142dd7386d8SWanyi target = self.dbg.CreateTarget(exe_path) 143dd7386d8SWanyi self.assertTrue(target, VALID_TARGET) 144dd7386d8SWanyi 145dd7386d8SWanyi # Get statistics 146dd7386d8SWanyi stats_options = lldb.SBStatisticsOptions() 147dd7386d8SWanyi stats = target.GetStatistics(stats_options) 148dd7386d8SWanyi stream = lldb.SBStream() 149dd7386d8SWanyi stats.GetAsJSON(stream) 150dd7386d8SWanyi debug_stats = json.loads(stream.GetData()) 151dd7386d8SWanyi self.assertEqual(debug_stats["totalDebugInfoByteSize"], 193) 152dd7386d8SWanyi 153dd7386d8SWanyi # Get statistics with force loading 154dd7386d8SWanyi stats_options.SetReportAllAvailableDebugInfo(True) 155dd7386d8SWanyi stats_force = target.GetStatistics(stats_options) 156dd7386d8SWanyi stream_force = lldb.SBStream() 157dd7386d8SWanyi stats_force.GetAsJSON(stream_force) 158dd7386d8SWanyi debug_stats_force = json.loads(stream_force.GetData()) 159dd7386d8SWanyi self.assertEqual(debug_stats_force["totalDebugInfoByteSize"], 445) 160