TestThreadLocal.py
2.78 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
from lldbsuite.test import decorators
import lldb
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
from lldbsuite.test import lldbutil
from lldbsuite.test import lldbtest
class PlatformProcessCrashInfoTestCase(TestBase):
mydir = TestBase.compute_mydir(__file__)
@expectedFailureAll(oslist=["windows", "linux", "netbsd"])
def test_thread_local(self):
# Set a breakpoint on the first instruction of the main function,
# before the TLS initialization has run.
self.build()
exe = self.getBuildArtifact("a.out")
(target, process, _, _) = \
lldbutil.run_to_source_breakpoint(self, "Set breakpoint here",
lldb.SBFileSpec("main.cpp"))
self.expect_expr("tl_local_int + 1",
result_type="int", result_value="323")
self.expect_expr("*tl_local_ptr + 2",
result_type="int", result_value="324")
self.expect_expr("tl_global_int",
result_type="int", result_value="123")
self.expect_expr("*tl_global_ptr",
result_type="int", result_value="45")
# Create the filespec by which to locate our a.out module.
#
# - Use the absolute path to get the module for the current variant.
# - Use the relative path for reproducers. The modules are never
# orphaned because the SB objects are leaked intentionally. This
# causes LLDB to reuse the same module for every variant, because the
# UUID is the same for all the inferiors. FindModule below only
# compares paths and is oblivious to the fact that the UUIDs are the
# same.
if configuration.is_reproducer():
filespec = lldb.SBFileSpec('a.out', False)
else:
filespec = lldb.SBFileSpec(exe, False)
# Now see if we emit the correct error when the TLS is not yet
# initialized. Let's set a breakpoint on the first instruction
# of main.
main_module = target.FindModule(filespec)
self.assertTrue(main_module, VALID_MODULE)
main_address = main_module.FindSymbol("main").GetStartAddress()
main_bkpt = target.BreakpointCreateBySBAddress(main_address)
process.Kill()
lldbutil.run_to_breakpoint_do_run(self, target, main_bkpt)
self.expect("expr tl_local_int", error=True,
substrs=["couldn't get the value of variable tl_local_int",
"No TLS data currently exists for this thread"])
self.expect("expr *tl_local_ptr", error=True,
substrs=["couldn't get the value of variable tl_local_ptr",
"No TLS data currently exists for this thread"])