Storing timestamps (TSCs) in a more efficient map at the decoded thread level to speed up TSC lookup, as well as reduce the amount of memory used by each decoded instruction. Also introduced TSC range which keeps the current timestamp valid for all subsequent instructions until the next timestamp is emitted. Differential Revision: https://reviews.llvm.org/D122603
103 lines
3.8 KiB
Python
103 lines
3.8 KiB
Python
import lldb
|
|
from intelpt_testcase import *
|
|
from lldbsuite.test.lldbtest import *
|
|
from lldbsuite.test import lldbutil
|
|
from lldbsuite.test.decorators import *
|
|
|
|
class TestTraceLoad(TraceIntelPTTestCaseBase):
|
|
|
|
mydir = TestBase.compute_mydir(__file__)
|
|
NO_DEBUG_INFO_TESTCASE = True
|
|
|
|
def testLoadTrace(self):
|
|
src_dir = self.getSourceDir()
|
|
trace_definition_file = os.path.join(src_dir, "intelpt-trace", "trace.json")
|
|
self.expect("trace load -v " + trace_definition_file, substrs=["intel-pt"])
|
|
|
|
target = self.dbg.GetSelectedTarget()
|
|
process = target.GetProcess()
|
|
self.assertEqual(process.GetProcessID(), 1234)
|
|
|
|
self.assertEqual(process.GetNumThreads(), 1)
|
|
self.assertEqual(process.GetThreadAtIndex(0).GetThreadID(), 3842849)
|
|
|
|
self.assertEqual(target.GetNumModules(), 1)
|
|
module = target.GetModuleAtIndex(0)
|
|
path = module.GetFileSpec()
|
|
self.assertEqual(path.fullpath, os.path.join(src_dir, "intelpt-trace", "a.out"))
|
|
self.assertGreater(module.GetNumSections(), 0)
|
|
self.assertEqual(module.GetSectionAtIndex(0).GetFileAddress(), 0x400000)
|
|
|
|
self.assertEqual("6AA9A4E2-6F28-2F33-377D-59FECE874C71-5B41261A", module.GetUUIDString())
|
|
|
|
# check that the Process and Thread objects were created correctly
|
|
self.expect("thread info", substrs=["tid = 3842849"])
|
|
self.expect("thread list", substrs=["Process 1234 stopped", "tid = 3842849"])
|
|
self.expect("thread trace dump info", substrs=['''Trace technology: intel-pt
|
|
|
|
thread #1: tid = 3842849
|
|
Raw trace size: 4 KiB
|
|
Total number of instructions: 21
|
|
Total approximate memory usage: 0.98 KiB
|
|
Average memory usage per instruction: 48.00 bytes'''])
|
|
|
|
def testLoadInvalidTraces(self):
|
|
src_dir = self.getSourceDir()
|
|
# We test first an invalid type
|
|
self.expect("trace load -v " + os.path.join(src_dir, "intelpt-trace", "trace_bad.json"), error=True,
|
|
substrs=['''error: expected object at traceSession.processes[0]
|
|
|
|
Context:
|
|
{
|
|
"processes": [
|
|
/* error: expected object */
|
|
123
|
|
],
|
|
"trace": { ... }
|
|
}
|
|
|
|
Schema:
|
|
{
|
|
"trace": {
|
|
"type": "intel-pt",
|
|
"cpuInfo": {
|
|
"vendor": "intel" | "unknown",
|
|
"family": integer,
|
|
"model": integer,
|
|
"stepping": integer
|
|
}
|
|
},'''])
|
|
|
|
# Now we test a missing field in the global session file
|
|
self.expect("trace load -v " + os.path.join(src_dir, "intelpt-trace", "trace_bad2.json"), error=True,
|
|
substrs=['error: missing value at traceSession.processes[1].triple', "Context", "Schema"])
|
|
|
|
# Now we test a missing field in the intel-pt settings
|
|
self.expect("trace load -v " + os.path.join(src_dir, "intelpt-trace", "trace_bad4.json"), error=True,
|
|
substrs=['''error: missing value at traceSession.trace.cpuInfo.family
|
|
|
|
Context:
|
|
{
|
|
"processes": [],
|
|
"trace": {
|
|
"cpuInfo": /* error: missing value */ {
|
|
"model": 79,
|
|
"stepping": 1,
|
|
"vendor": "intel"
|
|
},
|
|
"type": "intel-pt"
|
|
}
|
|
}''', "Schema"])
|
|
|
|
# Now we test an incorrect load address in the intel-pt settings
|
|
self.expect("trace load -v " + os.path.join(src_dir, "intelpt-trace", "trace_bad5.json"), error=True,
|
|
substrs=['error: expected numeric string at traceSession.processes[0].modules[0].loadAddress',
|
|
'"loadAddress": /* error: expected numeric string */ 400000,', "Schema"])
|
|
|
|
# The following wrong schema will have a valid target and an invalid one. In the case of failure,
|
|
# no targets should be created.
|
|
self.assertEqual(self.dbg.GetNumTargets(), 0)
|
|
self.expect("trace load -v " + os.path.join(src_dir, "intelpt-trace", "trace_bad3.json"), error=True,
|
|
substrs=['error: missing value at traceSession.processes[1].pid'])
|
|
self.assertEqual(self.dbg.GetNumTargets(), 0)
|