"""Test that the expedited thread pc values are not re-fetched by lldb."""
import subprocess
import lldb
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
from lldbsuite.test import lldbutil
file_index = 0
class TestExpeditedThreadPCs(TestBase):
NO_DEBUG_INFO_TESTCASE = True
@skipUnlessDarwin
def test_expedited_thread_pcs(self):
TestBase.setUp(self)
global file_index
++file_index
logfile = os.path.join(
self.getBuildDir(),
"packet-log-" + self.getArchitecture() + "-" + str(file_index) + ".txt",
)
self.runCmd("log enable -f %s gdb-remote packets" % (logfile))
def cleanup():
self.runCmd("log disable gdb-remote packets")
if os.path.exists(logfile):
os.unlink(logfile)
self.addTearDownHook(cleanup)
self.source = "main.cpp"
self.build()
(target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint(
self, "break here", lldb.SBFileSpec(self.source, False)
)
# verify that libfoo.dylib hasn't loaded yet
for m in target.modules:
self.assertNotEqual(m.GetFileSpec().GetFilename(), "libfoo.dylib")
thread.StepInto()
thread.StepInto()
thread.StepInto()
thread.StepInto()
thread.StepInto()
# verify that libfoo.dylib has loaded
for m in target.modules:
if m.GetFileSpec().GetFilename() == "libfoo.dylib":
found_libfoo = True
self.assertTrue(found_libfoo)
thread.StepInto()
thread.StepInto()
thread.StepOver()
thread.StepOver()
thread.StepOver()
thread.StepOver()
thread.StepOver()
thread.StepOver()
thread.StepOver()
thread.StepOver()
thread.StepOver()
thread.StepOver()
process.Kill()
# Confirm that we never fetched the pc for any threads during
# this debug session.
if os.path.exists(logfile):
f = open(logfile)
lines = f.readlines()
num_errors = 0
for line in lines:
arch = self.getArchitecture()
if arch == "arm64" or arch == "arm64_32":
# <reg name="pc" regnum="32" offset="256" bitsize="64" group="general" group_id="1" ehframe_regnum="32" dwarf_regnum="32" generic="pc"/>
# A fetch of $pc on arm64 looks like
# < 22> send packet: $p20;thread:91698e;#70
self.assertNotIn("$p20;thread", line)
else:
# <reg name="rip" regnum="16" offset="128" bitsize="64" group="general" altname="pc" group_id="1" ehframe_regnum="16" dwarf_regnum="16" generic="pc"/>
# A fetch of $pc on x86_64 looks like
# < 22> send packet: $p10;thread:91889c;#6f
self.assertNotIn("$p10;thread", line)
f.close()