| import os | |
| import sys | |
| import sysconfig | |
| import unittest | |
| try: | |
| from _testinternalcapi import perf_map_state_teardown, write_perf_map_entry | |
| except ImportError: | |
| raise unittest.SkipTest("requires _testinternalcapi") | |
| def supports_trampoline_profiling(): | |
| perf_trampoline = sysconfig.get_config_var("PY_HAVE_PERF_TRAMPOLINE") | |
| if not perf_trampoline: | |
| return False | |
| return int(perf_trampoline) == 1 | |
| if not supports_trampoline_profiling(): | |
| raise unittest.SkipTest("perf trampoline profiling not supported") | |
| class TestPerfMapWriting(unittest.TestCase): | |
| def tearDown(self): | |
| perf_map_state_teardown() | |
| def test_write_perf_map_entry(self): | |
| self.assertEqual(write_perf_map_entry(0x1234, 5678, "entry1"), 0) | |
| self.assertEqual(write_perf_map_entry(0x2345, 6789, "entry2"), 0) | |
| with open(f"/tmp/perf-{os.getpid()}.map") as f: | |
| perf_file_contents = f.read() | |
| self.assertIn("1234 162e entry1", perf_file_contents) | |
| self.assertIn("2345 1a85 entry2", perf_file_contents) | |
| @unittest.skipIf(sys.maxsize <= 2**32, "requires size_t wider than unsigned int") | |
| def test_write_perf_map_entry_large_size(self): | |
| code_addr = 0x3456 | |
| code_size = 1 << 33 | |
| entry_name = "entry_big" | |
| self.assertEqual(write_perf_map_entry(code_addr, code_size, entry_name), 0) | |
| with open(f"/tmp/perf-{os.getpid()}.map") as f: | |
| perf_file_contents = f.read() | |
| self.assertIn(f"{code_addr:x} {code_size:x} {entry_name}", | |
| perf_file_contents) |