import lldb from intelpt_testcase import * from lldbsuite.test.lldbtest import * from lldbsuite.test import lldbutil from lldbsuite.test.decorators import * class TestTraceSave(TraceIntelPTTestCaseBase): mydir = TestBase.compute_mydir(__file__) def testErrorMessages(self): # We first check the output when there are no targets self.expect("process trace save", substrs=["error: invalid target, create a target using the 'target create' command"], error=True) # We now check the output when there's a non-running target self.expect("target create " + os.path.join(self.getSourceDir(), "intelpt-trace", "a.out")) self.expect("process trace save", substrs=["error: invalid process"], error=True) # Now we check the output when there's a running target without a trace self.expect("b main") self.expect("run") self.expect("process trace save", substrs=["error: Process is not being traced"], error=True) def testSaveToInvalidDir(self): self.expect("target create " + os.path.join(self.getSourceDir(), "intelpt-trace", "a.out")) self.expect("b main") self.expect("r") self.expect("thread trace start") self.expect("n") # Check the output when saving without providing the directory argument self.expect("process trace save -d", substrs=["error: last option requires an argument"], error=True) # Check the output when saving to an invalid directory self.expect("process trace save -d /", substrs=["error: couldn't write to the file"], error=True) def testSaveWhenNotLiveTrace(self): self.expect("trace load -v " + os.path.join(self.getSourceDir(), "intelpt-trace", "trace.json"), substrs=["intel-pt"]) # Check the output when not doing live tracing self.expect("process trace save -d " + os.path.join(self.getBuildDir(), "intelpt-trace", "trace_not_live_dir"), substrs=["error: Saving a trace requires a live process."], error=True) def testSaveTrace(self): self.expect("target create " + os.path.join(self.getSourceDir(), "intelpt-trace", "a.out")) self.expect("b main") self.expect("r") self.expect("thread trace start") self.expect("b 7") ci = self.dbg.GetCommandInterpreter() res = lldb.SBCommandReturnObject() ci.HandleCommand("thread trace dump instructions -c 10 --forwards", res) self.assertEqual(res.Succeeded(), True) first_ten_instructions = res.GetOutput() ci.HandleCommand("thread trace dump instructions -c 10", res) self.assertEqual(res.Succeeded(), True) last_ten_instructions = res.GetOutput() # Now, save the trace to self.expect("process trace save -d " + os.path.join(self.getBuildDir(), "intelpt-trace", "trace_copy_dir")) # Load the trace just saved self.expect("trace load -v " + os.path.join(self.getBuildDir(), "intelpt-trace", "trace_copy_dir", "trace.json"), substrs=["intel-pt"]) # Compare with instructions saved at the first time ci.HandleCommand("thread trace dump instructions -c 10 --forwards", res) self.assertEqual(res.Succeeded(), True) self.assertEqual(res.GetOutput(), first_ten_instructions) ci.HandleCommand("thread trace dump instructions -c 10", res) self.assertEqual(res.Succeeded(), True) self.assertEqual(res.GetOutput(), last_ten_instructions)