[lldb-dap] Support inspecting memory (#104317) · llvm/llvm-project@3acb1ea (original) (raw)
``
1
`+
"""
`
``
2
`+
Test lldb-dap memory support
`
``
3
`+
"""
`
``
4
+
``
5
`+
from base64 import b64decode
`
``
6
`+
import dap_server
`
``
7
`+
from lldbsuite.test.decorators import *
`
``
8
`+
from lldbsuite.test.lldbtest import *
`
``
9
`+
from lldbsuite.test import lldbutil
`
``
10
`+
import lldbdap_testcase
`
``
11
`+
import os
`
``
12
+
``
13
+
``
14
`+
class TestDAP_memory(lldbdap_testcase.DAPTestCaseBase):
`
``
15
`+
def test_memory_refs_variables(self):
`
``
16
`+
"""
`
``
17
`+
Tests memory references for evaluate
`
``
18
`+
"""
`
``
19
`+
program = self.getBuildArtifact("a.out")
`
``
20
`+
self.build_and_launch(program)
`
``
21
`+
source = "main.cpp"
`
``
22
`+
self.source_path = os.path.join(os.getcwd(), source)
`
``
23
`+
self.set_source_breakpoints(
`
``
24
`+
source,
`
``
25
`+
[line_number(source, "// Breakpoint")],
`
``
26
`+
)
`
``
27
`+
self.continue_to_next_stop()
`
``
28
+
``
29
`+
locals = {l["name"]: l for l in self.dap_server.get_local_variables()}
`
``
30
+
``
31
`+
Pointers should have memory-references
`
``
32
`+
self.assertIn("memoryReference", locals["rawptr"].keys())
`
``
33
`+
Non-pointers should also have memory-references
`
``
34
`+
self.assertIn("memoryReference", locals["not_a_ptr"].keys())
`
``
35
+
``
36
`+
def test_memory_refs_evaluate(self):
`
``
37
`+
"""
`
``
38
`+
Tests memory references for evaluate
`
``
39
`+
"""
`
``
40
`+
program = self.getBuildArtifact("a.out")
`
``
41
`+
self.build_and_launch(program)
`
``
42
`+
source = "main.cpp"
`
``
43
`+
self.source_path = os.path.join(os.getcwd(), source)
`
``
44
`+
self.set_source_breakpoints(
`
``
45
`+
source,
`
``
46
`+
[line_number(source, "// Breakpoint")],
`
``
47
`+
)
`
``
48
`+
self.continue_to_next_stop()
`
``
49
+
``
50
`+
self.assertIn(
`
``
51
`+
"memoryReference",
`
``
52
`+
self.dap_server.request_evaluate("rawptr")["body"].keys(),
`
``
53
`+
)
`
``
54
+
``
55
`+
def test_memory_refs_set_variable(self):
`
``
56
`+
"""
`
``
57
`` +
Tests memory references for setVariable
``
``
58
`+
"""
`
``
59
`+
program = self.getBuildArtifact("a.out")
`
``
60
`+
self.build_and_launch(program)
`
``
61
`+
source = "main.cpp"
`
``
62
`+
self.source_path = os.path.join(os.getcwd(), source)
`
``
63
`+
self.set_source_breakpoints(
`
``
64
`+
source,
`
``
65
`+
[line_number(source, "// Breakpoint")],
`
``
66
`+
)
`
``
67
`+
self.continue_to_next_stop()
`
``
68
+
``
69
`+
ptr_value = self.get_local_as_int("rawptr")
`
``
70
`+
self.assertIn(
`
``
71
`+
"memoryReference",
`
``
72
`+
self.dap_server.request_setVariable(1, "rawptr", ptr_value + 2)[
`
``
73
`+
"body"
`
``
74
`+
].keys(),
`
``
75
`+
)
`
``
76
+
``
77
`+
def test_readMemory(self):
`
``
78
`+
"""
`
``
79
`+
Tests the 'readMemory' request
`
``
80
`+
"""
`
``
81
`+
program = self.getBuildArtifact("a.out")
`
``
82
`+
self.build_and_launch(program)
`
``
83
`+
source = "main.cpp"
`
``
84
`+
self.source_path = os.path.join(os.getcwd(), source)
`
``
85
`+
self.set_source_breakpoints(
`
``
86
`+
source,
`
``
87
`+
[line_number(source, "// Breakpoint")],
`
``
88
`+
)
`
``
89
`+
self.continue_to_next_stop()
`
``
90
+
``
91
`+
ptr_deref = self.dap_server.request_evaluate("*rawptr")["body"]
`
``
92
`+
memref = ptr_deref["memoryReference"]
`
``
93
+
``
94
`+
We can read the complete string
`
``
95
`+
mem = self.dap_server.request_readMemory(memref, 0, 5)["body"]
`
``
96
`+
self.assertEqual(mem["unreadableBytes"], 0)
`
``
97
`+
self.assertEqual(b64decode(mem["data"]), b"dead\0")
`
``
98
+
``
99
`+
Use an offset
`
``
100
`+
mem = self.dap_server.request_readMemory(memref, 2, 3)["body"]
`
``
101
`+
self.assertEqual(b64decode(mem["data"]), b"ad\0")
`
``
102
+
``
103
`+
Use a negative offset
`
``
104
`+
mem = self.dap_server.request_readMemory(memref, -1, 6)["body"]
`
``
105
`+
self.assertEqual(b64decode(mem["data"])[1:], b"dead\0")
`
``
106
+
``
107
`+
Reads of size 0 are successful
`
``
108
`` +
VS-Code sends those in order to check if a memoryReference
can actually be dereferenced.
``
``
109
`+
mem = self.dap_server.request_readMemory(memref, 0, 0)
`
``
110
`+
self.assertEqual(mem["success"], True)
`
``
111
`+
self.assertEqual(mem["body"]["data"], "")
`
``
112
+
``
113
`+
Reads at offset 0x0 fail
`
``
114
`+
mem = self.dap_server.request_readMemory("0x0", 0, 6)
`
``
115
`+
self.assertEqual(mem["success"], False)
`
``
116
`+
self.assertEqual(mem["message"], "Memory region is not readable")
`