wallace created this revision. Herald added a project: All. wallace requested review of this revision. Herald added a project: LLDB. Herald added a subscriber: lldb-commits.
The existing tests that check for the memory usage of the decoded trace are using small binaries, and in this case the memory usage is dominated by the static size of the structures. In order to check the dynamic cost of the trace, I'm creating a new test that runs a program that is compiled at test time and then the total number of instructions and memory usage is asserted. This serves as an example of a test that doesn't require to check in a prebuilt binary, which is costly for git. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D123984 Files: lldb/test/API/commands/trace/memory-usage/Makefile lldb/test/API/commands/trace/memory-usage/TestTraceMemoryUsage.py lldb/test/API/commands/trace/memory-usage/main.cpp Index: lldb/test/API/commands/trace/memory-usage/main.cpp =================================================================== --- /dev/null +++ lldb/test/API/commands/trace/memory-usage/main.cpp @@ -0,0 +1,6 @@ +int main() { + int x = 0; + for (int i = 0; i < 1000000; i++) + x += i * i; + return x; +} Index: lldb/test/API/commands/trace/memory-usage/TestTraceMemoryUsage.py =================================================================== --- /dev/null +++ lldb/test/API/commands/trace/memory-usage/TestTraceMemoryUsage.py @@ -0,0 +1,41 @@ +import lldb +from intelpt_testcase import * +from lldbsuite.test.lldbtest import * +from lldbsuite.test import lldbutil +from lldbsuite.test.decorators import * +import re + +class TestTraceMemoryUsage(TraceIntelPTTestCaseBase): + mydir = TestBase.compute_mydir(__file__) + + @skipIf(oslist=no_match(['linux']), archs=no_match(['i386', 'x86_64'])) + def testDumpBigTraceSize(self): + ''' + The purpose of this test is to ensure that the memory footprint + of a decoded trace is small. + ''' + self.build() + self.expect("file " + self.getBuildArtifact("a.out")) + self.expect("b main") + self.expect("r") + self.expect("thread trace start -s 0x100000") # 1 MB of trace + self.expect("b 5") + self.expect("c") + self.runCmd("thread trace dump info") + m = re.search( + 'Average memory usage per instruction \(excluding raw trace\): (.*) bytes', + self.res.GetOutput()) + avg_byte_per_insn = float(m.group(1)) + # As the program being run is compiled every time it runs, the total number + # of instructions and events might slightly change. Besides that, the number of + # events might change (e.g. different number of context switches), so we can't + # look for an exact byte size. Therefore we expect the avg byte usage per + #instruction to be 13 +- an error. + self.assertLess(abs(avg_byte_per_insn - 13), 0.1) + + # Similarly, we expect the number of instructions to be 10000000 +- an error. + m = re.search( + 'Total number of instructions: (.*)', + self.res.GetOutput()) + insn_count = int(m.group(1)) + self.assertLess(abs(insn_count - 10000000), 100000) Index: lldb/test/API/commands/trace/memory-usage/Makefile =================================================================== --- /dev/null +++ lldb/test/API/commands/trace/memory-usage/Makefile @@ -0,0 +1,3 @@ +CXX_SOURCES := main.cpp + +include Makefile.rules
Index: lldb/test/API/commands/trace/memory-usage/main.cpp =================================================================== --- /dev/null +++ lldb/test/API/commands/trace/memory-usage/main.cpp @@ -0,0 +1,6 @@ +int main() { + int x = 0; + for (int i = 0; i < 1000000; i++) + x += i * i; + return x; +} Index: lldb/test/API/commands/trace/memory-usage/TestTraceMemoryUsage.py =================================================================== --- /dev/null +++ lldb/test/API/commands/trace/memory-usage/TestTraceMemoryUsage.py @@ -0,0 +1,41 @@ +import lldb +from intelpt_testcase import * +from lldbsuite.test.lldbtest import * +from lldbsuite.test import lldbutil +from lldbsuite.test.decorators import * +import re + +class TestTraceMemoryUsage(TraceIntelPTTestCaseBase): + mydir = TestBase.compute_mydir(__file__) + + @skipIf(oslist=no_match(['linux']), archs=no_match(['i386', 'x86_64'])) + def testDumpBigTraceSize(self): + ''' + The purpose of this test is to ensure that the memory footprint + of a decoded trace is small. + ''' + self.build() + self.expect("file " + self.getBuildArtifact("a.out")) + self.expect("b main") + self.expect("r") + self.expect("thread trace start -s 0x100000") # 1 MB of trace + self.expect("b 5") + self.expect("c") + self.runCmd("thread trace dump info") + m = re.search( + 'Average memory usage per instruction \(excluding raw trace\): (.*) bytes', + self.res.GetOutput()) + avg_byte_per_insn = float(m.group(1)) + # As the program being run is compiled every time it runs, the total number + # of instructions and events might slightly change. Besides that, the number of + # events might change (e.g. different number of context switches), so we can't + # look for an exact byte size. Therefore we expect the avg byte usage per + #instruction to be 13 +- an error. + self.assertLess(abs(avg_byte_per_insn - 13), 0.1) + + # Similarly, we expect the number of instructions to be 10000000 +- an error. + m = re.search( + 'Total number of instructions: (.*)', + self.res.GetOutput()) + insn_count = int(m.group(1)) + self.assertLess(abs(insn_count - 10000000), 100000) Index: lldb/test/API/commands/trace/memory-usage/Makefile =================================================================== --- /dev/null +++ lldb/test/API/commands/trace/memory-usage/Makefile @@ -0,0 +1,3 @@ +CXX_SOURCES := main.cpp + +include Makefile.rules
_______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits