mirror of
https://github.com/python/cpython.git
synced 2026-05-05 01:51:01 +00:00
42 lines
1.5 KiB
Python
42 lines
1.5 KiB
Python
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)
|