[Lldb-commits] [lldb] [lldb-dap] IO Handling refactor to support raw input mode. (PR #180858)
John Harrison via lldb-commits
lldb-commits at lists.llvm.org
Wed Mar 4 10:58:49 PST 2026
https://github.com/ashgti updated https://github.com/llvm/llvm-project/pull/180858
>From 6dfc8ce0259efe88d7fd2fa3c4705690247d0deb Mon Sep 17 00:00:00 2001
From: John Harrison <harjohn at google.com>
Date: Thu, 29 Jan 2026 16:22:19 -0800
Subject: [PATCH 01/12] [lldb-dap] IO Handling refactor to support raw input
mode.
Updating lldb-dap to use a pty (when supported) for the debugger input/output handles. This enables us to support raw-input mode commands like `script` or `breakpoint command add`.
As a fallback on platforms that don't support a pty we use a pipe, which also works but has some usability issues. With a pipe, we do NOT see the prompt and some commands do not show us any helpful information, e.g. `breakpoint command add` does NOT tell you to use `DONE` to end the command. The command does work, just not as helpful as with a pty.
With a pty we see the prompt in the console output and it often shows up in the command output as well.
---
lldb/packages/Python/lldbsuite/test/dotest.py | 11 +-
.../test/tools/lldb-dap/dap_server.py | 40 +-
.../test/tools/lldb-dap/lldbdap_testcase.py | 4 +-
.../Interpreter/embedded_interpreter.py | 3 +
.../tools/lldb-dap/cancel/TestDAP_cancel.py | 41 +-
.../API/tools/lldb-dap/cancel/busy_loop.py | 17 +
.../completions/TestDAP_completions.py | 3 +-
.../tools/lldb-dap/console/TestDAP_console.py | 4 +
.../lldb-dap/evaluate/TestDAP_evaluate.py | 10 +-
.../lldb-dap/launch/TestDAP_launch_version.py | 7 +-
.../lldb-dap/progress/TestDAP_Progress.py | 5 +-
.../repl-mode/TestDAP_repl_mode_detection.py | 13 +-
.../lldb-dap/send-event/TestDAP_sendEvent.py | 3 +-
.../lldb-dap/variables/TestDAP_variables.py | 8 +-
lldb/tools/lldb-dap/CMakeLists.txt | 1 +
lldb/tools/lldb-dap/DAP.cpp | 245 +++++--
lldb/tools/lldb-dap/DAP.h | 47 +-
lldb/tools/lldb-dap/EvaluateContext.cpp | 127 ++++
lldb/tools/lldb-dap/EvaluateContext.h | 48 ++
lldb/tools/lldb-dap/EventHelper.cpp | 9 +-
.../Handler/CompletionsRequestHandler.cpp | 1 +
.../ConfigurationDoneRequestHandler.cpp | 3 +
.../Handler/EvaluateRequestHandler.cpp | 109 ++-
.../lldb-dap/Handler/ScopesRequestHandler.cpp | 3 +-
.../Handler/SetVariableRequestHandler.cpp | 2 +-
.../Handler/VariablesRequestHandler.cpp | 1 -
lldb/tools/lldb-dap/ProgressEvent.cpp | 2 +-
.../lldb-dap/Protocol/ProtocolRequests.cpp | 4 +-
.../lldb-dap/Protocol/ProtocolRequests.h | 4 +-
lldb/tools/lldb-dap/Variables.cpp | 632 ++++++++++--------
lldb/tools/lldb-dap/Variables.h | 85 +--
lldb/unittests/DAP/Handler/DisconnectTest.cpp | 11 +-
lldb/unittests/DAP/TestBase.cpp | 23 +-
lldb/unittests/DAP/TestBase.h | 1 -
34 files changed, 983 insertions(+), 544 deletions(-)
create mode 100644 lldb/test/API/tools/lldb-dap/cancel/busy_loop.py
create mode 100644 lldb/tools/lldb-dap/EvaluateContext.cpp
create mode 100644 lldb/tools/lldb-dap/EvaluateContext.h
diff --git a/lldb/packages/Python/lldbsuite/test/dotest.py b/lldb/packages/Python/lldbsuite/test/dotest.py
index 533be0a065e3a..f357db9d58f14 100644
--- a/lldb/packages/Python/lldbsuite/test/dotest.py
+++ b/lldb/packages/Python/lldbsuite/test/dotest.py
@@ -569,11 +569,12 @@ def setupSysPath():
lldbDir = os.path.dirname(lldbtest_config.lldbExec)
- lldbDAPExec = os.path.join(
- lldbDir, "lldb-dap.exe" if sys.platform == "win32" else "lldb-dap"
- )
- if is_exe(lldbDAPExec):
- os.environ["LLDBDAP_EXEC"] = lldbDAPExec
+ if not os.environ.get("LLDBDAP_EXEC", None):
+ lldbDAPExec = os.path.join(
+ lldbDir, "lldb-dap.exe" if sys.platform == "win32" else "lldb-dap"
+ )
+ if is_exe(lldbDAPExec):
+ os.environ["LLDBDAP_EXEC"] = lldbDAPExec
configuration.yaml2macho_core = shutil.which("yaml2macho-core", path=lldbDir)
diff --git a/lldb/packages/Python/lldbsuite/test/tools/lldb-dap/dap_server.py b/lldb/packages/Python/lldbsuite/test/tools/lldb-dap/dap_server.py
index e8fd8e8e37e65..8084bfd594f0f 100644
--- a/lldb/packages/Python/lldbsuite/test/tools/lldb-dap/dap_server.py
+++ b/lldb/packages/Python/lldbsuite/test/tools/lldb-dap/dap_server.py
@@ -254,7 +254,7 @@ def __init__(
self.threads: Optional[dict] = None
self.stopped_thread: Optional[dict] = None
self.thread_stacks: Optional[Dict[int, List[dict]]]
- self.thread_stop_reasons: Dict[str, Any] = {}
+ self.thread_stop_reasons: Dict[int, Any] = {}
self.focused_tid: Optional[int] = None
self.frame_scopes: Dict[str, Any] = {}
# keyed by breakpoint id
@@ -441,9 +441,10 @@ def _process_recv_packets(self) -> None:
with self._recv_condition:
for packet in self._recv_packets:
if packet and ("seq" not in packet or packet["seq"] == 0):
- raise ValueError(
- f"received a malformed packet, expected 'seq != 0' for {packet!r}"
- )
+ pass
+ # raise ValueError(
+ # f"received a malformed packet, expected 'seq != 0' for {packet!r}"
+ # )
if packet:
self._log.messages.append((Log.Dir.RECV, packet))
# Handle events that may modify any stateful properties of
@@ -495,10 +496,13 @@ def _handle_event(self, packet: Event) -> None:
# reasons since the 'threads' command doesn't return
# that information.
self._process_stopped()
- tid = body["threadId"]
- self.thread_stop_reasons[tid] = body
- if "preserveFocusHint" not in body or not body["preserveFocusHint"]:
- self.focused_tid = tid
+ if "allThreadsStopped" in body and body["allThreadsStopped"]:
+ self.thread_stop_reasons = {}
+ if "threadId" in body:
+ tid = body["threadId"]
+ self.thread_stop_reasons[tid] = body
+ if "preserveFocusHint" not in body or not body["preserveFocusHint"]:
+ self.focused_tid = tid
elif event.startswith("progress"):
# Progress events come in as 'progressStart', 'progressUpdate',
# and 'progressEnd' events. Keep these around in case test
@@ -614,11 +618,13 @@ def predicate(p: ProtocolMessage):
return cast(Response, self._recv_packet(predicate=predicate))
- def wait_for_event(self, filter: List[str]) -> Event:
+ def wait_for_event(
+ self, filter: List[str], pred: Callable[[Event], bool] = lambda _: True
+ ) -> Event:
"""Wait for the first event that matches the filter."""
def predicate(p: ProtocolMessage):
- return p["type"] == "event" and p["event"] in filter
+ return p["type"] == "event" and p["event"] in filter and pred(p)
return cast(Event, self._recv_packet(predicate=predicate))
@@ -657,6 +663,18 @@ def ensure_initialized(self) -> None:
), "configuration done has already been sent, 'initialized' should have already occurred"
self.wait_for_initialized()
+ def collect_progress(self, title: str) -> List[Event]:
+ start_event = self.wait_for_event(
+ ["progressStart"], lambda event: event["body"]["title"] == title
+ )
+ progress_id = start_event["body"]["progressId"]
+ self.wait_for_event(
+ ["progressEnd"], lambda event: event["body"]["progressId"] == progress_id
+ )
+ return [
+ e for e in self.progress_events if e["body"]["progressId"] == progress_id
+ ]
+
def wait_for_stopped(self) -> List[Event]:
"""Wait for the next 'stopped' event to occur, coalescing all stopped events within a given quiet period."""
return self.collect_events(["stopped", "exited"])
@@ -1125,6 +1143,8 @@ def request_evaluate(
args_dict["frameId"] = stackFrame["id"]
if context:
+ if context == "repl" and not self.configuration_done_sent:
+ raise ValueError("configurtionDone must be called to activate the repl")
args_dict["context"] = context
if is_hex is not None:
args_dict["format"] = {"hex": is_hex}
diff --git a/lldb/packages/Python/lldbsuite/test/tools/lldb-dap/lldbdap_testcase.py b/lldb/packages/Python/lldbsuite/test/tools/lldb-dap/lldbdap_testcase.py
index 14a5698653588..8edda1f5a7bd3 100644
--- a/lldb/packages/Python/lldbsuite/test/tools/lldb-dap/lldbdap_testcase.py
+++ b/lldb/packages/Python/lldbsuite/test/tools/lldb-dap/lldbdap_testcase.py
@@ -241,11 +241,13 @@ def verify_stop_exception_info(
def verify_stop_on_entry(self) -> None:
"""Waits for the process to be stopped and then verifies at least one
thread has the stop reason 'entry'."""
+ if not self.dap_server.configuration_done_sent:
+ self.verify_configuration_done()
self.dap_server.wait_for_stopped()
self.assertIn(
"entry",
(t["reason"] for t in self.dap_server.thread_stop_reasons.values()),
- "Expected at least one thread to report stop reason 'entry' in {self.dap_server.thread_stop_reasons}",
+ f"Expected at least one thread to report stop reason 'entry' in {self.dap_server.thread_stop_reasons}",
)
def verify_commands(self, flavor: str, output: str, commands: List[str]):
diff --git a/lldb/source/Interpreter/embedded_interpreter.py b/lldb/source/Interpreter/embedded_interpreter.py
index 12c47bd712816..b8d0cfeccd94e 100644
--- a/lldb/source/Interpreter/embedded_interpreter.py
+++ b/lldb/source/Interpreter/embedded_interpreter.py
@@ -49,6 +49,8 @@ def readfunc(prompt):
def readfunc_stdio(prompt):
+ # Flush stdout and stderr to ensure consistency.
+ sys.stderr.flush()
sys.stdout.write(prompt)
sys.stdout.flush()
line = sys.stdin.readline()
@@ -77,6 +79,7 @@ def run_python_interpreter(local_dict):
if e.code:
print("Script exited with code %s" % e.code)
+
def run_one_line(local_dict, input_string):
global g_run_one_line_str
try:
diff --git a/lldb/test/API/tools/lldb-dap/cancel/TestDAP_cancel.py b/lldb/test/API/tools/lldb-dap/cancel/TestDAP_cancel.py
index 14789a6694686..8429941ad574f 100644
--- a/lldb/test/API/tools/lldb-dap/cancel/TestDAP_cancel.py
+++ b/lldb/test/API/tools/lldb-dap/cancel/TestDAP_cancel.py
@@ -2,10 +2,8 @@
Test lldb-dap cancel request
"""
+import os
import time
-
-from lldbsuite.test.decorators import *
-from lldbsuite.test.lldbtest import *
import lldbdap_testcase
@@ -13,25 +11,21 @@ class TestDAP_cancel(lldbdap_testcase.DAPTestCaseBase):
def send_async_req(self, command: str, arguments: dict = {}) -> int:
return self.dap_server.send_packet(
{
+ "seq": 0,
"type": "request",
"command": command,
"arguments": arguments,
}
)
- def async_blocking_request(self, duration: float) -> int:
+ def async_blocking_request(self, count: int) -> int:
"""
- Sends an evaluate request that will sleep for the specified duration to
+ Sends an evaluate request that will sleep for the specified count to
block the request handling thread.
"""
return self.send_async_req(
command="evaluate",
- arguments={
- "expression": '`script import time; print("starting sleep", file=lldb.debugger.GetOutputFileHandle()); time.sleep({})'.format(
- duration
- ),
- "context": "repl",
- },
+ arguments={"expression": f"`busy-loop {count}", "context": "repl"},
)
def async_cancel(self, requestId: int) -> int:
@@ -42,14 +36,20 @@ def test_pending_request(self):
Tests cancelling a pending request.
"""
program = self.getBuildArtifact("a.out")
- self.build_and_launch(program)
+ busy_loop = os.path.join(os.path.dirname(__file__), "busy_loop.py")
+ self.build_and_launch(
+ program,
+ initCommands=[f"command script import {busy_loop}"],
+ stopOnEntry=True,
+ )
+ self.verify_stop_on_entry()
# Use a relatively short timeout since this is only to ensure the
# following request is queued.
- blocking_seq = self.async_blocking_request(duration=self.DEFAULT_TIMEOUT / 10)
+ blocking_seq = self.async_blocking_request(count=1)
# Use a longer timeout to ensure we catch if the request was interrupted
# properly.
- pending_seq = self.async_blocking_request(duration=self.DEFAULT_TIMEOUT / 2)
+ pending_seq = self.async_blocking_request(count=10)
cancel_seq = self.async_cancel(requestId=pending_seq)
blocking_resp = self.dap_server.receive_response(blocking_seq)
@@ -74,11 +74,18 @@ def test_inflight_request(self):
Tests cancelling an inflight request.
"""
program = self.getBuildArtifact("a.out")
- self.build_and_launch(program)
+ busy_loop = os.path.join(os.path.dirname(__file__), "busy_loop.py")
+ self.build_and_launch(
+ program,
+ initCommands=[f"command script import {busy_loop}"],
+ stopOnEntry=True,
+ )
+ self.verify_configuration_done()
+ self.verify_stop_on_entry()
- blocking_seq = self.async_blocking_request(duration=self.DEFAULT_TIMEOUT / 2)
+ blocking_seq = self.async_blocking_request(count=10)
# Wait for the sleep to start to cancel the inflight request.
- self.collect_console(pattern="starting sleep")
+ time.sleep(0.5)
cancel_seq = self.async_cancel(requestId=blocking_seq)
blocking_resp = self.dap_server.receive_response(blocking_seq)
diff --git a/lldb/test/API/tools/lldb-dap/cancel/busy_loop.py b/lldb/test/API/tools/lldb-dap/cancel/busy_loop.py
new file mode 100644
index 0000000000000..21108d7e32e45
--- /dev/null
+++ b/lldb/test/API/tools/lldb-dap/cancel/busy_loop.py
@@ -0,0 +1,17 @@
+import time
+import lldb
+
+
+ at lldb.command(command_name="busy-loop")
+def busy_loop(debugger, command, exe_ctx, result, internal_dict):
+ """Test helper as a busy loop."""
+ if not command:
+ command = "10"
+ count = int(command)
+ print("Starting loop...", count)
+ for i in range(count):
+ if debugger.InterruptRequested():
+ print("interrupt requested, stopping loop", i)
+ break
+ print("No interrupted requested, sleeping", i)
+ time.sleep(1)
diff --git a/lldb/test/API/tools/lldb-dap/completions/TestDAP_completions.py b/lldb/test/API/tools/lldb-dap/completions/TestDAP_completions.py
index dd5fdcc4bbad4..db7d04829f046 100644
--- a/lldb/test/API/tools/lldb-dap/completions/TestDAP_completions.py
+++ b/lldb/test/API/tools/lldb-dap/completions/TestDAP_completions.py
@@ -377,14 +377,13 @@ def test_auto_completions(self):
Tests completion requests in "repl-mode=auto"
"""
self.setup_debuggee()
+ self.continue_to_next_stop()
res = self.dap_server.request_evaluate(
"`lldb-dap repl-mode auto", context="repl"
)
self.assertTrue(res["success"])
- self.continue_to_next_stop()
-
# Stopped at breakpoint 1
# 'var' variable is in scope, completions should not show any warning.
self.dap_server.get_completions("var ")
diff --git a/lldb/test/API/tools/lldb-dap/console/TestDAP_console.py b/lldb/test/API/tools/lldb-dap/console/TestDAP_console.py
index ceddaeb50cd3b..cd0a8e715de42 100644
--- a/lldb/test/API/tools/lldb-dap/console/TestDAP_console.py
+++ b/lldb/test/API/tools/lldb-dap/console/TestDAP_console.py
@@ -164,8 +164,12 @@ def test_exit_status_message_ok(self):
)
def test_diagnositcs(self):
+ source = "main.cpp"
program = self.getBuildArtifact("a.out")
self.build_and_launch(program)
+ breakpoint1_line = line_number(source, "// breakpoint 1")
+ breakpoint_ids = self.set_source_breakpoints(source, [breakpoint1_line])
+ self.continue_to_breakpoints(breakpoint_ids)
core = self.getBuildArtifact("minidump.core")
self.yaml2obj("minidump.yaml", core)
diff --git a/lldb/test/API/tools/lldb-dap/evaluate/TestDAP_evaluate.py b/lldb/test/API/tools/lldb-dap/evaluate/TestDAP_evaluate.py
index 556168e5adfa8..3d706fffba390 100644
--- a/lldb/test/API/tools/lldb-dap/evaluate/TestDAP_evaluate.py
+++ b/lldb/test/API/tools/lldb-dap/evaluate/TestDAP_evaluate.py
@@ -138,11 +138,12 @@ def run_test_evaluate_expressions(
self.assertEvaluate("var1", "20", want_type="int")
# Empty expression should equate to the previous expression.
if context == "repl":
- self.assertEvaluate("", "20")
+ self.assertEvaluate("", r"\(lldb\) ", want_memref=False)
else:
self.assertEvaluateFailure("")
self.assertEvaluate("var2", "21", want_type="int")
if context == "repl":
+ self.assertEvaluate("e var2", "21", want_memref=False)
self.assertEvaluate("", "21", want_type="int")
self.assertEvaluate("", "21", want_type="int")
self.assertEvaluate("static_int", "0x0000002a", want_type="int", is_hex=True)
@@ -210,15 +211,14 @@ def run_test_evaluate_expressions(
"struct3", "0x.*0", want_varref=True, want_type="my_struct *"
)
- if context == "repl" or context is None:
- # In repl or unknown context expressions may be interpreted as lldb
- # commands since no variables have the same name as the command.
+ if context == "repl":
+ # In repl context expressions may be interpreted as lldb commands
+ # since no variables have the same name as the command.
self.assertEvaluate("list", r".*", want_memref=False)
# Changing the frame index should not make a difference
self.assertEvaluate(
"version", r".*lldb.+", want_memref=False, frame_index=1
)
-
else:
self.assertEvaluateFailure("list") # local variable of a_function
diff --git a/lldb/test/API/tools/lldb-dap/launch/TestDAP_launch_version.py b/lldb/test/API/tools/lldb-dap/launch/TestDAP_launch_version.py
index fca153044da82..fb14ca717dbf3 100644
--- a/lldb/test/API/tools/lldb-dap/launch/TestDAP_launch_version.py
+++ b/lldb/test/API/tools/lldb-dap/launch/TestDAP_launch_version.py
@@ -27,7 +27,12 @@ def test(self):
version_eval_response = self.dap_server.request_evaluate(
"`version", context="repl"
)
- version_eval_output = version_eval_response["body"]["result"]
+ version_eval_output = (
+ version_eval_response["body"]["result"]
+ .removeprefix("(lldb) ")
+ .removesuffix("(lldb) ")
+ )
+ # Strip the prompt which may show up in the repl output.
version_string = self.dap_server.get_capability("$__lldb_version")
self.assertEqual(
diff --git a/lldb/test/API/tools/lldb-dap/progress/TestDAP_Progress.py b/lldb/test/API/tools/lldb-dap/progress/TestDAP_Progress.py
index 3f57dfb66024d..7a1b6608c1e43 100755
--- a/lldb/test/API/tools/lldb-dap/progress/TestDAP_Progress.py
+++ b/lldb/test/API/tools/lldb-dap/progress/TestDAP_Progress.py
@@ -21,12 +21,10 @@ def verify_progress_events(
expected_not_in_message=None,
only_verify_first_update=False,
):
- self.dap_server.wait_for_event(["progressEnd"])
- self.assertTrue(len(self.dap_server.progress_events) > 0)
start_found = False
update_found = False
end_found = False
- for event in self.dap_server.progress_events:
+ for event in self.dap_server.collect_progress(expected_title):
event_type = event["event"]
if "progressStart" in event_type:
title = event["body"]["title"]
@@ -55,6 +53,7 @@ def verify_progress_events(
def test(self):
program = self.getBuildArtifact("a.out")
self.build_and_launch(program, stopOnEntry=True)
+ self.verify_stop_on_entry()
progress_emitter = os.path.join(os.getcwd(), "Progress_emitter.py")
self.dap_server.request_evaluate(
f"`command script import {progress_emitter}", context="repl"
diff --git a/lldb/test/API/tools/lldb-dap/repl-mode/TestDAP_repl_mode_detection.py b/lldb/test/API/tools/lldb-dap/repl-mode/TestDAP_repl_mode_detection.py
index c6f59949d668e..d2d99b6457b77 100644
--- a/lldb/test/API/tools/lldb-dap/repl-mode/TestDAP_repl_mode_detection.py
+++ b/lldb/test/API/tools/lldb-dap/repl-mode/TestDAP_repl_mode_detection.py
@@ -3,8 +3,6 @@
"""
import lldbdap_testcase
-import dap_server
-from lldbsuite.test import lldbutil
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
@@ -20,20 +18,23 @@ def assertEvaluate(self, expression, regex):
def test_completions(self):
program = self.getBuildArtifact("a.out")
- self.build_and_launch(program)
+ self.build_and_launch(program, stopOnEntry=True)
source = "main.cpp"
breakpoint1_line = line_number(source, "// breakpoint 1")
breakpoint2_line = line_number(source, "// breakpoint 2")
self.set_source_breakpoints(source, [breakpoint1_line, breakpoint2_line])
+ self.verify_stop_on_entry()
# The result of the commands should return the empty string.
- self.assertEvaluate("`command regex user_command s/^$/platform/", r"^$")
- self.assertEvaluate("`command alias alias_command platform", r"^$")
+ self.assertEvaluate(
+ "`command regex user_command s/^$/platform/", r"^\(lldb\) $"
+ )
+ self.assertEvaluate("`command alias alias_command platform", r"^\(lldb\) $")
self.assertEvaluate(
"`command alias alias_command_with_arg platform select --sysroot %1 remote-linux",
- r"^$",
+ r"^\(lldb\) $",
)
self.continue_to_next_stop()
diff --git a/lldb/test/API/tools/lldb-dap/send-event/TestDAP_sendEvent.py b/lldb/test/API/tools/lldb-dap/send-event/TestDAP_sendEvent.py
index a01845669666f..ae211b36f7c0d 100644
--- a/lldb/test/API/tools/lldb-dap/send-event/TestDAP_sendEvent.py
+++ b/lldb/test/API/tools/lldb-dap/send-event/TestDAP_sendEvent.py
@@ -61,7 +61,8 @@ def test_send_internal_event(self):
resp = self.dap_server.request_evaluate(
"`lldb-dap send-event stopped", context="repl"
)
+ self.assertFalse(resp["success"], f"Expected error response in {resp}")
self.assertRegex(
- resp["body"]["result"],
+ resp["body"]["error"]["format"],
r"Invalid use of lldb-dap send-event, event \"stopped\" should be handled by lldb-dap internally.",
)
diff --git a/lldb/test/API/tools/lldb-dap/variables/TestDAP_variables.py b/lldb/test/API/tools/lldb-dap/variables/TestDAP_variables.py
index 7abcec56a7880..4b777dedb0f8d 100644
--- a/lldb/test/API/tools/lldb-dap/variables/TestDAP_variables.py
+++ b/lldb/test/API/tools/lldb-dap/variables/TestDAP_variables.py
@@ -146,8 +146,7 @@ def darwin_dwarf_missing_obj(self, initCommands):
},
},
}
- varref_dict = {}
- self.verify_variables(verify_locals, locals, varref_dict)
+ self.verify_variables(verify_locals, locals)
def do_test_scopes_variables_setVariable_evaluate(
self, enableAutoVariableSummaries: bool
@@ -622,8 +621,9 @@ def do_test_scopes_and_evaluate_expansion(self, enableAutoVariableSummaries: boo
var_ref = permanent_expandable_ref
response = self.dap_server.request_variables(var_ref)
- self.verify_variables(
- expandable_expression["children"], response["body"]["variables"]
+ self.assertFalse(
+ response["success"],
+ f"variable reference should be out of scope in {response}",
)
# Test that frame scopes have corresponding presentation hints.
diff --git a/lldb/tools/lldb-dap/CMakeLists.txt b/lldb/tools/lldb-dap/CMakeLists.txt
index 1bb7a2e498b9b..4c2218904a0c8 100644
--- a/lldb/tools/lldb-dap/CMakeLists.txt
+++ b/lldb/tools/lldb-dap/CMakeLists.txt
@@ -11,6 +11,7 @@ add_lldb_library(lldbDAP
DAPError.cpp
DAPLog.cpp
DAPSessionManager.cpp
+ EvaluateContext.cpp
EventHelper.cpp
ExceptionBreakpoint.cpp
FifoFiles.cpp
diff --git a/lldb/tools/lldb-dap/DAP.cpp b/lldb/tools/lldb-dap/DAP.cpp
index 8986d740d31aa..12d155ce7497b 100644
--- a/lldb/tools/lldb-dap/DAP.cpp
+++ b/lldb/tools/lldb-dap/DAP.cpp
@@ -17,7 +17,6 @@
#include "LLDBUtils.h"
#include "OutputRedirector.h"
#include "Protocol/ProtocolBase.h"
-#include "Protocol/ProtocolEvents.h"
#include "Protocol/ProtocolRequests.h"
#include "Protocol/ProtocolTypes.h"
#include "ProtocolUtils.h"
@@ -25,15 +24,17 @@
#include "Variables.h"
#include "lldb/API/SBBreakpoint.h"
#include "lldb/API/SBCommandInterpreter.h"
+#include "lldb/API/SBCommandInterpreterRunOptions.h"
#include "lldb/API/SBEvent.h"
#include "lldb/API/SBLanguageRuntime.h"
#include "lldb/API/SBListener.h"
#include "lldb/API/SBMutex.h"
#include "lldb/API/SBProcess.h"
-#include "lldb/API/SBStream.h"
-#include "lldb/Host/JSONTransport.h"
+#include "lldb/Host/File.h"
#include "lldb/Host/MainLoop.h"
#include "lldb/Host/MainLoopBase.h"
+#include "lldb/Host/Pipe.h"
+#include "lldb/Host/PseudoTerminal.h"
#include "lldb/Utility/Status.h"
#include "lldb/lldb-defines.h"
#include "lldb/lldb-enumerations.h"
@@ -57,12 +58,13 @@
#include <cstdint>
#include <cstdio>
#include <functional>
-#include <future>
#include <memory>
#include <mutex>
#include <optional>
#include <string>
+#include <sys/fcntl.h>
#include <thread>
+#include <tuple>
#include <utility>
#include <variant>
@@ -79,14 +81,6 @@ using namespace lldb_dap;
using namespace lldb_dap::protocol;
using namespace lldb_private;
-namespace {
-#ifdef _WIN32
-const char DEV_NULL[] = "nul";
-#else
-const char DEV_NULL[] = "/dev/null";
-#endif
-} // namespace
-
namespace lldb_dap {
static std::string GetStringFromStructuredData(lldb::SBStructuredData &data,
@@ -231,17 +225,92 @@ ExceptionBreakpoint *DAP::GetExceptionBreakpoint(const lldb::break_id_t bp_id) {
return nullptr;
}
+llvm::Expected<std::pair<IOWrapper, IOWrapper>>
+IOWrapper::CreatePseudoTerminal() {
+ // For testing purposes return an error to cause us to fallback to a pair of
+ // pipes.
+ if (getenv("LLDB_DAP_FORCE_REPL_PIPE"))
+ return llvm::createStringError("forced repl pipe");
+
+ lldb_private::PseudoTerminal pty;
+ if (auto err = pty.OpenFirstAvailablePrimary(O_RDWR | O_NOCTTY | O_CLOEXEC))
+ return err;
+ if (auto err = pty.OpenSecondary(O_RDWR | O_NOCTTY | O_CLOEXEC))
+ return err;
+
+ lldb_private::Terminal term(pty.GetPrimaryFileDescriptor());
+ if (llvm::Error err = term.SetCanonical(false))
+ return err;
+ if (llvm::Error err = term.SetRaw())
+ return err;
+
+ int primary_fd = pty.ReleasePrimaryFileDescriptor();
+ int replica_fd = pty.ReleaseSecondaryFileDescriptor();
+
+ return std::make_pair(
+ IOWrapper(
+ /*read=*/std::make_shared<lldb_private::NativeFile>(
+ primary_fd, lldb_private::File::eOpenOptionReadOnly, false),
+ /*write=*/std::make_shared<lldb_private::NativeFile>(
+ primary_fd, lldb_private::File::eOpenOptionWriteOnly, true)),
+ IOWrapper(
+ /*read=*/std::make_shared<lldb_private::NativeFile>(
+ replica_fd, lldb_private::File::eOpenOptionReadOnly, false),
+ /*write=*/std::make_shared<lldb_private::NativeFile>(
+ replica_fd, lldb_private::File::eOpenOptionWriteOnly, true)));
+}
+
+// Hookup a pair of pipes such that reading from one writes to the other.
+llvm::Expected<std::pair<IOWrapper, IOWrapper>> IOWrapper::CreatePipePair() {
+ lldb_private::Pipe primary_pipe, replica_pipe;
+ if (auto err = primary_pipe.CreateNew().takeError())
+ return err;
+ if (auto err = replica_pipe.CreateNew().takeError())
+ return err;
+
+ return std::make_pair(
+ IOWrapper(/*read=*/
+ std::make_shared<lldb_private::NativeFile>(
+ primary_pipe.ReleaseReadFileDescriptor(),
+ lldb_private::File::eOpenOptionReadOnly, false),
+ /*write=*/std::make_shared<lldb_private::NativeFile>(
+ replica_pipe.ReleaseWriteFileDescriptor(),
+ lldb_private::File::eOpenOptionWriteOnly, true)),
+ IOWrapper(/*read=*/
+ std::make_shared<lldb_private::NativeFile>(
+ replica_pipe.ReleaseReadFileDescriptor(),
+ lldb_private::File::eOpenOptionReadOnly, false),
+ /*write=*/std::make_shared<lldb_private::NativeFile>(
+ primary_pipe.ReleaseWriteFileDescriptor(),
+ lldb_private::File::eOpenOptionWriteOnly, true)));
+}
+
llvm::Error DAP::ConfigureIO(std::FILE *overrideOut, std::FILE *overrideErr) {
- in = lldb::SBFile(std::fopen(DEV_NULL, "r"), /*transfer_ownership=*/true);
+ DAP_LOG(log, "Initializing IO");
+
+ llvm::Expected<std::pair<IOWrapper, IOWrapper>> io =
+ IOWrapper::CreatePseudoTerminal();
+ if (!io) {
+ DAP_LOG_ERROR(
+ log, io.takeError(),
+ "Falling back to a pipe for debugger IO, creating a pty failed: {0}");
+ io = IOWrapper::CreatePipePair();
+ if (!io)
+ return io.takeError();
+ }
+
+ std::tie(primary, replica) = *io;
- if (auto Error = out.RedirectTo(overrideOut, [this](llvm::StringRef output) {
- SendOutput(OutputType::Console, output);
- }))
+ if (auto Error = stdout_redirect.RedirectTo(
+ overrideOut, [this](llvm::StringRef output) {
+ SendOutput(OutputType::Console, output);
+ }))
return Error;
- if (auto Error = err.RedirectTo(overrideErr, [this](llvm::StringRef output) {
- SendOutput(OutputType::Console, output);
- }))
+ if (auto Error = stderr_redirect.RedirectTo(
+ overrideErr, [this](llvm::StringRef output) {
+ SendOutput(OutputType::Console, output);
+ }))
return Error;
return llvm::Error::success();
@@ -581,6 +650,9 @@ lldb::SBFrame DAP::GetLLDBFrame(uint64_t frame_id) {
ReplMode DAP::DetectReplMode(lldb::SBFrame &frame, std::string &expression,
bool partial_expression) {
+ if (!debugger.GetCommandInterpreter().IsActive() || expression.empty())
+ return ReplMode::Command;
+
// Check for the escape hatch prefix.
if (llvm::StringRef expr_ref = expression;
expr_ref.consume_front(configuration.commandEscapePrefix)) {
@@ -591,6 +663,9 @@ ReplMode DAP::DetectReplMode(lldb::SBFrame &frame, std::string &expression,
if (repl_mode != ReplMode::Auto)
return repl_mode;
+ if (expression.empty() && (repl_mode != ReplMode::Variable))
+ return ReplMode::Command;
+
// We cannot check if expression is a variable without a frame.
if (!frame)
return ReplMode::Command;
@@ -926,6 +1001,7 @@ llvm::Error DAP::Disconnect(bool terminateDebuggee) {
}
SendTerminatedEvent();
+ debugger.Clear();
TerminateLoop();
return ToError(error);
}
@@ -938,7 +1014,7 @@ bool DAP::IsCancelled(const protocol::Request &req) {
void DAP::ClearCancelRequest(const CancelArguments &args) {
std::lock_guard<std::mutex> guard(m_cancelled_requests_mutex);
if (args.requestId)
- m_cancelled_requests.erase(*args.requestId);
+ m_cancelled_requests.erase(args.requestId);
}
template <typename T>
@@ -969,7 +1045,7 @@ void DAP::Received(const protocol::Request &request) {
{
std::lock_guard<std::mutex> guard(m_cancelled_requests_mutex);
if (cancel_args->requestId)
- m_cancelled_requests.insert(*cancel_args->requestId);
+ m_cancelled_requests.insert(cancel_args->requestId);
}
// If a cancel is requested for the active request, make a best
@@ -979,6 +1055,22 @@ void DAP::Received(const protocol::Request &request) {
DAP_LOG(log, "interrupting inflight request (command={0} seq={1})",
m_active_request->command, m_active_request->seq);
debugger.RequestInterrupt();
+ debugger.DispatchInputInterrupt();
+ debugger.GetCommandInterpreter().InterruptCommand();
+ }
+
+ // Making a best effort attempt at interrupting in-progress events.
+ if (!cancel_args->progressId.empty()) {
+ DAP_LOG(log, "cancel in progress event, interrupt debugger");
+ // FIXME: Which of these are actually required, they all have different
+ // behavior.
+ debugger.RequestInterrupt();
+ debugger.DispatchInputInterrupt();
+ debugger.GetCommandInterpreter().InterruptCommand();
+
+ std::lock_guard<std::mutex> guard(m_eval_mutex);
+ if (m_evaluate_context)
+ m_evaluate_context->Interrupt();
}
}
@@ -1033,6 +1125,40 @@ void DAP::TransportHandler() {
return;
}
+ Status status;
+ m_out_handle = m_loop.RegisterReadObject(
+ primary.read,
+ [this](auto &loop) {
+ std::array<char, OutputBufferSize> buf = {0};
+ size_t num_bytes = buf.size();
+ if (auto err = primary.read->Read(buf.data(), num_bytes).takeError()) {
+ DAP_LOG_ERROR(log, std::move(err), "read failed {0}");
+ return;
+ }
+
+ // EOF detected
+ if (num_bytes == 0) {
+ m_out_handle.reset();
+ return;
+ }
+
+ std::lock_guard<std::mutex> guard(m_eval_mutex);
+
+ if (m_evaluate_context &&
+ m_evaluate_context->HandleOutput({buf.data(), num_bytes}))
+ return;
+
+ SendOutput(OutputType::Console, {buf.data(), num_bytes});
+ },
+ status);
+
+ if (llvm::Error err = status.takeError()) {
+ DAP_LOG_ERROR(log, std::move(err), "registering pty failed: {0}");
+ std::lock_guard<std::mutex> guard(m_queue_mutex);
+ m_error_occurred = true;
+ return;
+ }
+
if (Status status = m_loop.Run(); status.Fail()) {
DAP_LOG_ERROR(log, status.takeError(), "MainLoop run failed: {0}");
std::lock_guard<std::mutex> guard(m_queue_mutex);
@@ -1041,6 +1167,17 @@ void DAP::TransportHandler() {
}
}
+void DAP::ActivateRepl() {
+ lldb::SBCommandInterpreterRunOptions options;
+ options.SetSpawnThread(true);
+ options.SetAutoHandleEvents(false);
+ options.SetEchoCommands(false);
+ options.SetEchoCommentCommands(false);
+ options.SetAllowRepeats(true);
+ options.SetAddToHistory(true);
+ debugger.RunCommandInterpreter(options);
+}
+
llvm::Error DAP::Loop() {
{
// Reset disconnect flag once we start the loop.
@@ -1052,8 +1189,8 @@ llvm::Error DAP::Loop() {
llvm::scope_exit cleanup([this]() {
// FIXME: Merge these into the MainLoop handler.
- out.Stop();
- err.Stop();
+ stdout_redirect.Stop();
+ stderr_redirect.Stop();
StopEventHandlers();
// Destroy the debugger when the session ends. This will trigger the
@@ -1224,6 +1361,7 @@ protocol::Capabilities DAP::GetCapabilities() {
protocol::eAdapterFeatureLogPoints,
protocol::eAdapterFeatureSteppingGranularity,
protocol::eAdapterFeatureValueFormattingOptions,
+ protocol::eAdapterFeatureSingleThreadExecutionRequests,
};
// Capabilities associated with specific requests.
@@ -1321,18 +1459,44 @@ llvm::Error DAP::InitializeDebugger() {
debugger = lldb::SBDebugger::Create(/*argument_name=*/false);
// Configure input/output/error file descriptors.
- debugger.SetInputFile(in);
+ debugger.SetInputFile(replica.read);
+ debugger.SetOutputFile(replica.write);
+ debugger.SetErrorFile(replica.write);
+
target = debugger.GetDummyTarget();
- llvm::Expected<int> out_fd = out.GetWriteFileDescriptor();
- if (!out_fd)
- return out_fd.takeError();
- debugger.SetOutputFile(lldb::SBFile(*out_fd, "w", false));
+ auto cmd = debugger.GetCommandInterpreter().AddMultiwordCommand(
+ "lldb-dap", "Commands for managing lldb-dap.");
+
+ if (clientFeatures.contains(eClientFeatureStartDebuggingRequest)) {
+ cmd.AddCommand(
+ "start-debugging", new StartDebuggingCommand(*this),
+ "Sends a startDebugging request from the debug adapter to the client "
+ "to start a child debug session of the same type as the caller.");
+ }
+
+ cmd.AddCommand(
+ "repl-mode", new ReplModeCommand(*this),
+ "Get or set the repl behavior of lldb-dap evaluation requests.");
+ cmd.AddCommand("send-event", new SendEventCommand(*this),
+ "Sends an DAP event to the client.");
+
+ StartEventThreads();
+
+ // Set the print callback to allow us to intercept command return objects from
+ // the repl to provide a more detailed view of the output.
+ debugger.GetCommandInterpreter().SetPrintCallback(
+ [](lldb::SBCommandReturnObject &result, void *baton) {
+ DAP *dap = static_cast<DAP *>(baton);
+ std::lock_guard<std::mutex> guard(dap->m_eval_mutex);
- llvm::Expected<int> err_fd = err.GetWriteFileDescriptor();
- if (!err_fd)
- return err_fd.takeError();
- debugger.SetErrorFile(lldb::SBFile(*err_fd, "w", false));
+ if (dap->m_evaluate_context &&
+ dap->m_evaluate_context->HandleReturnObject(result))
+ return lldb::eCommandReturnObjectPrintCallbackHandled;
+
+ return lldb::eCommandReturnObjectPrintCallbackSkipped;
+ },
+ this);
// The sourceInitFile option is not part of the DAP specification. It is an
// extension used by the test suite to prevent sourcing `.lldbinit` and
@@ -1352,23 +1516,6 @@ llvm::Error DAP::InitializeDebugger() {
if (llvm::Error err = RunPreInitCommands())
return err;
- auto cmd = debugger.GetCommandInterpreter().AddMultiwordCommand(
- "lldb-dap", "Commands for managing lldb-dap.");
-
- if (clientFeatures.contains(eClientFeatureStartDebuggingRequest)) {
- cmd.AddCommand(
- "start-debugging", new StartDebuggingCommand(*this),
- "Sends a startDebugging request from the debug adapter to the client "
- "to start a child debug session of the same type as the caller.");
- }
-
- cmd.AddCommand(
- "repl-mode", new ReplModeCommand(*this),
- "Get or set the repl behavior of lldb-dap evaluation requests.");
- cmd.AddCommand("send-event", new SendEventCommand(*this),
- "Sends an DAP event to the client.");
-
- StartEventThreads();
return llvm::Error::success();
}
diff --git a/lldb/tools/lldb-dap/DAP.h b/lldb/tools/lldb-dap/DAP.h
index 51f652892f61f..b9339585d2adc 100644
--- a/lldb/tools/lldb-dap/DAP.h
+++ b/lldb/tools/lldb-dap/DAP.h
@@ -11,6 +11,7 @@
#include "DAPForward.h"
#include "DAPSessionManager.h"
+#include "EvaluateContext.h"
#include "ExceptionBreakpoint.h"
#include "FunctionBreakpoint.h"
#include "InstructionBreakpoint.h"
@@ -23,16 +24,15 @@
#include "Transport.h"
#include "Variables.h"
#include "lldb/API/SBBroadcaster.h"
-#include "lldb/API/SBCommandInterpreter.h"
#include "lldb/API/SBDebugger.h"
#include "lldb/API/SBError.h"
-#include "lldb/API/SBFile.h"
#include "lldb/API/SBFormat.h"
#include "lldb/API/SBFrame.h"
#include "lldb/API/SBMutex.h"
#include "lldb/API/SBTarget.h"
#include "lldb/API/SBThread.h"
#include "lldb/Host/MainLoop.h"
+#include "lldb/lldb-forward.h"
#include "lldb/lldb-types.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/DenseSet.h"
@@ -81,6 +81,20 @@ enum class ReplMode { Variable = 0, Command, Auto };
using DAPTransport = lldb_private::transport::JSONTransport<ProtocolDescriptor>;
+/// Wraps a set of file handles for reading and writing to a pair of handlers.
+/// Typically a pty on supported platforms or a pair of pipes as a fallback.
+struct IOWrapper {
+ IOWrapper() = default;
+ IOWrapper(lldb::FileSP read, lldb::FileSP write)
+ : read(read), write(write) {};
+
+ static llvm::Expected<std::pair<IOWrapper, IOWrapper>> CreatePseudoTerminal();
+ static llvm::Expected<std::pair<IOWrapper, IOWrapper>> CreatePipePair();
+
+ lldb::FileSP read;
+ lldb::FileSP write;
+};
+
struct DAP final : public DAPTransport::MessageHandler {
friend class DAPSessionManager;
@@ -89,9 +103,16 @@ struct DAP final : public DAPTransport::MessageHandler {
Log &log;
DAPTransport &transport;
- lldb::SBFile in;
- OutputRedirector out;
- OutputRedirector err;
+
+ /// pty handles used for communicating with the debugger input / output
+ /// IOHandler.
+ /// @{
+ IOWrapper primary;
+ IOWrapper replica;
+ /// @}
+
+ OutputRedirector stdout_redirect;
+ OutputRedirector stderr_redirect;
/// Configuration specified by the launch or attach commands.
protocol::Configuration configuration;
@@ -146,11 +167,7 @@ struct DAP final : public DAPTransport::MessageHandler {
lldb::SBFormat thread_format;
llvm::unique_function<void()> on_configuration_done;
- /// This is used to allow request_evaluate to handle empty expressions
- /// (ie the user pressed 'return' and expects the previous expression to
- /// repeat). If the previous expression was a command, it will be empty.
- /// Else it will contain the last valid variable expression.
- std::string last_valid_variable_expression;
+ void ActivateRepl();
/// The set of features supported by the connected client.
llvm::DenseSet<ClientFeature> clientFeatures;
@@ -417,6 +434,11 @@ struct DAP final : public DAPTransport::MessageHandler {
void StartEventThread();
void StartProgressEventThread();
+ void SetEvaluateContext(EvaluateContext *context) {
+ std::lock_guard<std::mutex> guard(m_eval_mutex);
+ m_evaluate_context = context;
+ }
+
/// DAP debugger initialization functions.
/// @{
@@ -487,6 +509,11 @@ struct DAP final : public DAPTransport::MessageHandler {
const llvm::StringRef m_client_name;
+ std::mutex m_eval_mutex;
+ /// An optional context that is used while evaluating an expressions.
+ EvaluateContext *m_evaluate_context = nullptr;
+ lldb_private::MainLoop::ReadHandleUP m_out_handle;
+
/// List of addresses mapped by sourceReference.
std::vector<lldb::addr_t> m_source_references;
std::mutex m_source_references_mutex;
diff --git a/lldb/tools/lldb-dap/EvaluateContext.cpp b/lldb/tools/lldb-dap/EvaluateContext.cpp
new file mode 100644
index 0000000000000..3570a08bc800a
--- /dev/null
+++ b/lldb/tools/lldb-dap/EvaluateContext.cpp
@@ -0,0 +1,127 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "EvaluateContext.h"
+#include "DAP.h"
+#include "DAPLog.h"
+#include "lldb/API/SBCommandInterpreter.h"
+#include "lldb/API/SBCommandReturnObject.h"
+#include "lldb/API/SBDebugger.h"
+#include "lldb/API/SBMutex.h"
+#include "lldb/API/SBProgress.h"
+#include "lldb/Host/File.h"
+#include "lldb/Utility/Status.h"
+#include "llvm/ADT/StringRef.h"
+#include "llvm/Support/Error.h"
+#include <chrono>
+#include <memory>
+#include <string>
+
+using namespace llvm;
+using namespace lldb_dap;
+using lldb_private::Status;
+
+EvaluateContext::EvaluateContext(DAP &dap, StringRef expr)
+ : m_dap(dap), m_expr(expr),
+ m_wants_return_object(dap.debugger.GetCommandInterpreter().IsActive()) {}
+
+void EvaluateContext::Interrupt() {
+ DAP_LOG(m_dap.log, "EvaluateContext::Interrupt");
+ Done(/*immediate=*/true);
+}
+
+bool EvaluateContext::WantsRawInput() {
+ return !m_dap.debugger.GetCommandInterpreter().IsActive();
+}
+
+void EvaluateContext::Done(bool immediate) {
+ DAP_LOG(m_dap.log, "EvaluateContext::Done");
+ if (immediate)
+ m_loop.AddPendingCallback([](auto &loop) { loop.RequestTermination(); });
+ else
+ m_loop.AddCallback([](auto &loop) { loop.RequestTermination(); },
+ std::chrono::milliseconds(50));
+}
+
+bool EvaluateContext::HandleOutput(StringRef o) {
+ DAP_LOG(m_dap.log, "EvaluateContext::HandleOutput(o={0})", o);
+ // Skip the echo of the input
+ if (o.trim() == m_expr.trim() && !m_echo_detected)
+ m_echo_detected = true;
+ else
+ m_output += o;
+
+ if (m_wants_return_object) {
+ if (m_return_object_reported)
+ Done(/*immediate=*/m_output.ends_with(m_dap.debugger.GetPrompt()));
+ } else {
+ Done(/*immediate=*/m_output.ends_with(m_dap.debugger.GetPrompt()));
+ }
+
+ return true;
+}
+
+bool EvaluateContext::HandleReturnObject(lldb::SBCommandReturnObject &result) {
+ DAP_LOG(m_dap.log, "EvaluateContext::HandleReturnObject");
+ m_success = result.Succeeded();
+
+ m_return_object_reported = true;
+
+ if (result.GetStatus() == lldb::eReturnStatusSuccessFinishResult)
+ m_variables = result.GetValues(lldb::eDynamicDontRunTarget);
+ if (result.GetOutputSize())
+ m_output += StringRef{result.GetOutput(), result.GetOutputSize()};
+ if (result.GetErrorSize())
+ m_output += StringRef{result.GetError(), result.GetErrorSize()};
+
+ if (WantsRawInput())
+ Done(/*immediate=*/false);
+ else
+ Done(/*immediate=*/!m_output.empty());
+
+ return true;
+}
+
+Expected<std::pair<std::string, lldb::SBValueList>>
+EvaluateContext::Run(DAP &dap, StringRef expr) {
+ DAP_LOG(dap.log, "EvaluateContext::Run");
+ EvaluateContext context(dap, expr);
+ dap.SetEvaluateContext(&context);
+
+ lldb::SBProgress progress(/*title=*/"Evaluating expression",
+ expr.str().data(), dap.debugger);
+
+ lldb::SBMutex api_mutex = dap.GetAPIMutex();
+
+ // While in raw input mode, don't wait for output in case the IOHandler never
+ // writes.
+ if (context.WantsRawInput() && !dap.primary.write->GetIsInteractive())
+ context.Done(false);
+
+ // Unlock to allow the background thread to handle reading/processing.
+ api_mutex.unlock();
+
+ size_t size = expr.size();
+ if (Error err = dap.primary.write->Write(expr.data(), size).takeError())
+ return err;
+
+ Status status = context.m_loop.Run();
+
+ api_mutex.lock();
+ dap.SetEvaluateContext(nullptr);
+
+ if (auto error = status.takeError())
+ return error;
+
+ if (!context.m_success)
+ return createStringError(context.m_output.empty()
+ ? "Error evaluating expression"
+ : context.m_output.str());
+
+ return std::make_pair(context.m_output.str().str(), context.m_variables);
+}
diff --git a/lldb/tools/lldb-dap/EvaluateContext.h b/lldb/tools/lldb-dap/EvaluateContext.h
new file mode 100644
index 0000000000000..c4679c696ca4f
--- /dev/null
+++ b/lldb/tools/lldb-dap/EvaluateContext.h
@@ -0,0 +1,48 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLDB_TOOLS_LLDB_DAP_EVALUATE_CONTEXT_H
+#define LLDB_TOOLS_LLDB_DAP_EVALUATE_CONTEXT_H
+
+#include "DAPForward.h"
+#include "lldb/API/SBValueList.h"
+#include "lldb/Host/MainLoop.h"
+#include "llvm/ADT/StringRef.h"
+#include "llvm/Support/Error.h"
+
+namespace lldb_dap {
+class EvaluateContext {
+public:
+ bool HandleOutput(llvm::StringRef);
+ bool HandleReturnObject(lldb::SBCommandReturnObject &);
+ static llvm::Expected<std::pair<std::string, lldb::SBValueList>>
+ Run(DAP &dap, llvm::StringRef expr);
+
+ void Interrupt();
+
+private:
+ bool WantsRawInput();
+ void Done(bool immediate);
+ EvaluateContext(DAP &dap, llvm::StringRef expr);
+
+ DAP &m_dap;
+ llvm::StringRef m_expr;
+ llvm::SmallString<32> m_output;
+ lldb::SBValueList m_variables;
+ bool m_echo_detected = false;
+ bool m_success = true;
+ bool m_return_object_reported = false;
+ // If the CommandInterpreter is not active, then we're in raw input mode and
+ // will not receive a result from the print object helper.
+ bool m_wants_return_object = false;
+ lldb_private::MainLoop m_loop;
+};
+
+} // namespace lldb_dap
+
+#endif
diff --git a/lldb/tools/lldb-dap/EventHelper.cpp b/lldb/tools/lldb-dap/EventHelper.cpp
index 0ee7fbdd7561c..5b119140f9225 100644
--- a/lldb/tools/lldb-dap/EventHelper.cpp
+++ b/lldb/tools/lldb-dap/EventHelper.cpp
@@ -27,6 +27,7 @@
#include "lldb/API/SBPlatform.h"
#include "lldb/API/SBStream.h"
#include "lldb/API/SBThread.h"
+#include "lldb/API/SBThreadCollection.h"
#include "lldb/lldb-defines.h"
#include "lldb/lldb-types.h"
#include "llvm/Support/Error.h"
@@ -326,15 +327,11 @@ void SendStdOutStdErr(DAP &dap, lldb::SBProcess &process) {
// Send a "continued" event to indicate the process is in the running state.
void SendContinuedEvent(DAP &dap) {
lldb::SBProcess process = dap.target.GetProcess();
- if (!process.IsValid()) {
- return;
- }
-
// If the focus thread is not set then we haven't reported any thread status
// to the client, so nothing to report.
- if (!dap.configuration_done || dap.focus_tid == LLDB_INVALID_THREAD_ID) {
+ if (!process.IsValid() || !dap.configuration_done ||
+ dap.focus_tid == LLDB_INVALID_THREAD_ID)
return;
- }
llvm::json::Object event(CreateEventObject("continued"));
llvm::json::Object body;
diff --git a/lldb/tools/lldb-dap/Handler/CompletionsRequestHandler.cpp b/lldb/tools/lldb-dap/Handler/CompletionsRequestHandler.cpp
index 423043e6c26dd..4988ccb616b48 100644
--- a/lldb/tools/lldb-dap/Handler/CompletionsRequestHandler.cpp
+++ b/lldb/tools/lldb-dap/Handler/CompletionsRequestHandler.cpp
@@ -11,6 +11,7 @@
#include "Protocol/ProtocolRequests.h"
#include "Protocol/ProtocolTypes.h"
#include "RequestHandler.h"
+#include "lldb/API/SBCommandInterpreter.h"
#include "lldb/API/SBStringList.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/Support/ConvertUTF.h"
diff --git a/lldb/tools/lldb-dap/Handler/ConfigurationDoneRequestHandler.cpp b/lldb/tools/lldb-dap/Handler/ConfigurationDoneRequestHandler.cpp
index 4b84a047cd148..8e589ed68c65c 100644
--- a/lldb/tools/lldb-dap/Handler/ConfigurationDoneRequestHandler.cpp
+++ b/lldb/tools/lldb-dap/Handler/ConfigurationDoneRequestHandler.cpp
@@ -7,6 +7,7 @@
//===----------------------------------------------------------------------===//
#include "DAP.h"
+#include "DAPLog.h"
#include "EventHelper.h"
#include "LLDBUtils.h"
#include "Protocol/ProtocolRequests.h"
@@ -74,6 +75,8 @@ void ConfigurationDoneRequestHandler::PostRun() const {
dap.on_configuration_done();
// Clear the callback to ensure any captured resources are released.
dap.on_configuration_done = nullptr;
+
+ dap.ActivateRepl();
}
} // namespace lldb_dap
diff --git a/lldb/tools/lldb-dap/Handler/EvaluateRequestHandler.cpp b/lldb/tools/lldb-dap/Handler/EvaluateRequestHandler.cpp
index 77d9f03554a2a..6e293e408f823 100644
--- a/lldb/tools/lldb-dap/Handler/EvaluateRequestHandler.cpp
+++ b/lldb/tools/lldb-dap/Handler/EvaluateRequestHandler.cpp
@@ -15,9 +15,11 @@
#include "Protocol/ProtocolRequests.h"
#include "Protocol/ProtocolTypes.h"
#include "RequestHandler.h"
+#include "lldb/API/SBValue.h"
#include "lldb/lldb-enumerations.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/Support/Error.h"
+#include <cstddef>
using namespace llvm;
using namespace lldb_dap;
@@ -25,25 +27,6 @@ using namespace lldb_dap::protocol;
namespace lldb_dap {
-static bool RunExpressionAsLLDBCommand(DAP &dap, lldb::SBFrame &frame,
- std::string &expression,
- EvaluateContext context) {
- if (context != eEvaluateContextRepl && context != eEvaluateContextUnknown)
- return false;
-
- // Since we don't know this context do not try to repeat the last command;
- if (context == eEvaluateContextUnknown && expression.empty())
- return false;
-
- const bool repeat_last_command =
- expression.empty() && dap.last_valid_variable_expression.empty();
- if (repeat_last_command)
- return true;
-
- const ReplMode repl_mode = dap.DetectReplMode(frame, expression, false);
- return repl_mode == ReplMode::Command;
-}
-
static lldb::SBValue EvaluateVariableExpression(lldb::SBTarget &target,
lldb::SBFrame &frame,
const std::string &expression,
@@ -74,67 +57,63 @@ static lldb::SBValue EvaluateVariableExpression(lldb::SBTarget &target,
/// The expression has access to any variables and arguments that are in scope.
Expected<EvaluateResponseBody>
EvaluateRequestHandler::Run(const EvaluateArguments &arguments) const {
-
EvaluateResponseBody body;
lldb::SBFrame frame = dap.GetLLDBFrame(arguments.frameId);
- std::string expression = llvm::StringRef(arguments.expression).trim().str();
- const EvaluateContext evaluate_context = arguments.context;
- const bool is_repl_context = evaluate_context == eEvaluateContextRepl;
-
- if (RunExpressionAsLLDBCommand(dap, frame, expression, evaluate_context)) {
- // Since the current expression is not for a variable, clear the
- // last_valid_variable_expression field.
- dap.last_valid_variable_expression.clear();
+ std::string expression = arguments.expression;
+ const bool is_repl_context = arguments.context == eEvaluateContextRepl;
+ const bool run_as_expression = arguments.context != eEvaluateContextHover;
+ lldb::SBValue value;
+
+ if (arguments.context == protocol::eEvaluateContextRepl &&
+ dap.DetectReplMode(frame, expression, false) == ReplMode::Command) {
+ const lldb::StateType process_state = dap.target.GetProcess().GetState();
+ if (!lldb::SBDebugger::StateIsStoppedState(process_state))
+ return llvm::make_error<DAPError>(
+ "Cannot evaluate expressions while the process is running. Pause "
+ "the process and try again.",
+ /**error_code=*/llvm::inconvertibleErrorCode(),
+ /**show_user=*/false);
+
// If we're evaluating a command relative to the current frame, set the
// focus_tid to the current frame for any thread related events.
- if (frame.IsValid()) {
+ if (frame.IsValid())
dap.focus_tid = frame.GetThread().GetThreadID();
- }
- bool required_command_failed = false;
- body.result = RunLLDBCommands(
- dap.debugger, llvm::StringRef(), {expression}, required_command_failed,
- /*parse_command_directives=*/false, /*echo_commands=*/false);
- return body;
- }
+ Expected<std::pair<std::string, lldb::SBValueList>> result =
+ EvaluateContext::Run(dap, expression + "\n");
+ if (!result)
+ return result.takeError();
- if (dap.ProcessIsNotStopped())
- return llvm::make_error<DAPError>(
- "Cannot evaluate expressions while the process is running. Pause "
- "the process and try again.",
- /**error_code=*/llvm::inconvertibleErrorCode(),
- /**show_user=*/false);
+ lldb::SBValueList values;
+ std::tie(body.result, values) = *result;
- // If the user expression is empty, evaluate the last valid variable
- // expression.
- if (expression.empty() && is_repl_context)
- expression = dap.last_valid_variable_expression;
+ if (values.GetSize() == 1) {
+ value = values.GetValueAtIndex(0);
+ body.type = value.GetDisplayTypeName();
+ } else if (values.GetSize()) {
+ body.variablesReference = dap.reference_storage.Insert(result->second);
+ }
+ } else {
+ value = EvaluateVariableExpression(dap.target, frame, expression,
+ run_as_expression);
- const bool run_as_expression = evaluate_context != eEvaluateContextHover;
- lldb::SBValue value = EvaluateVariableExpression(
- dap.target, frame, expression, run_as_expression);
+ if (value.GetError().Fail())
+ return ToError(value.GetError(), /*show_user=*/false);
- if (value.GetError().Fail())
- return ToError(value.GetError(), /*show_user=*/false);
+ if (is_repl_context)
+ value = value.Persist();
- if (is_repl_context) {
- // save the new variable expression
- dap.last_valid_variable_expression = std::move(expression);
+ const bool hex = arguments.format ? arguments.format->hex : false;
+ VariableDescription desc(
+ value, dap.configuration.enableAutoVariableSummaries, hex);
- // Freeze dry the value in case users expand it later in the debug console
- value = value.Persist();
+ body.result = desc.GetResult(arguments.context);
+ body.type = desc.display_type_name;
}
- const bool hex = arguments.format ? arguments.format->hex : false;
- VariableDescription desc(value, dap.configuration.enableAutoVariableSummaries,
- hex);
-
- body.result = desc.GetResult(evaluate_context);
- body.type = desc.display_type_name;
-
if (value.MightHaveChildren() || ValuePointsToCode(value))
- body.variablesReference = dap.reference_storage.InsertVariable(
- value, /*is_permanent=*/is_repl_context);
+ body.variablesReference =
+ dap.reference_storage.Insert(value, /*is_permanent=*/is_repl_context);
if (lldb::addr_t addr = value.GetLoadAddress(); addr != LLDB_INVALID_ADDRESS)
body.memoryReference = EncodeMemoryReference(addr);
diff --git a/lldb/tools/lldb-dap/Handler/ScopesRequestHandler.cpp b/lldb/tools/lldb-dap/Handler/ScopesRequestHandler.cpp
index 3786d583e0e87..b2b006baf8a5e 100644
--- a/lldb/tools/lldb-dap/Handler/ScopesRequestHandler.cpp
+++ b/lldb/tools/lldb-dap/Handler/ScopesRequestHandler.cpp
@@ -36,8 +36,7 @@ ScopesRequestHandler::Run(const ScopesArguments &args) const {
frame.GetThread().SetSelectedFrame(frame.GetFrameID());
}
- std::vector<protocol::Scope> scopes =
- dap.reference_storage.CreateScopes(frame);
+ std::vector<protocol::Scope> scopes = dap.reference_storage.Insert(frame);
return ScopesResponseBody{std::move(scopes)};
}
diff --git a/lldb/tools/lldb-dap/Handler/SetVariableRequestHandler.cpp b/lldb/tools/lldb-dap/Handler/SetVariableRequestHandler.cpp
index 725d5de094c95..8fe424b55c9b1 100644
--- a/lldb/tools/lldb-dap/Handler/SetVariableRequestHandler.cpp
+++ b/lldb/tools/lldb-dap/Handler/SetVariableRequestHandler.cpp
@@ -67,7 +67,7 @@ SetVariableRequestHandler::Run(const SetVariableArguments &args) const {
// is_permanent is false because debug console does not support
// setVariable request.
const var_ref_t new_var_ref =
- dap.reference_storage.InsertVariable(variable, /*is_permanent=*/false);
+ dap.reference_storage.Insert(variable, /*is_permanent=*/false);
if (variable.MightHaveChildren()) {
body.variablesReference = new_var_ref;
if (desc.type_obj.IsArrayType())
diff --git a/lldb/tools/lldb-dap/Handler/VariablesRequestHandler.cpp b/lldb/tools/lldb-dap/Handler/VariablesRequestHandler.cpp
index 26719b3a14d4d..46dda9e4c5d08 100644
--- a/lldb/tools/lldb-dap/Handler/VariablesRequestHandler.cpp
+++ b/lldb/tools/lldb-dap/Handler/VariablesRequestHandler.cpp
@@ -13,7 +13,6 @@
#include "Protocol/DAPTypes.h"
#include "Protocol/ProtocolRequests.h"
#include "Variables.h"
-#include "llvm/Support/ErrorExtras.h"
using namespace llvm;
using namespace lldb_dap::protocol;
diff --git a/lldb/tools/lldb-dap/ProgressEvent.cpp b/lldb/tools/lldb-dap/ProgressEvent.cpp
index 5ef03ccb24bb9..33964922e1ad7 100644
--- a/lldb/tools/lldb-dap/ProgressEvent.cpp
+++ b/lldb/tools/lldb-dap/ProgressEvent.cpp
@@ -114,7 +114,7 @@ json::Value ProgressEvent::ToJSON() const {
if (m_event_type == progressStart) {
EmplaceSafeString(body, "title", m_message);
- body.try_emplace("cancellable", false);
+ body.try_emplace("cancellable", true);
}
if (m_event_type == progressUpdate)
diff --git a/lldb/tools/lldb-dap/Protocol/ProtocolRequests.cpp b/lldb/tools/lldb-dap/Protocol/ProtocolRequests.cpp
index f16d2ffcb7998..75f3bc3ef8152 100644
--- a/lldb/tools/lldb-dap/Protocol/ProtocolRequests.cpp
+++ b/lldb/tools/lldb-dap/Protocol/ProtocolRequests.cpp
@@ -148,8 +148,8 @@ namespace lldb_dap::protocol {
bool fromJSON(const json::Value &Params, CancelArguments &CA, json::Path P) {
json::ObjectMapper O(Params, P);
- return O && O.map("requestId", CA.requestId) &&
- O.map("progressId", CA.progressId);
+ return O && O.mapOptional("requestId", CA.requestId) &&
+ O.mapOptional("progressId", CA.progressId);
}
bool fromJSON(const json::Value &Params, DisconnectArguments &DA,
diff --git a/lldb/tools/lldb-dap/Protocol/ProtocolRequests.h b/lldb/tools/lldb-dap/Protocol/ProtocolRequests.h
index 315f2d7b2f269..a9372aaf77aa9 100644
--- a/lldb/tools/lldb-dap/Protocol/ProtocolRequests.h
+++ b/lldb/tools/lldb-dap/Protocol/ProtocolRequests.h
@@ -42,13 +42,13 @@ struct CancelArguments {
/// is cancelled.
///
/// Both a `requestId` and a `progressId` can be specified in one request.
- std::optional<int64_t> requestId;
+ uint64_t requestId = 0;
/// The ID (attribute `progressId`) of the progress to cancel. If missing no
/// progress is cancelled.
///
/// Both a `requestId` and a `progressId` can be specified in one request.
- std::optional<int64_t> progressId;
+ std::string progressId;
};
bool fromJSON(const llvm::json::Value &, CancelArguments &, llvm::json::Path);
diff --git a/lldb/tools/lldb-dap/Variables.cpp b/lldb/tools/lldb-dap/Variables.cpp
index 1f429b087ac0e..5e76068604fd4 100644
--- a/lldb/tools/lldb-dap/Variables.cpp
+++ b/lldb/tools/lldb-dap/Variables.cpp
@@ -1,4 +1,4 @@
-//===-- Variables.cpp ---------------------------------------------------*-===//
+//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
@@ -15,7 +15,6 @@
#include "ProtocolUtils.h"
#include "SBAPIExtras.h"
#include "lldb/API/SBFrame.h"
-#include "lldb/API/SBProcess.h"
#include "lldb/API/SBValue.h"
#include "lldb/API/SBValueList.h"
#include "llvm/ADT/Sequence.h"
@@ -27,285 +26,388 @@
using namespace lldb_dap;
using namespace lldb_dap::protocol;
-namespace lldb_dap {
-
-protocol::Scope CreateScope(ScopeKind kind, var_ref_t variablesReference,
- bool expensive) {
- protocol::Scope scope;
- scope.variablesReference = variablesReference;
- scope.expensive = expensive;
+namespace {
+
+/// A Variable store for fetching variables within a specific scope (locals,
+/// globals, or registers) for a given stack frame.
+class ScopeStore final : public VariableStore {
+public:
+ explicit ScopeStore(ScopeKind kind, const lldb::SBFrame &frame)
+ : m_frame(frame), m_kind(kind) {}
+
+ std::vector<protocol::Variable>
+ GetVariables(VariableReferenceStorage &storage,
+ const protocol::Configuration &config,
+ const protocol::VariablesArguments &args) override {
+ LoadVariables();
+ if (m_kind == lldb_dap::eScopeKindRegisters)
+ SetRegistersFormat();
+
+ const bool format_hex = args.format ? args.format->hex : false;
+ std::vector<Variable> variables;
+ if (m_kind == eScopeKindLocals)
+ AddReturnValue(storage, config, variables, format_hex);
+
+ const uint64_t count = args.count;
+ const uint32_t start_idx = 0;
+ const uint32_t num_children = m_children.GetSize();
+ const uint32_t end_idx = start_idx + ((count == 0) ? num_children : count);
+
+ // We first find out which variable names are duplicated.
+ std::map<llvm::StringRef, uint32_t> variable_name_counts;
+ for (auto i = start_idx; i < end_idx; ++i) {
+ lldb::SBValue variable = m_children.GetValueAtIndex(i);
+ if (!variable.IsValid())
+ break;
+ variable_name_counts[GetNonNullVariableName(variable)]++;
+ }
- // TODO: Support "arguments" and "return value" scope.
- // At the moment lldb-dap includes the arguments and return_value into the
- // "locals" scope.
- // VS Code only expands the first non-expensive scope. This causes friction
- // if we add the arguments above the local scope, as the locals scope will not
- // be expanded if we enter a function with arguments. It becomes more
- // annoying when the scope has arguments, return_value and locals.
- switch (kind) {
- case eScopeKindLocals:
- scope.presentationHint = protocol::Scope::eScopePresentationHintLocals;
- scope.name = "Locals";
- break;
- case eScopeKindGlobals:
- scope.name = "Globals";
- break;
- case eScopeKindRegisters:
- scope.presentationHint = protocol::Scope::eScopePresentationHintRegisters;
- scope.name = "Registers";
- break;
+ // Now we construct the result with unique display variable names.
+ for (auto i = start_idx; i < end_idx; ++i) {
+ lldb::SBValue variable = m_children.GetValueAtIndex(i);
+
+ if (!variable.IsValid())
+ break;
+
+ const var_ref_t frame_var_ref =
+ storage.Insert(variable, /*is_permanent=*/false);
+ if (LLVM_UNLIKELY(frame_var_ref.AsUInt32() >=
+ var_ref_t::k_variables_reference_threshold)) {
+ DAP_LOG(storage.log,
+ "warning: scopes variablesReference threshold reached. "
+ "current: {} threshold: {}, maximum {}.",
+ frame_var_ref.AsUInt32(),
+ var_ref_t::k_variables_reference_threshold,
+ var_ref_t::k_max_variables_references);
+ }
+
+ if (LLVM_UNLIKELY(frame_var_ref.Kind() == eReferenceKindInvalid))
+ break;
+
+ variables.emplace_back(CreateVariable(
+ variable, frame_var_ref, format_hex,
+ config.enableAutoVariableSummaries,
+ config.enableSyntheticChildDebugging,
+ variable_name_counts[GetNonNullVariableName(variable)] > 1));
+ }
+ return variables;
}
- return scope;
-}
-
-std::vector<Variable>
-ScopeStore::GetVariables(VariableReferenceStorage &storage,
- const Configuration &config,
- const VariablesArguments &args) {
- LoadVariables();
- if (m_kind == lldb_dap::eScopeKindRegisters)
- SetRegistersFormat();
-
- const bool format_hex = args.format ? args.format->hex : false;
- std::vector<Variable> variables;
- if (m_kind == eScopeKindLocals)
- AddReturnValue(storage, config, variables, format_hex);
-
- const uint64_t count = args.count;
- const uint32_t start_idx = 0;
- const uint32_t num_children = m_children.GetSize();
- const uint32_t end_idx = start_idx + ((count == 0) ? num_children : count);
-
- // We first find out which variable names are duplicated.
- std::map<llvm::StringRef, uint32_t> variable_name_counts;
- for (auto i = start_idx; i < end_idx; ++i) {
- lldb::SBValue variable = m_children.GetValueAtIndex(i);
- if (!variable.IsValid())
- break;
- variable_name_counts[GetNonNullVariableName(variable)]++;
+ lldb::SBValue FindVariable(llvm::StringRef name) override {
+ LoadVariables();
+
+ lldb::SBValue variable;
+ const bool is_name_duplicated = name.contains(" @");
+ // variablesReference is one of our scopes, not an actual variable it is
+ // asking for a variable in locals or globals or registers.
+ const uint32_t end_idx = m_children.GetSize();
+ // Searching backward so that we choose the variable in closest scope
+ // among variables of the same name.
+ for (const uint32_t i : llvm::reverse(llvm::seq<uint32_t>(0, end_idx))) {
+ lldb::SBValue curr_variable = m_children.GetValueAtIndex(i);
+ std::string variable_name =
+ CreateUniqueVariableNameForDisplay(curr_variable, is_name_duplicated);
+ if (variable_name == name) {
+ variable = curr_variable;
+ break;
+ }
+ }
+ return variable;
}
- // Now we construct the result with unique display variable names.
- for (auto i = start_idx; i < end_idx; ++i) {
- lldb::SBValue variable = m_children.GetValueAtIndex(i);
+ lldb::SBValue GetVariable() const override { return lldb::SBValue(); }
- if (!variable.IsValid())
- break;
-
- const var_ref_t frame_var_ref =
- storage.InsertVariable(variable, /*is_permanent=*/false);
- if (LLVM_UNLIKELY(frame_var_ref.AsUInt32() >=
- var_ref_t::k_variables_reference_threshold)) {
- DAP_LOG(storage.log,
- "warning: scopes variablesReference threshold reached. "
- "current: {} threshold: {}, maximum {}.",
- frame_var_ref.AsUInt32(),
- var_ref_t::k_variables_reference_threshold,
- var_ref_t::k_max_variables_references);
- }
+private:
+ void LoadVariables() {
+ if (m_variables_loaded)
+ return;
- if (LLVM_UNLIKELY(frame_var_ref.Kind() == eReferenceKindInvalid))
+ m_variables_loaded = true;
+ switch (m_kind) {
+ case eScopeKindLocals:
+ m_children = m_frame.GetVariables(/*arguments=*/true,
+ /*locals=*/true,
+ /*statics=*/false,
+ /*in_scope_only=*/true);
break;
-
- variables.emplace_back(CreateVariable(
- variable, frame_var_ref, format_hex, config.enableAutoVariableSummaries,
- config.enableSyntheticChildDebugging,
- variable_name_counts[GetNonNullVariableName(variable)] > 1));
- }
- return variables;
-}
-
-lldb::SBValue ScopeStore::FindVariable(llvm::StringRef name) {
- LoadVariables();
-
- lldb::SBValue variable;
- const bool is_name_duplicated = name.contains(" @");
- // variablesReference is one of our scopes, not an actual variable it is
- // asking for a variable in locals or globals or registers.
- const uint32_t end_idx = m_children.GetSize();
- // Searching backward so that we choose the variable in closest scope
- // among variables of the same name.
- for (const uint32_t i : llvm::reverse(llvm::seq<uint32_t>(0, end_idx))) {
- lldb::SBValue curr_variable = m_children.GetValueAtIndex(i);
- std::string variable_name =
- CreateUniqueVariableNameForDisplay(curr_variable, is_name_duplicated);
- if (variable_name == name) {
- variable = curr_variable;
+ case eScopeKindGlobals:
+ m_children = m_frame.GetVariables(/*arguments=*/false,
+ /*locals=*/false,
+ /*statics=*/true,
+ /*in_scope_only=*/true);
break;
+ case eScopeKindRegisters:
+ m_children = m_frame.GetRegisters();
}
}
- return variable;
-}
-void ScopeStore::LoadVariables() {
- if (m_variables_loaded)
- return;
-
- m_variables_loaded = true;
- switch (m_kind) {
- case eScopeKindLocals:
- m_children = m_frame.GetVariables(/*arguments=*/true,
- /*locals=*/true,
- /*statics=*/false,
- /*in_scope_only=*/true);
- break;
- case eScopeKindGlobals:
- m_children = m_frame.GetVariables(/*arguments=*/false,
- /*locals=*/false,
- /*statics=*/true,
- /*in_scope_only=*/true);
- break;
- case eScopeKindRegisters:
- m_children = m_frame.GetRegisters();
+ void SetRegistersFormat() {
+ // Change the default format of any pointer sized registers in the first
+ // register set to be the lldb::eFormatAddressInfo so we show the pointer
+ // and resolve what the pointer resolves to. Only change the format if the
+ // format was set to the default format or if it was hex as some registers
+ // have formats set for them.
+ const uint32_t addr_size =
+ m_frame.GetThread().GetProcess().GetAddressByteSize();
+ for (lldb::SBValue reg : m_children.GetValueAtIndex(0)) {
+ const lldb::Format format = reg.GetFormat();
+ if (format == lldb::eFormatDefault || format == lldb::eFormatHex) {
+ if (reg.GetByteSize() == addr_size)
+ reg.SetFormat(lldb::eFormatAddressInfo);
+ }
+ }
}
-}
-void ScopeStore::SetRegistersFormat() {
- // Change the default format of any pointer sized registers in the first
- // register set to be the lldb::eFormatAddressInfo so we show the pointer
- // and resolve what the pointer resolves to. Only change the format if the
- // format was set to the default format or if it was hex as some registers
- // have formats set for them.
- const uint32_t addr_size =
- m_frame.GetThread().GetProcess().GetAddressByteSize();
- for (lldb::SBValue reg : m_children.GetValueAtIndex(0)) {
- const lldb::Format format = reg.GetFormat();
- if (format == lldb::eFormatDefault || format == lldb::eFormatHex) {
- if (reg.GetByteSize() == addr_size)
- reg.SetFormat(lldb::eFormatAddressInfo);
+ void AddReturnValue(VariableReferenceStorage &storage,
+ const protocol::Configuration &config,
+ std::vector<protocol::Variable> &variables,
+ bool format_hex) {
+ assert(m_kind == eScopeKindLocals &&
+ "Return Value Should only be in local scope");
+ if (m_children.GetSize() == 0) {
+ // Check for an error in the SBValueList that might explain why we don't
+ // have locals. If we have an error display it as the sole value in the
+ // the locals.
+
+ // "error" owns the error string so we must keep it alive as long as we
+ // want to use the returns "const char *".
+ lldb::SBError error = m_children.GetError();
+ if (const char *var_err = error.GetCString()) {
+ // Create a fake variable named "error" to explain why variables were
+ // not available. This new error will help let users know when there was
+ // a problem that kept variables from being available for display and
+ // allow users to fix this issue instead of seeing no variables. The
+ // errors are only set when there is a problem that the user could
+ // fix, so no error will show up when you have no debug info, only when
+ // we do have debug info and something that is fixable can be done.
+ Variable err_var;
+ err_var.name = "<error>";
+ err_var.type = "const char *";
+ err_var.value = var_err;
+ variables.push_back(std::move(err_var));
+ }
+ return;
}
- }
-}
-void ScopeStore::AddReturnValue(VariableReferenceStorage &storage,
- const Configuration &config,
- std::vector<Variable> &variables,
- bool format_hex) {
- assert(m_kind == eScopeKindLocals &&
- "Return Value Should only be in local scope");
- if (m_children.GetSize() == 0) {
- // Check for an error in the SBValueList that might explain why we don't
- // have locals. If we have an error display it as the sole value in the
- // the locals.
-
- // "error" owns the error string so we must keep it alive as long as we
- // want to use the returns "const char *".
- lldb::SBError error = m_children.GetError();
- if (const char *var_err = error.GetCString()) {
- // Create a fake variable named "error" to explain why variables were
- // not available. This new error will help let users know when there was
- // a problem that kept variables from being available for display and
- // allow users to fix this issue instead of seeing no variables. The
- // errors are only set when there is a problem that the user could
- // fix, so no error will show up when you have no debug info, only when
- // we do have debug info and something that is fixable can be done.
- Variable err_var;
- err_var.name = "<error>";
- err_var.type = "const char *";
- err_var.value = var_err;
- variables.push_back(std::move(err_var));
+ // Show return value if there is any ( in the local top frame )
+ lldb::SBThread selected_thread = m_frame.GetThread();
+ lldb::SBValue stop_return_value = selected_thread.GetStopReturnValue();
+
+ if (stop_return_value.IsValid() &&
+ (selected_thread.GetSelectedFrame().GetFrameID() == 0)) {
+ auto renamed_return_value = stop_return_value.Clone("(Return Value)");
+ var_ref_t return_var_ref{var_ref_t::k_no_child};
+
+ if (stop_return_value.MightHaveChildren() ||
+ stop_return_value.IsSynthetic()) {
+ return_var_ref = storage.Insert(stop_return_value,
+ /*is_permanent=*/false);
+ }
+ variables.emplace_back(
+ CreateVariable(renamed_return_value, return_var_ref, format_hex,
+ config.enableAutoVariableSummaries,
+ config.enableSyntheticChildDebugging, false));
}
- return;
}
- // Show return value if there is any ( in the local top frame )
- lldb::SBThread selected_thread = m_frame.GetThread();
- lldb::SBValue stop_return_value = selected_thread.GetStopReturnValue();
+ lldb::SBFrame m_frame;
+ lldb::SBValueList m_children;
+ ScopeKind m_kind;
+ bool m_variables_loaded = false;
+};
+
+/// Variable store for expandable values.
+///
+/// Manages children variables of complex types (structs, arrays, pointers,
+/// etc.) that can be expanded in the debugger UI.
+class ExpandableValueStore final : public VariableStore {
+
+public:
+ explicit ExpandableValueStore(const lldb::SBValue &value) : m_value(value) {}
+
+ std::vector<protocol::Variable>
+ GetVariables(VariableReferenceStorage &storage,
+ const protocol::Configuration &config,
+ const protocol::VariablesArguments &args) override {
+ const var_ref_t var_ref = args.variablesReference;
+ const uint64_t count = args.count;
+ const uint64_t start = args.start;
+ const bool hex = args.format ? args.format->hex : false;
+
+ lldb::SBValue variable = storage.GetVariable(var_ref);
+ if (!variable)
+ return {};
+
+ // We are expanding a variable that has children, so we will return its
+ // children.
+ std::vector<Variable> variables;
+ const bool is_permanent = var_ref.Kind() == eReferenceKindPermanent;
+ auto addChild = [&](lldb::SBValue child,
+ std::optional<llvm::StringRef> custom_name = {}) {
+ if (!child.IsValid())
+ return;
+
+ const var_ref_t child_var_ref = storage.Insert(child, is_permanent);
+ if (LLVM_UNLIKELY(child_var_ref.AsUInt32() ==
+ var_ref_t::k_variables_reference_threshold)) {
+ DAP_LOG(storage.log,
+ "warning: {} variablesReference threshold reached. "
+ "current: {} threshold: {}, maximum {}.",
+ (is_permanent ? "permanent" : "temporary"),
+ child_var_ref.AsUInt32(),
+ var_ref_t::k_variables_reference_threshold,
+ var_ref_t::k_max_variables_references);
+ }
+
+ if (LLVM_UNLIKELY(child_var_ref.Kind() == eReferenceKindInvalid)) {
+ DAP_LOG(storage.log,
+ "error: invalid variablesReference created for {} variable {}.",
+ (is_permanent ? "permanent" : "temporary"), variable.GetName());
+ return;
+ }
+
+ variables.emplace_back(CreateVariable(
+ child, child_var_ref, hex, config.enableAutoVariableSummaries,
+ config.enableSyntheticChildDebugging,
+ /*is_name_duplicated=*/false, custom_name));
+ };
+
+ const uint32_t num_children = variable.GetNumChildren();
+ const uint32_t end_idx = start + ((count == 0) ? num_children : count);
+ uint32_t i = start;
+ for (; i < end_idx && i < num_children; ++i)
+ addChild(variable.GetChildAtIndex(i));
+
+ // If we haven't filled the count quota from the request, we insert a new
+ // "[raw]" child that can be used to inspect the raw version of a
+ // synthetic member. That eliminates the need for the user to go to the
+ // debug console and type `frame var <variable> to get these values.
+ if (config.enableSyntheticChildDebugging && variable.IsSynthetic() &&
+ i == num_children)
+ addChild(variable.GetNonSyntheticValue(), "[raw]");
+
+ return variables;
+ }
- if (stop_return_value.IsValid() &&
- (selected_thread.GetSelectedFrame().GetFrameID() == 0)) {
- auto renamed_return_value = stop_return_value.Clone("(Return Value)");
- var_ref_t return_var_ref{var_ref_t::k_no_child};
+ lldb::SBValue FindVariable(llvm::StringRef name) override {
+ lldb::SBValue variable = m_value.GetChildMemberWithName(name.data());
+ if (variable.IsValid())
+ return variable;
- if (stop_return_value.MightHaveChildren() ||
- stop_return_value.IsSynthetic()) {
- return_var_ref = storage.InsertVariable(stop_return_value,
- /*is_permanent=*/false);
+ if (name.consume_front('[') && name.consume_back("]")) {
+ uint64_t index = 0;
+ if (!name.consumeInteger(0, index)) {
+ variable = m_value.GetChildAtIndex(index);
+ }
}
- variables.emplace_back(
- CreateVariable(renamed_return_value, return_var_ref, format_hex,
- config.enableAutoVariableSummaries,
- config.enableSyntheticChildDebugging, false));
+ return variable;
}
-}
-std::vector<Variable>
-ExpandableValueStore::GetVariables(VariableReferenceStorage &storage,
- const Configuration &config,
- const VariablesArguments &args) {
- const var_ref_t var_ref = args.variablesReference;
- const uint64_t count = args.count;
- const uint64_t start = args.start;
- const bool hex = args.format ? args.format->hex : false;
-
- lldb::SBValue variable = storage.GetVariable(var_ref);
- if (!variable)
- return {};
-
- // We are expanding a variable that has children, so we will return its
- // children.
- std::vector<Variable> variables;
- const bool is_permanent = var_ref.Kind() == eReferenceKindPermanent;
- auto addChild = [&](lldb::SBValue child,
- std::optional<llvm::StringRef> custom_name = {}) {
- if (!child.IsValid())
- return;
+ [[nodiscard]] lldb::SBValue GetVariable() const override { return m_value; };
+
+private:
+ lldb::SBValue m_value;
+};
+
+class ExpandableValueListStore final : public VariableStore {
+
+public:
+ explicit ExpandableValueListStore(const lldb::SBValueList &list)
+ : m_value_list(list) {}
+
+ std::vector<protocol::Variable>
+ GetVariables(VariableReferenceStorage &storage,
+ const protocol::Configuration &config,
+ const protocol::VariablesArguments &args) override {
+ const var_ref_t var_ref = args.variablesReference;
+ const uint64_t count = args.count;
+ const uint64_t start = args.start;
+ const bool hex = args.format ? args.format->hex : false;
+
+ // We are expanding a variable that has children, so we will return its
+ // children.
+ std::vector<Variable> variables;
+ const bool is_permanent = var_ref.Kind() == eReferenceKindPermanent;
+ auto addChild = [&](lldb::SBValue child,
+ std::optional<llvm::StringRef> custom_name = {}) {
+ if (!child.IsValid())
+ return;
+
+ const var_ref_t child_var_ref = storage.Insert(child, is_permanent);
+ if (LLVM_UNLIKELY(child_var_ref.AsUInt32() ==
+ var_ref_t::k_variables_reference_threshold)) {
+ DAP_LOG(storage.log,
+ "warning: {} variablesReference threshold reached. "
+ "current: {} threshold: {}, maximum {}.",
+ (is_permanent ? "permanent" : "temporary"),
+ child_var_ref.AsUInt32(),
+ var_ref_t::k_variables_reference_threshold,
+ var_ref_t::k_max_variables_references);
+ }
+
+ variables.emplace_back(CreateVariable(
+ child, child_var_ref, hex, config.enableAutoVariableSummaries,
+ config.enableSyntheticChildDebugging,
+ /*is_name_duplicated=*/false, custom_name));
+ };
+
+ const uint32_t num_children = m_value_list.GetSize();
+ const uint32_t end_idx = start + ((count == 0) ? num_children : count);
+ uint32_t i = start;
+ for (; i < end_idx && i < num_children; ++i)
+ addChild(m_value_list.GetValueAtIndex(i));
+
+ return variables;
+ }
- const var_ref_t child_var_ref = storage.InsertVariable(child, is_permanent);
- if (LLVM_UNLIKELY(child_var_ref.AsUInt32() ==
- var_ref_t::k_variables_reference_threshold)) {
- DAP_LOG(storage.log,
- "warning: {} variablesReference threshold reached. "
- "current: {} threshold: {}, maximum {}.",
- (is_permanent ? "permanent" : "temporary"),
- child_var_ref.AsUInt32(),
- var_ref_t::k_variables_reference_threshold,
- var_ref_t::k_max_variables_references);
- }
+ lldb::SBValue FindVariable(llvm::StringRef name) override {
+ lldb::SBValue variable = m_value_list.GetFirstValueByName(name.data());
+ if (variable.IsValid())
+ return variable;
- if (LLVM_UNLIKELY(child_var_ref.Kind() == eReferenceKindInvalid)) {
- DAP_LOG(storage.log,
- "error: invalid variablesReference created for {} variable {}.",
- (is_permanent ? "permanent" : "temporary"), variable.GetName());
- return;
- }
+ return lldb::SBValue();
+ }
- variables.emplace_back(CreateVariable(
- child, child_var_ref, hex, config.enableAutoVariableSummaries,
- config.enableSyntheticChildDebugging,
- /*is_name_duplicated=*/false, custom_name));
+ [[nodiscard]] lldb::SBValue GetVariable() const override {
+ return lldb::SBValue();
};
- const uint32_t num_children = variable.GetNumChildren();
- const uint32_t end_idx = start + ((count == 0) ? num_children : count);
- uint32_t i = start;
- for (; i < end_idx && i < num_children; ++i)
- addChild(variable.GetChildAtIndex(i));
-
- // If we haven't filled the count quota from the request, we insert a new
- // "[raw]" child that can be used to inspect the raw version of a
- // synthetic member. That eliminates the need for the user to go to the
- // debug console and type `frame var <variable> to get these values.
- if (config.enableSyntheticChildDebugging && variable.IsSynthetic() &&
- i == num_children)
- addChild(variable.GetNonSyntheticValue(), "[raw]");
-
- return variables;
-}
+private:
+ lldb::SBValueList m_value_list;
+};
-lldb::SBValue ExpandableValueStore::FindVariable(llvm::StringRef name) {
- lldb::SBValue variable = m_value.GetChildMemberWithName(name.data());
- if (variable.IsValid())
- return variable;
+} // namespace
- if (name.consume_front('[') && name.consume_back("]")) {
- uint64_t index = 0;
- if (!name.consumeInteger(0, index)) {
- variable = m_value.GetChildAtIndex(index);
- }
+namespace lldb_dap {
+
+protocol::Scope CreateScope(ScopeKind kind, var_ref_t variablesReference,
+ bool expensive) {
+ protocol::Scope scope;
+ scope.variablesReference = variablesReference;
+ scope.expensive = expensive;
+
+ // TODO: Support "arguments" and "return value" scope.
+ // At the moment lldb-dap includes the arguments and return_value into the
+ // "locals" scope.
+ // VS Code only expands the first non-expensive scope. This causes friction
+ // if we add the arguments above the local scope, as the locals scope will not
+ // be expanded if we enter a function with arguments. It becomes more
+ // annoying when the scope has arguments, return_value and locals.
+ switch (kind) {
+ case eScopeKindLocals:
+ scope.presentationHint = protocol::Scope::eScopePresentationHintLocals;
+ scope.name = "Locals";
+ break;
+ case eScopeKindGlobals:
+ scope.name = "Globals";
+ break;
+ case eScopeKindRegisters:
+ scope.presentationHint = protocol::Scope::eScopePresentationHintRegisters;
+ scope.name = "Registers";
+ break;
}
- return variable;
+
+ return scope;
}
lldb::SBValue VariableReferenceStorage::GetVariable(var_ref_t var_ref) {
@@ -324,27 +426,23 @@ lldb::SBValue VariableReferenceStorage::GetVariable(var_ref_t var_ref) {
return {};
}
-var_ref_t
-VariableReferenceStorage::InsertVariable(const lldb::SBValue &variable,
- bool is_permanent) {
+var_ref_t VariableReferenceStorage::Insert(const lldb::SBValue &variable,
+ bool is_permanent) {
if (is_permanent)
- return m_permanent_kind_pool.Add(variable);
+ return m_permanent_kind_pool.Add<ExpandableValueStore>(variable);
- return m_temporary_kind_pool.Add(variable);
+ return m_temporary_kind_pool.Add<ExpandableValueStore>(variable);
}
-lldb::SBValue VariableReferenceStorage::FindVariable(var_ref_t var_ref,
- llvm::StringRef name) {
- if (VariableStore *store = GetVariableStore(var_ref))
- return store->FindVariable(name);
-
- return {};
+var_ref_t VariableReferenceStorage::Insert(const lldb::SBValueList &values) {
+ return m_permanent_kind_pool.Add<ExpandableValueListStore>(values);
}
std::vector<protocol::Scope>
-VariableReferenceStorage::CreateScopes(lldb::SBFrame &frame) {
+VariableReferenceStorage::Insert(const lldb::SBFrame &frame) {
auto create_scope = [&](ScopeKind kind) {
- const var_ref_t var_ref = m_scope_kind_pool.Add(kind, frame);
+ const var_ref_t var_ref =
+ m_temporary_kind_pool.Add<ScopeStore>(kind, frame);
const bool is_expensive = kind != eScopeKindLocals;
return CreateScope(kind, var_ref, is_expensive);
};
@@ -353,6 +451,14 @@ VariableReferenceStorage::CreateScopes(lldb::SBFrame &frame) {
create_scope(eScopeKindRegisters)};
}
+lldb::SBValue VariableReferenceStorage::FindVariable(var_ref_t var_ref,
+ llvm::StringRef name) {
+ if (VariableStore *store = GetVariableStore(var_ref))
+ return store->FindVariable(name);
+
+ return {};
+}
+
VariableStore *VariableReferenceStorage::GetVariableStore(var_ref_t var_ref) {
const ReferenceKind kind = var_ref.Kind();
switch (kind) {
@@ -360,8 +466,6 @@ VariableStore *VariableReferenceStorage::GetVariableStore(var_ref_t var_ref) {
return m_permanent_kind_pool.GetVariableStore(var_ref);
case eReferenceKindTemporary:
return m_temporary_kind_pool.GetVariableStore(var_ref);
- case eReferenceKindScope:
- return m_scope_kind_pool.GetVariableStore(var_ref);
default:
return nullptr;
}
diff --git a/lldb/tools/lldb-dap/Variables.h b/lldb/tools/lldb-dap/Variables.h
index 109e6f9077346..c5b048a9ace2d 100644
--- a/lldb/tools/lldb-dap/Variables.h
+++ b/lldb/tools/lldb-dap/Variables.h
@@ -55,6 +55,7 @@ class VariableStore {
const protocol::Configuration &config,
const protocol::VariablesArguments &args) = 0;
virtual lldb::SBValue FindVariable(llvm::StringRef name) = 0;
+ virtual lldb::SBValue GetVariable() const = 0;
// Not copyable.
VariableStore(const VariableStore &) = delete;
@@ -63,52 +64,6 @@ class VariableStore {
VariableStore &operator=(VariableStore &&) = default;
};
-/// A Variable store for fetching variables within a specific scope (locals,
-/// globals, or registers) for a given stack frame.
-class ScopeStore final : public VariableStore {
-public:
- explicit ScopeStore(ScopeKind kind, const lldb::SBFrame &frame)
- : m_frame(frame), m_kind(kind) {}
-
- std::vector<protocol::Variable>
- GetVariables(VariableReferenceStorage &storage,
- const protocol::Configuration &config,
- const protocol::VariablesArguments &args) override;
- lldb::SBValue FindVariable(llvm::StringRef name) override;
-
-private:
- void LoadVariables();
- void SetRegistersFormat();
- void AddReturnValue(VariableReferenceStorage &storage,
- const protocol::Configuration &config,
- std::vector<protocol::Variable> &variables,
- bool format_hex);
- lldb::SBFrame m_frame;
- lldb::SBValueList m_children;
- ScopeKind m_kind;
- bool m_variables_loaded = false;
-};
-
-/// Variable store for expandable values.
-///
-/// Manages children variables of complex types (structs, arrays, pointers,
-/// etc.) that can be expanded in the debugger UI.
-class ExpandableValueStore final : public VariableStore {
-
-public:
- explicit ExpandableValueStore(const lldb::SBValue &value) : m_value(value) {}
-
- std::vector<protocol::Variable>
- GetVariables(VariableReferenceStorage &storage,
- const protocol::Configuration &config,
- const protocol::VariablesArguments &args) override;
- lldb::SBValue FindVariable(llvm::StringRef name) override;
- [[nodiscard]] lldb::SBValue GetVariable() const { return m_value; };
-
-private:
- lldb::SBValue m_value;
-};
-
struct VariableReferenceStorage {
explicit VariableReferenceStorage(Log &log) : log(log) {}
/// \return a new variableReference.
@@ -123,16 +78,16 @@ struct VariableReferenceStorage {
/// Insert a new \p variable.
/// \return variableReference assigned to this expandable variable.
- var_ref_t InsertVariable(const lldb::SBValue &variable, bool is_permanent);
+ var_ref_t Insert(const lldb::SBValue &variable, bool is_permanent);
- lldb::SBValue FindVariable(var_ref_t var_ref, llvm::StringRef name);
+ /// Insert a new value list.
+ var_ref_t Insert(const lldb::SBValueList &values);
- std::vector<protocol::Scope> CreateScopes(lldb::SBFrame &frame);
+ std::vector<protocol::Scope> Insert(const lldb::SBFrame &frame);
- void Clear() {
- m_temporary_kind_pool.Clear();
- m_scope_kind_pool.Clear();
- }
+ lldb::SBValue FindVariable(var_ref_t var_ref, llvm::StringRef name);
+
+ void Clear() { m_temporary_kind_pool.Clear(); }
VariableStore *GetVariableStore(var_ref_t var_ref);
Log &log;
@@ -142,13 +97,9 @@ struct VariableReferenceStorage {
/// All references created starts from zero with the Reference kind mask
/// applied, the mask is then removed when fetching a variable store
///
- /// \tparam VariableStoreType
- /// The type of variable store to use.
- ///
/// \tparam ReferenceKind
/// The reference kind created in this pool
- template <typename VariableStoreType, protocol::ReferenceKind Kind>
- class ReferenceKindPool {
+ template <protocol::ReferenceKind Kind> class ReferenceKindPool {
public:
explicit ReferenceKindPool() = default;
@@ -162,15 +113,15 @@ struct VariableReferenceStorage {
m_pool.clear();
}
- VariableStoreType *GetVariableStore(var_ref_t var_ref) {
+ VariableStore *GetVariableStore(var_ref_t var_ref) {
const uint32_t raw_ref = var_ref.Reference();
if (raw_ref != 0 && raw_ref <= m_pool.size())
- return &m_pool[raw_ref - 1];
+ return m_pool[raw_ref - 1].get();
return nullptr;
}
- template <typename... Args> var_ref_t Add(Args &&...args) {
+ template <typename T, typename... Args> var_ref_t Add(Args &&...args) {
assert(reference_count == m_pool.size() &&
"Current reference_count must be the size of the pool");
@@ -180,7 +131,7 @@ struct VariableReferenceStorage {
return var_ref_t(var_ref_t::k_invalid_var_ref);
}
- m_pool.emplace_back(std::forward<Args>(args)...);
+ m_pool.emplace_back(std::make_unique<T>(std::forward<Args>(args)...));
const uint32_t raw_ref = NextRawReference();
return var_ref_t(raw_ref, Kind);
}
@@ -201,19 +152,15 @@ struct VariableReferenceStorage {
}
uint32_t reference_count = 0;
- std::vector<VariableStoreType> m_pool;
+ std::vector<std::unique_ptr<VariableStore>> m_pool;
};
/// Variables that are alive in this stop state.
/// Will be cleared when debuggee resumes.
- ReferenceKindPool<ExpandableValueStore, protocol::eReferenceKindTemporary>
- m_temporary_kind_pool;
+ ReferenceKindPool<protocol::eReferenceKindTemporary> m_temporary_kind_pool;
/// Variables that persist across entire debug session.
/// These are the variables evaluated from debug console REPL.
- ReferenceKindPool<ExpandableValueStore, protocol::eReferenceKindPermanent>
- m_permanent_kind_pool;
- ReferenceKindPool<ScopeStore, protocol::eReferenceKindScope>
- m_scope_kind_pool;
+ ReferenceKindPool<protocol::eReferenceKindPermanent> m_permanent_kind_pool;
};
} // namespace lldb_dap
diff --git a/lldb/unittests/DAP/Handler/DisconnectTest.cpp b/lldb/unittests/DAP/Handler/DisconnectTest.cpp
index 212c5698feea8..05e71534ae455 100644
--- a/lldb/unittests/DAP/Handler/DisconnectTest.cpp
+++ b/lldb/unittests/DAP/Handler/DisconnectTest.cpp
@@ -44,17 +44,18 @@ TEST_F(DisconnectRequestHandlerTest, DisconnectTriggersTerminateCommands) {
LoadCore();
- DisconnectRequestHandler handler(*dap);
-
dap->configuration.terminateCommands = {"?script print(1)",
"script print(2)"};
EXPECT_EQ(dap->target.GetProcess().GetState(), lldb::eStateStopped);
+
+ DisconnectRequestHandler handler(*dap);
ASSERT_THAT_ERROR(handler.Run(std::nullopt), Succeeded());
- EXPECT_CALL(client, Received(Output("1\n")));
- EXPECT_CALL(client, Received(Output("2\n"))).Times(2);
- EXPECT_CALL(client, Received(Output("(lldb) script print(2)\n")));
+
EXPECT_CALL(client, Received(Output("Running terminateCommands:\n")));
+ EXPECT_CALL(client, Received(Output("(lldb) script print(2)\n")));
+ EXPECT_CALL(client, Received(Output("2\n")));
EXPECT_CALL(client, Received(IsEvent("terminated", _)));
+
Run();
}
#endif
diff --git a/lldb/unittests/DAP/TestBase.cpp b/lldb/unittests/DAP/TestBase.cpp
index 39634593779ad..fe9026e285c58 100644
--- a/lldb/unittests/DAP/TestBase.cpp
+++ b/lldb/unittests/DAP/TestBase.cpp
@@ -20,6 +20,7 @@
#include "llvm/Support/Error.h"
#include "llvm/Testing/Support/Error.h"
#include "gtest/gtest.h"
+#include <chrono>
#include <cstdio>
#include <memory>
@@ -37,7 +38,7 @@ using lldb_private::Pipe;
void TransportBase::SetUp() {
std::tie(to_client, to_server) = TestDAPTransport::createPair(loop);
- log = std::make_unique<Log>(llvm::outs(), log_mutex);
+ log = std::make_unique<Log>(llvm::errs(), log_mutex);
dap = std::make_unique<DAP>(
/*log=*/*log,
/*default_repl_mode=*/ReplMode::Auto,
@@ -51,13 +52,17 @@ void TransportBase::SetUp() {
}
void TransportBase::Run() {
- bool addition_succeeded = loop.AddPendingCallback(
- [](lldb_private::MainLoopBase &loop) { loop.RequestTermination(); });
+ bool addition_succeeded = loop.AddCallback(
+ [](lldb_private::MainLoopBase &loop) {
+ llvm::errs() << "Terminating\n";
+ loop.RequestTermination();
+ },
+ std::chrono::seconds(1));
EXPECT_TRUE(addition_succeeded);
EXPECT_THAT_ERROR(loop.Run().takeError(), llvm::Succeeded());
}
-void DAPTestBase::SetUp() { TransportBase::SetUp(); }
+// void DAPTestBase::SetUp() { TransportBase::SetUp(); }
void DAPTestBase::TearDown() {
if (core)
@@ -102,13 +107,9 @@ void DAPTestBase::CreateDebugger() {
ASSERT_THAT_ERROR(dap->ConfigureIO(dev_null_stream, dev_null_stream),
Succeeded());
- dap->debugger.SetInputFile(dap->in);
- auto out_fd = dap->out.GetWriteFileDescriptor();
- ASSERT_THAT_EXPECTED(out_fd, Succeeded());
- dap->debugger.SetOutputFile(lldb::SBFile(*out_fd, "w", false));
- auto err_fd = dap->out.GetWriteFileDescriptor();
- ASSERT_THAT_EXPECTED(err_fd, Succeeded());
- dap->debugger.SetErrorFile(lldb::SBFile(*err_fd, "w", false));
+ dap->no_lldbinit = true;
+ ASSERT_THAT_ERROR(dap->InitializeDebugger(), Succeeded());
+ ASSERT_THAT_ERROR(dap->ActivateRepl(), Succeeded());
}
void DAPTestBase::LoadCore() {
diff --git a/lldb/unittests/DAP/TestBase.h b/lldb/unittests/DAP/TestBase.h
index c354829377434..a33f7a75def49 100644
--- a/lldb/unittests/DAP/TestBase.h
+++ b/lldb/unittests/DAP/TestBase.h
@@ -109,7 +109,6 @@ class DAPTestBase : public TransportBase {
static void SetUpTestSuite();
static void TeatUpTestSuite();
- void SetUp() override;
void TearDown() override;
bool GetDebuggerSupportsTarget(llvm::StringRef platform);
>From d8867de6deb5c4950229477b8d6ea7338f6fad46 Mon Sep 17 00:00:00 2001
From: John Harrison <harjohn at google.com>
Date: Tue, 10 Feb 2026 15:36:42 -0800
Subject: [PATCH 02/12] Remove testing code.
---
.../Python/lldbsuite/test/tools/lldb-dap/dap_server.py | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/lldb/packages/Python/lldbsuite/test/tools/lldb-dap/dap_server.py b/lldb/packages/Python/lldbsuite/test/tools/lldb-dap/dap_server.py
index 8084bfd594f0f..45b7efb838563 100644
--- a/lldb/packages/Python/lldbsuite/test/tools/lldb-dap/dap_server.py
+++ b/lldb/packages/Python/lldbsuite/test/tools/lldb-dap/dap_server.py
@@ -441,10 +441,9 @@ def _process_recv_packets(self) -> None:
with self._recv_condition:
for packet in self._recv_packets:
if packet and ("seq" not in packet or packet["seq"] == 0):
- pass
- # raise ValueError(
- # f"received a malformed packet, expected 'seq != 0' for {packet!r}"
- # )
+ raise ValueError(
+ f"received a malformed packet, expected 'seq != 0' for {packet!r}"
+ )
if packet:
self._log.messages.append((Log.Dir.RECV, packet))
# Handle events that may modify any stateful properties of
>From bb861cc280dec0bf8e21b54333bcbeac383d4cf6 Mon Sep 17 00:00:00 2001
From: John Harrison <harjohn at google.com>
Date: Wed, 11 Feb 2026 15:16:24 -0800
Subject: [PATCH 03/12] Correcting the stopped-events tests.
---
.../packages/Python/lldbsuite/test/tools/lldb-dap/dap_server.py | 2 --
1 file changed, 2 deletions(-)
diff --git a/lldb/packages/Python/lldbsuite/test/tools/lldb-dap/dap_server.py b/lldb/packages/Python/lldbsuite/test/tools/lldb-dap/dap_server.py
index 45b7efb838563..53ef0a8e5d553 100644
--- a/lldb/packages/Python/lldbsuite/test/tools/lldb-dap/dap_server.py
+++ b/lldb/packages/Python/lldbsuite/test/tools/lldb-dap/dap_server.py
@@ -495,8 +495,6 @@ def _handle_event(self, packet: Event) -> None:
# reasons since the 'threads' command doesn't return
# that information.
self._process_stopped()
- if "allThreadsStopped" in body and body["allThreadsStopped"]:
- self.thread_stop_reasons = {}
if "threadId" in body:
tid = body["threadId"]
self.thread_stop_reasons[tid] = body
>From 37cb86c31c34d5e528ad183d9c471f35eda3d1b5 Mon Sep 17 00:00:00 2001
From: John Harrison <harjohn at google.com>
Date: Wed, 11 Feb 2026 16:22:49 -0800
Subject: [PATCH 04/12] Fixing DAPTests.
---
lldb/tools/lldb-dap/DAP.cpp | 24 +++++++++++++-----------
lldb/unittests/DAP/TestBase.cpp | 14 ++------------
2 files changed, 15 insertions(+), 23 deletions(-)
diff --git a/lldb/tools/lldb-dap/DAP.cpp b/lldb/tools/lldb-dap/DAP.cpp
index 12d155ce7497b..4fe306c20a870 100644
--- a/lldb/tools/lldb-dap/DAP.cpp
+++ b/lldb/tools/lldb-dap/DAP.cpp
@@ -301,17 +301,19 @@ llvm::Error DAP::ConfigureIO(std::FILE *overrideOut, std::FILE *overrideErr) {
std::tie(primary, replica) = *io;
- if (auto Error = stdout_redirect.RedirectTo(
- overrideOut, [this](llvm::StringRef output) {
- SendOutput(OutputType::Console, output);
- }))
- return Error;
-
- if (auto Error = stderr_redirect.RedirectTo(
- overrideErr, [this](llvm::StringRef output) {
- SendOutput(OutputType::Console, output);
- }))
- return Error;
+ if (overrideOut)
+ if (auto Error = stdout_redirect.RedirectTo(
+ overrideOut, [this](llvm::StringRef output) {
+ SendOutput(OutputType::Console, output);
+ }))
+ return Error;
+
+ if (overrideErr)
+ if (auto Error = stderr_redirect.RedirectTo(
+ overrideErr, [this](llvm::StringRef output) {
+ SendOutput(OutputType::Console, output);
+ }))
+ return Error;
return llvm::Error::success();
}
diff --git a/lldb/unittests/DAP/TestBase.cpp b/lldb/unittests/DAP/TestBase.cpp
index fe9026e285c58..4f9fdc425f59a 100644
--- a/lldb/unittests/DAP/TestBase.cpp
+++ b/lldb/unittests/DAP/TestBase.cpp
@@ -29,9 +29,6 @@ using namespace lldb;
using namespace lldb_dap;
using namespace lldb_dap::protocol;
using namespace lldb_dap_tests;
-using lldb_private::File;
-using lldb_private::FileSpec;
-using lldb_private::FileSystem;
using lldb_private::MainLoop;
using lldb_private::Pipe;
@@ -98,18 +95,11 @@ void DAPTestBase::CreateDebugger() {
ASSERT_TRUE(dap->debugger);
dap->target = dap->debugger.GetDummyTarget();
- Expected<lldb::FileUP> dev_null = FileSystem::Instance().Open(
- FileSpec(FileSystem::DEV_NULL), File::eOpenOptionReadWrite);
- ASSERT_THAT_EXPECTED(dev_null, Succeeded());
- lldb::FileSP dev_null_sp = std::move(*dev_null);
-
- std::FILE *dev_null_stream = dev_null_sp->GetStream();
- ASSERT_THAT_ERROR(dap->ConfigureIO(dev_null_stream, dev_null_stream),
- Succeeded());
+ ASSERT_THAT_ERROR(dap->ConfigureIO(), Succeeded());
dap->no_lldbinit = true;
ASSERT_THAT_ERROR(dap->InitializeDebugger(), Succeeded());
- ASSERT_THAT_ERROR(dap->ActivateRepl(), Succeeded());
+ dap->ActivateRepl();
}
void DAPTestBase::LoadCore() {
>From 302ac19da20d72025bab4afc1cf0fe77cac6a984 Mon Sep 17 00:00:00 2001
From: John Harrison <ash at greaterthaninfinity.com>
Date: Thu, 12 Feb 2026 09:58:41 -0800
Subject: [PATCH 05/12] Apply suggestions from code review
Co-authored-by: Ebuka Ezike <yerimyah1 at gmail.com>
---
lldb/test/API/tools/lldb-dap/cancel/TestDAP_cancel.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lldb/test/API/tools/lldb-dap/cancel/TestDAP_cancel.py b/lldb/test/API/tools/lldb-dap/cancel/TestDAP_cancel.py
index 8429941ad574f..4b3e83e3bb57a 100644
--- a/lldb/test/API/tools/lldb-dap/cancel/TestDAP_cancel.py
+++ b/lldb/test/API/tools/lldb-dap/cancel/TestDAP_cancel.py
@@ -36,7 +36,7 @@ def test_pending_request(self):
Tests cancelling a pending request.
"""
program = self.getBuildArtifact("a.out")
- busy_loop = os.path.join(os.path.dirname(__file__), "busy_loop.py")
+ busy_loop = self.getSourcePath("busy_loop.py")
self.build_and_launch(
program,
initCommands=[f"command script import {busy_loop}"],
>From 28c00e58ccedcf0d5c40f7fcc831cdd09c945dab Mon Sep 17 00:00:00 2001
From: John Harrison <harjohn at google.com>
Date: Thu, 12 Feb 2026 13:01:31 -0800
Subject: [PATCH 06/12] Fixing formatting and avoiding the FileSystem instance
API.
---
.../tools/lldb-dap/cancel/TestDAP_cancel.py | 2 +-
lldb/tools/lldb-dap/DAP.cpp | 14 ++++++---
.../Handler/EvaluateRequestHandler.cpp | 29 ++++++++++---------
3 files changed, 26 insertions(+), 19 deletions(-)
diff --git a/lldb/test/API/tools/lldb-dap/cancel/TestDAP_cancel.py b/lldb/test/API/tools/lldb-dap/cancel/TestDAP_cancel.py
index 4b3e83e3bb57a..0b413685240f0 100644
--- a/lldb/test/API/tools/lldb-dap/cancel/TestDAP_cancel.py
+++ b/lldb/test/API/tools/lldb-dap/cancel/TestDAP_cancel.py
@@ -36,7 +36,7 @@ def test_pending_request(self):
Tests cancelling a pending request.
"""
program = self.getBuildArtifact("a.out")
- busy_loop = self.getSourcePath("busy_loop.py")
+ busy_loop = self.getSourcePath("busy_loop.py")
self.build_and_launch(
program,
initCommands=[f"command script import {busy_loop}"],
diff --git a/lldb/tools/lldb-dap/DAP.cpp b/lldb/tools/lldb-dap/DAP.cpp
index 4fe306c20a870..181da2aed05ed 100644
--- a/lldb/tools/lldb-dap/DAP.cpp
+++ b/lldb/tools/lldb-dap/DAP.cpp
@@ -28,7 +28,6 @@
#include "lldb/API/SBEvent.h"
#include "lldb/API/SBLanguageRuntime.h"
#include "lldb/API/SBListener.h"
-#include "lldb/API/SBMutex.h"
#include "lldb/API/SBProcess.h"
#include "lldb/Host/File.h"
#include "lldb/Host/MainLoop.h"
@@ -46,6 +45,7 @@
#include "llvm/ADT/StringRef.h"
#include "llvm/ADT/Twine.h"
#include "llvm/Support/Chrono.h"
+#include "llvm/Support/Errno.h"
#include "llvm/Support/Error.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/FormatVariadic.h"
@@ -227,6 +227,9 @@ ExceptionBreakpoint *DAP::GetExceptionBreakpoint(const lldb::break_id_t bp_id) {
llvm::Expected<std::pair<IOWrapper, IOWrapper>>
IOWrapper::CreatePseudoTerminal() {
+#ifdef WIN32
+ return llvm::createStringError("not supported");
+#else
// For testing purposes return an error to cause us to fallback to a pair of
// pipes.
if (getenv("LLDB_DAP_FORCE_REPL_PIPE"))
@@ -235,8 +238,11 @@ IOWrapper::CreatePseudoTerminal() {
lldb_private::PseudoTerminal pty;
if (auto err = pty.OpenFirstAvailablePrimary(O_RDWR | O_NOCTTY | O_CLOEXEC))
return err;
- if (auto err = pty.OpenSecondary(O_RDWR | O_NOCTTY | O_CLOEXEC))
- return err;
+ int replica_fd =
+ llvm::sys::RetryAfterSignal(-1, ::open, pty.GetSecondaryName().c_str(),
+ O_RDWR | O_NOCTTY | O_CLOEXEC);
+ if (replica_fd == -1)
+ return llvm::errorCodeToError(llvm::errnoAsErrorCode());
lldb_private::Terminal term(pty.GetPrimaryFileDescriptor());
if (llvm::Error err = term.SetCanonical(false))
@@ -245,7 +251,6 @@ IOWrapper::CreatePseudoTerminal() {
return err;
int primary_fd = pty.ReleasePrimaryFileDescriptor();
- int replica_fd = pty.ReleaseSecondaryFileDescriptor();
return std::make_pair(
IOWrapper(
@@ -258,6 +263,7 @@ IOWrapper::CreatePseudoTerminal() {
replica_fd, lldb_private::File::eOpenOptionReadOnly, false),
/*write=*/std::make_shared<lldb_private::NativeFile>(
replica_fd, lldb_private::File::eOpenOptionWriteOnly, true)));
+#endif
}
// Hookup a pair of pipes such that reading from one writes to the other.
diff --git a/lldb/tools/lldb-dap/Handler/EvaluateRequestHandler.cpp b/lldb/tools/lldb-dap/Handler/EvaluateRequestHandler.cpp
index 6e293e408f823..0d81c8ef70515 100644
--- a/lldb/tools/lldb-dap/Handler/EvaluateRequestHandler.cpp
+++ b/lldb/tools/lldb-dap/Handler/EvaluateRequestHandler.cpp
@@ -52,6 +52,12 @@ static lldb::SBValue EvaluateVariableExpression(lldb::SBTarget &target,
return value;
}
+/// Check if we need to run `expr` as an lldb command or as a variable
+/// expression.
+static bool IsReplCommand(DAP &dap, lldb::SBFrame &frame, std::string &expr) {
+ return dap.DetectReplMode(frame, expr, false) == ReplMode::Command;
+}
+
/// Evaluates the given expression in the context of a stack frame.
///
/// The expression has access to any variables and arguments that are in scope.
@@ -64,21 +70,12 @@ EvaluateRequestHandler::Run(const EvaluateArguments &arguments) const {
const bool run_as_expression = arguments.context != eEvaluateContextHover;
lldb::SBValue value;
- if (arguments.context == protocol::eEvaluateContextRepl &&
- dap.DetectReplMode(frame, expression, false) == ReplMode::Command) {
- const lldb::StateType process_state = dap.target.GetProcess().GetState();
- if (!lldb::SBDebugger::StateIsStoppedState(process_state))
- return llvm::make_error<DAPError>(
- "Cannot evaluate expressions while the process is running. Pause "
- "the process and try again.",
- /**error_code=*/llvm::inconvertibleErrorCode(),
- /**show_user=*/false);
-
- // If we're evaluating a command relative to the current frame, set the
- // focus_tid to the current frame for any thread related events.
- if (frame.IsValid())
- dap.focus_tid = frame.GetThread().GetThreadID();
+ // If we're evaluating a command relative to the current frame, set the
+ // focus_tid to the current frame for any thread related events.
+ if (frame.IsValid())
+ dap.focus_tid = frame.GetThread().GetThreadID();
+ if (is_repl_context && IsReplCommand(dap, frame, expression)) {
Expected<std::pair<std::string, lldb::SBValueList>> result =
EvaluateContext::Run(dap, expression + "\n");
if (!result)
@@ -94,12 +91,16 @@ EvaluateRequestHandler::Run(const EvaluateArguments &arguments) const {
body.variablesReference = dap.reference_storage.Insert(result->second);
}
} else {
+ if (dap.ProcessIsNotStopped())
+ return llvm::make_error<NotStoppedError>();
+
value = EvaluateVariableExpression(dap.target, frame, expression,
run_as_expression);
if (value.GetError().Fail())
return ToError(value.GetError(), /*show_user=*/false);
+ // Freeze dry the value in case users expand it later in the debug console
if (is_repl_context)
value = value.Persist();
>From e431e37ac63bba86592b9afac09b8cdde469fdea Mon Sep 17 00:00:00 2001
From: John Harrison <harjohn at google.com>
Date: Thu, 12 Feb 2026 15:34:13 -0800
Subject: [PATCH 07/12] Cleaning up commit
---
lldb/tools/lldb-dap/DAP.cpp | 11 +++++++++++
lldb/tools/lldb-dap/EventHelper.cpp | 1 -
lldb/tools/lldb-dap/ProgressEvent.cpp | 3 +++
lldb/tools/lldb-dap/Variables.h | 3 ++-
lldb/unittests/DAP/TestBase.cpp | 11 +++--------
lldb/unittests/DAP/TestBase.h | 4 ++--
6 files changed, 21 insertions(+), 12 deletions(-)
diff --git a/lldb/tools/lldb-dap/DAP.cpp b/lldb/tools/lldb-dap/DAP.cpp
index 181da2aed05ed..1162a23d30544 100644
--- a/lldb/tools/lldb-dap/DAP.cpp
+++ b/lldb/tools/lldb-dap/DAP.cpp
@@ -228,6 +228,8 @@ ExceptionBreakpoint *DAP::GetExceptionBreakpoint(const lldb::break_id_t bp_id) {
llvm::Expected<std::pair<IOWrapper, IOWrapper>>
IOWrapper::CreatePseudoTerminal() {
#ifdef WIN32
+ // Fallback to a pair of pipes until we have better support for a
+ // PsuedoConsole on Windows.
return llvm::createStringError("not supported");
#else
// For testing purposes return an error to cause us to fallback to a pair of
@@ -238,6 +240,15 @@ IOWrapper::CreatePseudoTerminal() {
lldb_private::PseudoTerminal pty;
if (auto err = pty.OpenFirstAvailablePrimary(O_RDWR | O_NOCTTY | O_CLOEXEC))
return err;
+
+ // We cannot use 'lldb_private::PseudoTerminal::OpenSecondary()' because it
+ // references 'lldb_private::FileSystem'. FileSystem not part of the SBAPI and
+ // would be statically linked into lldb-dap and liblldb. However, if liblldb
+ // is built as a static library then we will end up initializing it twice if
+ // we call 'lldb_private::FileSystem::Initialize()' which can trigger asserts
+ // depending on the build settings.
+ //
+ // For now, avoid this API and call 'open' directly.
int replica_fd =
llvm::sys::RetryAfterSignal(-1, ::open, pty.GetSecondaryName().c_str(),
O_RDWR | O_NOCTTY | O_CLOEXEC);
diff --git a/lldb/tools/lldb-dap/EventHelper.cpp b/lldb/tools/lldb-dap/EventHelper.cpp
index 5b119140f9225..80c129bd50008 100644
--- a/lldb/tools/lldb-dap/EventHelper.cpp
+++ b/lldb/tools/lldb-dap/EventHelper.cpp
@@ -27,7 +27,6 @@
#include "lldb/API/SBPlatform.h"
#include "lldb/API/SBStream.h"
#include "lldb/API/SBThread.h"
-#include "lldb/API/SBThreadCollection.h"
#include "lldb/lldb-defines.h"
#include "lldb/lldb-types.h"
#include "llvm/Support/Error.h"
diff --git a/lldb/tools/lldb-dap/ProgressEvent.cpp b/lldb/tools/lldb-dap/ProgressEvent.cpp
index 33964922e1ad7..9d84c7b353f37 100644
--- a/lldb/tools/lldb-dap/ProgressEvent.cpp
+++ b/lldb/tools/lldb-dap/ProgressEvent.cpp
@@ -114,6 +114,9 @@ json::Value ProgressEvent::ToJSON() const {
if (m_event_type == progressStart) {
EmplaceSafeString(body, "title", m_message);
+ // Cancel will set `lldb::SBDebugger::RequestInterrupt()`, which may cause
+ // co-operative tasks to stop early. This is a best effort only, not all
+ // operations can be interrupted.
body.try_emplace("cancellable", true);
}
diff --git a/lldb/tools/lldb-dap/Variables.h b/lldb/tools/lldb-dap/Variables.h
index c5b048a9ace2d..6bdef62cd6863 100644
--- a/lldb/tools/lldb-dap/Variables.h
+++ b/lldb/tools/lldb-dap/Variables.h
@@ -80,7 +80,8 @@ struct VariableReferenceStorage {
/// \return variableReference assigned to this expandable variable.
var_ref_t Insert(const lldb::SBValue &variable, bool is_permanent);
- /// Insert a new value list.
+ /// Insert a value list. Used to store references to lldb repl command
+ /// outputs.
var_ref_t Insert(const lldb::SBValueList &values);
std::vector<protocol::Scope> Insert(const lldb::SBFrame &frame);
diff --git a/lldb/unittests/DAP/TestBase.cpp b/lldb/unittests/DAP/TestBase.cpp
index 4f9fdc425f59a..705466c500d28 100644
--- a/lldb/unittests/DAP/TestBase.cpp
+++ b/lldb/unittests/DAP/TestBase.cpp
@@ -48,19 +48,14 @@ void TransportBase::SetUp() {
EXPECT_THAT_ERROR(to_client->RegisterMessageHandler(client), Succeeded());
}
-void TransportBase::Run() {
+void TransportBase::Run(std::chrono::milliseconds delay) {
bool addition_succeeded = loop.AddCallback(
- [](lldb_private::MainLoopBase &loop) {
- llvm::errs() << "Terminating\n";
- loop.RequestTermination();
- },
- std::chrono::seconds(1));
+ [](lldb_private::MainLoopBase &loop) { loop.RequestTermination(); },
+ delay);
EXPECT_TRUE(addition_succeeded);
EXPECT_THAT_ERROR(loop.Run().takeError(), llvm::Succeeded());
}
-// void DAPTestBase::SetUp() { TransportBase::SetUp(); }
-
void DAPTestBase::TearDown() {
if (core)
ASSERT_THAT_ERROR(core->discard(), Succeeded());
diff --git a/lldb/unittests/DAP/TestBase.h b/lldb/unittests/DAP/TestBase.h
index a33f7a75def49..7f390fd082897 100644
--- a/lldb/unittests/DAP/TestBase.h
+++ b/lldb/unittests/DAP/TestBase.h
@@ -17,12 +17,12 @@
#include "lldb/Host/FileSystem.h"
#include "lldb/Host/HostInfo.h"
#include "lldb/Host/MainLoop.h"
-#include "lldb/Host/MainLoopBase.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/Support/FileSystem.h"
#include "llvm/Support/JSON.h"
#include "gmock/gmock.h"
#include "gtest/gtest.h"
+#include <chrono>
#include <memory>
#include <optional>
@@ -71,7 +71,7 @@ class TransportBase : public testing::Test {
void SetUp() override;
- void Run();
+ void Run(std::chrono::milliseconds delay = std::chrono::milliseconds(1000));
};
/// A matcher for a DAP event.
>From 5f2934b8a2ef41b957c3fc8f2e83da916ef2adf4 Mon Sep 17 00:00:00 2001
From: John Harrison <harjohn at google.com>
Date: Mon, 23 Feb 2026 10:34:17 -0800
Subject: [PATCH 08/12] Correcting rebase.
---
.../lldb-dap/variables/TestDAP_variables.py | 4 +-
lldb/tools/lldb-dap/Variables.cpp | 58 ++++++++++---------
2 files changed, 34 insertions(+), 28 deletions(-)
diff --git a/lldb/test/API/tools/lldb-dap/variables/TestDAP_variables.py b/lldb/test/API/tools/lldb-dap/variables/TestDAP_variables.py
index 4b777dedb0f8d..175cc2470333c 100644
--- a/lldb/test/API/tools/lldb-dap/variables/TestDAP_variables.py
+++ b/lldb/test/API/tools/lldb-dap/variables/TestDAP_variables.py
@@ -621,9 +621,9 @@ def do_test_scopes_and_evaluate_expansion(self, enableAutoVariableSummaries: boo
var_ref = permanent_expandable_ref
response = self.dap_server.request_variables(var_ref)
- self.assertFalse(
+ self.assertTrue(
response["success"],
- f"variable reference should be out of scope in {response}",
+ f"variable reference {var_ref} should be out of scope in {response}",
)
# Test that frame scopes have corresponding presentation hints.
diff --git a/lldb/tools/lldb-dap/Variables.cpp b/lldb/tools/lldb-dap/Variables.cpp
index 5e76068604fd4..7891ee64ac9fc 100644
--- a/lldb/tools/lldb-dap/Variables.cpp
+++ b/lldb/tools/lldb-dap/Variables.cpp
@@ -319,44 +319,50 @@ class ExpandableValueListStore final : public VariableStore {
GetVariables(VariableReferenceStorage &storage,
const protocol::Configuration &config,
const protocol::VariablesArguments &args) override {
- const var_ref_t var_ref = args.variablesReference;
+ const bool format_hex = args.format ? args.format->hex : false;
const uint64_t count = args.count;
- const uint64_t start = args.start;
- const bool hex = args.format ? args.format->hex : false;
-
- // We are expanding a variable that has children, so we will return its
- // children.
+ const uint32_t start_idx = 0;
+ const uint32_t num_children = m_value_list.GetSize();
+ const uint32_t end_idx = start_idx + ((count == 0) ? num_children : count);
std::vector<Variable> variables;
- const bool is_permanent = var_ref.Kind() == eReferenceKindPermanent;
- auto addChild = [&](lldb::SBValue child,
- std::optional<llvm::StringRef> custom_name = {}) {
- if (!child.IsValid())
- return;
- const var_ref_t child_var_ref = storage.Insert(child, is_permanent);
- if (LLVM_UNLIKELY(child_var_ref.AsUInt32() ==
+ // We first find out which variable names are duplicated.
+ std::map<llvm::StringRef, uint32_t> variable_name_counts;
+ for (auto i = start_idx; i < end_idx; ++i) {
+ lldb::SBValue variable = m_value_list.GetValueAtIndex(i);
+ if (!variable.IsValid())
+ break;
+ variable_name_counts[GetNonNullVariableName(variable)]++;
+ }
+
+ // Now we construct the result with unique display variable names.
+ for (auto i = start_idx; i < end_idx; ++i) {
+ lldb::SBValue variable = m_value_list.GetValueAtIndex(i);
+
+ if (!variable.IsValid() || !variable.IsInScope())
+ continue;
+
+ const var_ref_t frame_var_ref =
+ storage.Insert(variable, /*is_permanent=*/true);
+ if (LLVM_UNLIKELY(frame_var_ref.AsUInt32() >=
var_ref_t::k_variables_reference_threshold)) {
DAP_LOG(storage.log,
- "warning: {} variablesReference threshold reached. "
+ "warning: scopes variablesReference threshold reached. "
"current: {} threshold: {}, maximum {}.",
- (is_permanent ? "permanent" : "temporary"),
- child_var_ref.AsUInt32(),
+ frame_var_ref.AsUInt32(),
var_ref_t::k_variables_reference_threshold,
var_ref_t::k_max_variables_references);
}
+ if (LLVM_UNLIKELY(frame_var_ref.Kind() == eReferenceKindInvalid))
+ break;
+
variables.emplace_back(CreateVariable(
- child, child_var_ref, hex, config.enableAutoVariableSummaries,
+ variable, frame_var_ref, format_hex,
+ config.enableAutoVariableSummaries,
config.enableSyntheticChildDebugging,
- /*is_name_duplicated=*/false, custom_name));
- };
-
- const uint32_t num_children = m_value_list.GetSize();
- const uint32_t end_idx = start + ((count == 0) ? num_children : count);
- uint32_t i = start;
- for (; i < end_idx && i < num_children; ++i)
- addChild(m_value_list.GetValueAtIndex(i));
-
+ variable_name_counts[GetNonNullVariableName(variable)] > 1));
+ }
return variables;
}
>From 712a738327d8a924504de5e817445c81d0669e35 Mon Sep 17 00:00:00 2001
From: John Harrison <harjohn at google.com>
Date: Tue, 24 Feb 2026 13:00:28 -0800
Subject: [PATCH 09/12] Updating the linux a.out and core to have a variable in
the frame and using that in VariablesTest.cpp to validate the variable
loading behavior.
---
lldb/tools/lldb-dap/Protocol/DAPTypes.h | 4 +-
lldb/unittests/DAP/DAPTypesTest.cpp | 20 +-
.../DAP/Inputs/linux-x86_64.core.yaml | 867 +++++++++++++++++-
.../DAP/Inputs/linux-x86_64.out.yaml | 630 +++++++++++--
lldb/unittests/DAP/VariablesTest.cpp | 119 ++-
5 files changed, 1495 insertions(+), 145 deletions(-)
diff --git a/lldb/tools/lldb-dap/Protocol/DAPTypes.h b/lldb/tools/lldb-dap/Protocol/DAPTypes.h
index 5c5d279656d83..5564489cf2e69 100644
--- a/lldb/tools/lldb-dap/Protocol/DAPTypes.h
+++ b/lldb/tools/lldb-dap/Protocol/DAPTypes.h
@@ -28,8 +28,7 @@ namespace lldb_dap::protocol {
enum ReferenceKind : uint8_t {
eReferenceKindTemporary = 0,
eReferenceKindPermanent = 1,
- eReferenceKindScope = 1 << 1,
- eReferenceKindInvalid = 0xFF
+ eReferenceKindInvalid = 0xFF,
};
/// The var_ref_t hold two values, the `ReferenceKind` and the
@@ -63,7 +62,6 @@ struct var_ref_t {
switch (current_kind) {
case eReferenceKindTemporary:
case eReferenceKindPermanent:
- case eReferenceKindScope:
return current_kind;
default:
return eReferenceKindInvalid;
diff --git a/lldb/unittests/DAP/DAPTypesTest.cpp b/lldb/unittests/DAP/DAPTypesTest.cpp
index 0e6cd26abe2eb..81ebd3f51fa94 100644
--- a/lldb/unittests/DAP/DAPTypesTest.cpp
+++ b/lldb/unittests/DAP/DAPTypesTest.cpp
@@ -61,22 +61,16 @@ TEST(DAPTypesTest, DAPSymbol) {
TEST(DapTypesTest, DAP_var_ref_t) {
// Check the masked ref constructor.
- const uint32_t scope_masked_var_ref = 0x2000001;
- const var_ref_t scope_ref(scope_masked_var_ref);
- EXPECT_EQ(scope_ref.AsUInt32(), scope_masked_var_ref);
- EXPECT_EQ(scope_ref.Reference(), 1U);
- EXPECT_EQ(scope_ref.Kind(), eReferenceKindScope);
-
- const uint32_t temp_masked_var_ref = 0x0000021;
+ const uint32_t temp_masked_var_ref = 0x00000201U;
const var_ref_t temp_ref(temp_masked_var_ref);
EXPECT_EQ(temp_ref.AsUInt32(), temp_masked_var_ref);
- EXPECT_EQ(temp_ref.Reference(), 0x21U);
+ EXPECT_EQ(temp_ref.Reference(), 0x0201U);
EXPECT_EQ(temp_ref.Kind(), eReferenceKindTemporary);
- const uint32_t perm_masked_var_ref = 0x1000032;
+ const uint32_t perm_masked_var_ref = 0x1000032U;
const var_ref_t perm_ref(perm_masked_var_ref);
EXPECT_EQ(perm_ref.AsUInt32(), perm_masked_var_ref);
- EXPECT_EQ(perm_ref.Reference(), 0x32U);
+ EXPECT_EQ(perm_ref.Reference(), 0x032U);
EXPECT_EQ(perm_ref.Kind(), eReferenceKindPermanent);
const var_ref_t invalid_ref{};
@@ -96,11 +90,11 @@ TEST(DapTypesTest, DAP_var_ref_t) {
EXPECT_EQ(no_child_ref.Kind(), eReferenceKindTemporary);
// Check the refkind constructor.
- const uint32_t scope2_masked_ref = 0x2000003;
- const var_ref_t scope_ref2(3, eReferenceKindScope);
+ const uint32_t scope2_masked_ref = 0x0000003;
+ const var_ref_t scope_ref2(3, eReferenceKindTemporary);
EXPECT_EQ(scope_ref2.AsUInt32(), scope2_masked_ref);
EXPECT_EQ(scope_ref2.Reference(), 3U);
- EXPECT_EQ(scope_ref2.Kind(), eReferenceKindScope);
+ EXPECT_EQ(scope_ref2.Kind(), eReferenceKindTemporary);
EXPECT_EQ(var_ref_t().AsUInt32(),
var_ref_t{var_ref_t::k_invalid_var_ref}.AsUInt32());
diff --git a/lldb/unittests/DAP/Inputs/linux-x86_64.core.yaml b/lldb/unittests/DAP/Inputs/linux-x86_64.core.yaml
index 392418f7e82de..30ec3b9c0a7df 100644
--- a/lldb/unittests/DAP/Inputs/linux-x86_64.core.yaml
+++ b/lldb/unittests/DAP/Inputs/linux-x86_64.core.yaml
@@ -1,49 +1,850 @@
+# Built using:
+# clang -g sample.c # from linux-x86_64.out.yaml
+# lldb a.out -b -o 'break set -l 6 -C "process save-core -s stack -pminidump a.out.core"' -o 'r'
--- !minidump
Streams:
+ - Type: LLDBGenerated
+ Content: ''
- Type: SystemInfo
Processor Arch: AMD64
Platform ID: Linux
+ CPU:
+ Vendor ID: "\0\0\0\0\0\0\0\0\0\0\0\0"
+ Version Info: 0x0
+ Feature Info: 0x0
- Type: ModuleList
Modules:
- - Base of Image: 0x400000
- Size of Image: 0x1E0
- Time Date Stamp: 1747851624
- Module Name: 'linux-x86_64.out'
- CodeView Record: 4C45704201DF54A6045E657D3F8FFB9CE111878914F8BD6D
- Reserved0: 0xFFFFFFF800000001
- Reserved1: 0x2AE15B07FFFFFFF
- - Base of Image: 0x7FFC24129000
- Size of Image: 0xA0C
- Time Date Stamp: 1747851624
- Module Name: '[vdso](0x00007ffc24129000)'
- CodeView Record: 4C4570428CBE1E6C351152C0C43E68C4EF417DB4C77E8EBD
- Reserved0: 0xFFFFFFF800000001
- Reserved1: 0x2AE15B07FFFFFFF
+ - Base of Image: 0x555555554000
+ Size of Image: 0x628
+ Time Date Stamp: 1771959187
+ Module Name: '/tmp/a.out'
+ CodeView Record: 4C457042768D260BD4FC15E892AAC361C910DF78AC15E194
+ - Base of Image: 0x7FFFF7FC7000
+ Size of Image: 0xCC8
+ Time Date Stamp: 1771959187
+ Module Name: '/usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2'
+ CodeView Record: 4C45704208CCCC2A9388D5247CCB3E864F3063B975B0A15D
+ - Base of Image: 0x7FFFF7FC5000
+ Size of Image: 0x1817
+ Time Date Stamp: 1771959187
+ Module Name: '[vdso](0x00007ffff7fc5000)'
+ CodeView Record: 4C4570429312E1299072A115C3ACA82B8640192845D0A551
+ - Base of Image: 0x7FFFF7DB1000
+ Size of Image: 0x274E8
+ Time Date Stamp: 1771959187
+ Module Name: '/lib/x86_64-linux-gnu/libc.so.6'
+ CodeView Record: 4C45704261E1DEA1F540B3B4B4D8EC76716E409CEC096ECE
- Type: MiscInfo
- Content: 1800000001000000037E000000000000509F306F01000000
+ Content: 1800000001000000A72D3700000000000000000000000000
- Type: ThreadList
Threads:
- - Thread Id: 0x7E03
- Context: 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000700100000000000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E8150B24FC7F0000E8150B24FC7F00000C014000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001C014000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+ - Thread Id: 0x372DA7
+ Context: 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000700108000000000330000000000000000002B00020200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003E40D87D55555555000008D6FFFFFF7F0000F8D5FFFFFF7F0000A0D4FFFFFF7F0000A0D4FFFFFF7F0000F8D5FFFFFF7F0000B0D4FFFFFF7F0000000000000000000080BCFCF7FF7F000020D2FFFFFF7F00000202000000000000000000000000000008D6FFFFFF7F000000D0FFF7FF7F0000D87D5555555500004851555555550000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040E7DAF7FF7F00000000000000000000
Stack:
- Start of Memory Range: 0x7FFC240B1568
- Content: 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006218160B24FC7F000042014000000000000C0140000000000000000000000000000000000000000000000000000000006638160B24FC7F00005F014000000000000000000000000000000000000000005F0000000000000000010000000000000002200B24FC7F00000000000000000000FE2F0B24FC7F00000000000000000000210000000000000000901224FC7F00001000000000000000FFFBEBBF0000000006000000000000000010000000000000110000000000000064000000000000000300000000000000400040000000000004000000000000003800000000000000050000000000000003000000000000000700000000000000000000000000000008000000000000000000000000000000090000000000000044014000000000000B0000000000000000000000000000000C0000000000000000000000000000000D0000000000000000000000000000000E000000000000000000000000000000170000000000000000000000000000001900000000000000A9170B24FC7F00001A0000000000000000000000000000001F00000000000000FC3F0B24FC7F00000F00000000000000B9170B24FC7F000000000000000000000000000000000000000AB340B9514A4C453C3FB52168ADE70E7838365F36340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F612E6F7574005F3D2F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F612E6F7574002F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F612E6F7574000000000000000000
+ Start of Memory Range: 0x7FFFFFFFD420
+ Content: 0000C000000000000000C0000000000000010000000000000000C0000000000040000000000000001000000000000000000008000000000029018C2100000000170000000000000000000000000000000000000000000000000000000000000017000000310000000000000000000000B0D4FFFFFF7F00000000000000000000E0D4FFFFFF7F0000CB515555555500000000000000001440000000000000144000000000000039400000000000003E40F8D5FFFFFF7F000001000000000000000100000000000000A8ACDDF7FF7F0000E0D5FFFFFF7F000080515555555500004040555501000000F8D5FFFFFF7F0000F8D5FFFFFF7F00005002D40952A1CA98000000000000000008D6FFFFFF7F000000D0FFF7FF7F0000D87D555555550000500236A0AD5E356750021651E94E3567000000000000000000000000000000000000000000000000F8D5FFFFFF7F00000100000000000000007B97470D7B2415F0D5FFFFFF7F000065ADDDF7FF7F00008051555555550000D87D55555555000010E3FFF7FF7F0000000000000000000000000000000000005050555555550000F0D5FFFFFF7F0000000000000000000000000000000000007150555555550000E8D5FFFFFF7F00003800000000000000010000000000000079D9FFFFFF7F0000000000000000000084D9FFFFFF7F0000B3D9FFFFFF7F0000D3D9FFFFFF7F000002DAFFFFFF7F000010DAFFFFFF7F000030DAFFFFFF7F00003FDAFFFFFF7F0000BCE1FFFFFF7F0000DAE1FFFFFF7F000000E2FFFFFF7F000010E2FFFFFF7F000048E2FFFFFF7F000055E2FFFFFF7F000078E2FFFFFF7F00008BE2FFFFFF7F00009EE2FFFFFF7F0000CFE2FFFFFF7F0000FEE2FFFFFF7F00003CE3FFFFFF7F00006DE3FFFFFF7F00007DE3FFFFFF7F0000B9E3FFFFFF7F0000ECE3FFFFFF7F000003E4FFFFFF7F000083E4FFFFFF7F000098E4FFFFFF7F0000BBE4FFFFFF7F0000F2E4FFFFFF7F000086EAFFFFFF7F00008EEAFFFFFF7F0000C1EAFFFFFF7F0000E3EAFFFFFF7F000014EBFFFFFF7F000071EBFFFFFF7F000085EBFFFFFF7F0000BAEBFFFFFF7F0000CAEBFFFFFF7F0000E6EBFFFFFF7F00003EECFFFFFF7F00009CECFFFFFF7F0000B1ECFFFFFF7F0000E2ECFFFFFF7F000019EDFFFFFF7F000048EDFFFFFF7F000079EDFFFFFF7F00008AEDFFFFFF7F0000B4EDFFFFFF7F0000E9EDFFFFFF7F00000AEEFFFFFF7F000037EEFFFFFF7F00006CEEFFFFFF7F0000AEEEFFFFFF7F0000BAEEFFFFFF7F0000F1EEFFFFFF7F000008EFFFFFFF7F000033EFFFFFFF7F000062EFFFFFFF7F00008CEFFFFFFF7F0000B0EFFFFFFF7F0000000000000000000021000000000000000050FCF7FF7F00003300000000000000F0060000000000001000000000000000FFFB8B17000000000600000000000000001000000000000011000000000000006400000000000000030000000000000040405555555500000400000000000000380000000000000005000000000000000E0000000000000007000000000000000070FCF7FF7F000008000000000000000000000000000000090000000000000050505555555500000B0000000000000014A00700000000000C0000000000000014A00700000000000D00000000000000535F0100000000000E00000000000000535F01000000000017000000000000000000000000000000190000000000000059D9FFFFFF7F00001A0000000000000002000000000000001F00000000000000EDEFFFFFFF7F00000F0000000000000069D9FFFFFF7F00001B000000000000001C000000000000001C0000000000000020000000000000000000000000000000000000000000000000C27B97470D7B2415EB04A950654C28017838365F3634000000000000000000002F746D702F612E6F757400434C4F554453444B5F434F4E544558545F41574152455F5553455F4543505F485454505F50524F58593D74727565004C4553534F50454E3D7C202F7573722F62696E2F6C6573737069706520257300424153485F46554E435F6E706D25253D2829207B20202F7573722F62696E2F67706B67206E706D20222440220A7D005253594E435F5253483D73736800504152494E49543D72546267715220423D2E3F5F415F6120513D5F733E7C3A004D4F54445F53484F574E3D70616D004C535F434F4C4F52533D72733D303A64693D30313B33343A6C6E3D30313B33363A6D683D30303A70693D34303B33333A736F3D30313B33353A646F3D30313B33353A62643D34303B33333B30313A63643D34303B33333B30313A6F723D34303B33313B30313A6D693D30303A73753D33373B34313A73673D33303B34333A63613D30303A74773D33303B34323A6F773D33343B34323A73743D33373B34343A65783D30313B33323A2A2E377A3D30313B33313A2A2E6163653D30313B33313A2A2E616C7A3D30313B33313A2A2E61706B3D30313B33313A2A2E6172633D30313B33313A2A2E61726A3D30313B33313A2A2E627A3D30313B33313A2A2E627A323D30313B33313A2A2E6361623D30313B33313A2A2E6370696F3D30313B33313A2A2E63726174653D30313B33313A2A2E6465623D30313B33313A2A2E6472706D3D30313B33313A2A2E64776D3D30313B33313A2A2E647A3D30313B33313A2A2E6561723D30313B33313A2A2E6567673D30313B33313A2A2E6573643D30313B33313A2A2E677A3D30313B33313A2A2E6A61723D30313B33313A2A2E6C68613D30313B33313A2A2E6C727A3D30313B33313A2A2E6C7A3D30313B33313A2A2E6C7A343D30313B33313A2A2E6C7A683D30313B33313A2A2E6C7A6D613D30313B33313A2A2E6C7A6F3D30313B33313A2A2E70797A3D30313B33313A2A2E7261723D30313B33313A2A2E72706D3D30313B33313A2A2E727A3D30313B33313A2A2E7361723D30313B33313A2A2E73776D3D30313B33313A2A2E74377A3D30313B33313A2A2E7461723D30313B33313A2A2E74617A3D30313B33313A2A2E74627A3D30313B33313A2A2E74627A323D30313B33313A2A2E74677A3D30313B33313A2A2E746C7A3D30313B33313A2A2E74787A3D30313B33313A2A2E747A3D30313B33313A2A2E747A6F3D30313B33313A2A2E747A73743D30313B33313A2A2E756465623D30313B33313A2A2E7761723D30313B33313A2A2E77686C3D30313B33313A2A2E77696D3D30313B33313A2A2E787A3D30313B33313A2A2E7A3D30313B33313A2A2E7A69703D30313B33313A2A2E7A6F6F3D30313B33313A2A2E7A73743D30313B33313A2A2E617669663D30313B33353A2A2E6A70673D30313B33353A2A2E6A7065673D30313B33353A2A2E6A786C3D30313B33353A2A2E6D6A70673D30313B33353A2A2E6D6A7065673D30313B33353A2A2E6769663D30313B33353A2A2E626D703D30313B33353A2A2E70626D3D30313B33353A2A2E70676D3D30313B33353A2A2E70706D3D30313B33353A2A2E7467613D30313B33353A2A2E78626D3D30313B33353A2A2E78706D3D30313B33353A2A2E7469663D30313B33353A2A2E746966663D30313B33353A2A2E706E673D30313B33353A2A2E7376673D30313B33353A2A2E7376677A3D30313B33353A2A2E6D6E673D30313B33353A2A2E7063783D30313B33353A2A2E6D6F763D30313B33353A2A2E6D70673D30313B33353A2A2E6D7065673D30313B33353A2A2E6D32763D30313B33353A2A2E6D6B763D30313B33353A2A2E7765626D3D30313B33353A2A2E776562703D30313B33353A2A2E6F676D3D30313B33353A2A2E6D70343D30313B33353A2A2E6D34763D30313B33353A2A2E6D7034763D30313B33353A2A2E766F623D30313B33353A2A2E71743D30313B33353A2A2E6E75763D30313B33353A2A2E776D763D30313B33353A2A2E6173663D30313B33353A2A2E726D3D30313B33353A2A2E726D76623D30313B33353A2A2E666C633D30313B33353A2A2E6176693D30313B33353A2A2E666C693D30313B33353A2A2E666C763D30313B33353A2A2E676C3D30313B33353A2A2E646C3D30313B33353A2A2E7863663D30313B33353A2A2E7877643D30313B33353A2A2E7975763D30313B33353A2A2E63676D3D30313B33353A2A2E656D663D30313B33353A2A2E6F67763D30313B33353A2A2E6F67783D30313B33353A2A2E6161633D30303B33363A2A2E61753D30303B33363A2A2E666C61633D30303B33363A2A2E6D34613D30303B33363A2A2E6D69643D30303B33363A2A2E6D6964693D30303B33363A2A2E6D6B613D30303B33363A2A2E6D70333D30303B33363A2A2E6D70633D30303B33363A2A2E6F67673D30303B33363A2A2E72613D30303B33363A2A2E7761763D30303B33363A2A2E6F67613D30303B33363A2A2E6F7075733D30303B33363A2A2E7370783D30303B33363A2A2E787370663D30303B33363A2A7E3D30303B39303A2A233D30303B39303A2A2E62616B3D30303B39303A2A2E6372646F776E6C6F61643D30303B39303A2A2E64706B672D646973743D30303B39303A2A2E64706B672D6E65773D30303B39303A2A2E64706B672D6F6C643D30303B39303A2A2E64706B672D746D703D30303B39303A2A2E6F6C643D30303B39303A2A2E6F7269673D30303B39303A2A2E706172743D30303B39303A2A2E72656A3D30303B39303A2A2E72706D6E65773D30303B39303A2A2E72706D6F7269673D30303B39303A2A2E72706D736176653D30303B39303A2A2E7377703D30303B39303A2A2E746D703D30303B39303A2A2E7563662D646973743D30303B39303A2A2E7563662D6E65773D30303B39303A2A2E7563662D6F6C643D30303B39303A00534B5F5349474E494E475F504C5547494E3D676E756262796167656E7400474F4F474C455F434C4F55445F44495341424C455F4449524543545F504154483D74727565005F3D2F7573722F62696E2F6C6C646200444255535F53455353494F4E5F4255535F414444524553533D756E69783A706174683D2F72756E2F757365722F3439393733322F62757300555345523D6861726A6F686E005353485F434C49454E543D3137322E3235332E33312E323337203437383431203232005034434F4E4649473D2E7034636F6E666967005353485F5454593D2F6465762F7074732F3000424153485F46554E435F7961726E25253D2829207B20202F7573722F62696E2F67706B67207961726E20222440220A7D00424153485F46554E435F6E707825253D2829207B20202F7573722F62696E2F67706B67206E707820222440220A7D0050344D455247453D2F676F6F676C652F7372632F66696C65732F686561642F6465706F742F656E672F706572666F7263652F6D6572676570342E74636C00424153485F46554E435F706E706D25253D2829207B20202F7573722F62696E2F67706B6720706E706D20222440220A7D004C4F474E414D453D6861726A6F686E00434C4F554453444B5F434F4E5441494E45525F5553455F4150504C49434154494F4E5F44454641554C545F43524544454E5449414C533D7472756500424153485F46554E435F686174636825253D2829207B20202F7573722F62696E2F67706B6720686174636820222440220A7D0048495354434F4E54524F4C3D69676E6F72656475707300504154483D2F7573722F6C69622F676F6F676C652D676F6C616E672F62696E3A2F7573722F6C6F63616C2F6275696C64746F6F6C732F6A6176612F6A646B2F62696E3A2F7573722F6C6F63616C2F7362696E3A2F7573722F6C6F63616C2F62696E3A2F7573722F7362696E3A2F7573722F62696E3A2F7362696E3A2F62696E005844475F53455353494F4E5F49443D6339303334005057443D2F7573722F6C6F63616C2F676F6F676C652F686F6D652F6861726A6F686E00424153485F46554E435F7961726E706B6725253D2829207B20202F7573722F62696E2F67706B67207961726E706B6720222440220A7D005353485F415554485F4B45593D65636473612D736861322D6E697374703235362D636572742D763031406F70656E7373682E636F6D20414141414B47566A5A484E684C584E6F59544974626D6C7A644841794E54597459325679644331324D4446416233426C626E4E7A6143356A623230414141416747477568656C4D7545582B357530682B61516D78456E366B6A50433075574E47494C2B793543766B314F6F4141414149626D6C7A644841794E545941414142424250415938413859644E6A6770617A733930786C70703835623231517841416D6C446A384432444A386976546B7648434B676748742F6759495A32306B6A70665A7142644F6C7437385A6C5674725A42453872344D2B385A4141414145414A7A38774141414145414141415861474679616D396F626B426A62334A774C6D6476623264735A53356A62323041414141644141414142326868636D7076614734414141414F5A3239765A32786C58476868636D70766147344141414141615A335A42514141414142706E764E784141414141414141414D77414141415959325679644331745A5852685A4746305955426E6232396E6247557559323974414141414B67414141435949415249677755464C345761352B4368396B4D7047676F4A764F4F4C5747456E75417759724C5073445A4265427576496742674141414256775A584A7461585174574445784C575A76636E6468636D5270626D634141414141414141414633426C636D3170644331685A3256756443316D62334A3359584A6B6157356E414141414141414141425A775A584A7461585174634739796443316D62334A3359584A6B6157356E4141414141414141414170775A584A7461585174634852354141414141414141414135775A584A746158517464584E6C6369317959774141414141414141414141414142467741414141647A63326774636E4E6841414141417745414151414141514541764E305A533562314F5A59746F4A3150534B59344749776A69733169347A5A5A324D42644E2F544559714A494F56736641746B447268433959475356757961692F6B4F58774C4C6E4663356456445257484C4453427A6F5845676C34514B436D4E75396E6E65562F634D4C4571346430336F3144504F535051474A44712B776570344B3948755277767A6F673677544441354B70306C6F436E5759384D4854627434532F4F32526F356D76463078306563397663637757314B4F74632F4379645169476D6576425A4F514F795874385A435A4B4574534F5449506841453535574B386167744D45734A6C485274637377536732424A4E4A4D5365554B674C31416E2F6F434539624B414D452F7A585659564B354675763465707163636E6433735157325438716E694F4963454449346F796244656A6D3647385650772F707869655350626146476674754C79522F72485335324F68774141415251414141414D636E4E684C584E6F595449744D6A55324141414241477A374C6357654478443770523942723178684E624A73317345744B4D7257736C65775657692F56356A34647A3268484C64384B6C57753467746367356A767370793876594E58454950576C47683037745953695744575869444D575562765544314E514F794E345548686B595576574F2B647A372B4C71776C7A574D515A38796958775234714E4A666B343070666F65424B59384E71726E776A4B52724173446E53656E4B544B4E6F646A73666E684B5A4839784C566663456F544764674831364375625947396C31666D65613750724D37714F7250554F6E6B4B565548736F6475766A6F72475A335063476258536176646E7A467836446A6251726D514462523638794F68675939746A77426B4A70627048345845452F612F777257336833595A656D59644536353063574C5364744447366444667476313148384B4B49306B477949554B52513377483367547531546D38736B3D0A0053484C564C3D3100434C4F554453444B5F434F4E544558545F41574152455F5553455F434C49454E545F43455254494649434154453D74727565004C455353434C4F53453D2F7573722F62696E2F6C6573737069706520257320257300424153485F46554E435F7069703325253D2829207B20202F7573722F62696E2F67706B67207069703320222440220A7D005353485F415554485F534F434B3D2F7573722F6C6F63616C2F676F6F676C652F686F6D652F6861726A6F686E2F2E7373682F6167656E742F732E3230524D6B6F466350352E737368642E333630383034322E63614837725067566563005445524D3D787465726D2D323536636F6C6F7200424153485F46554E435F706F6574727925253D2829207B20202F7573722F62696E2F67706B6720706F6574727920222440220A7D005348454C4C3D2F62696E2F6261736800434C4F554453444B5F494E5445524E414C5F555345523D7472756500434C4F554453444B5F434F4E544558545F41574152455F43455254494649434154455F434F4E4649475F46494C455F504154483D2F6574632F67636C6F75642F63657274696669636174655F636F6E6669672E6A736F6E004348524F4D455F52454D4F54455F4445534B544F505F44454641554C545F4445534B544F505F53495A45533D3136303078313230302C3338343078323136302C3338343078323536302C3531323078313434302C323136307833383430005844475F53455353494F4E5F545950453D74747900424153485F46554E435F706E707825253D2829207B20202F7573722F62696E2F67706B6720706E707820222440220A7D00424153485F46554E435F707974686F6E3325253D2829207B20202F7573722F62696E2F67706B6720707974686F6E3320222440220A7D00424153485F46554E435F70697025253D2829207B20202F7573722F62696E2F67706B672070697020222440220A7D00424153485F46554E435F7069707825253D2829207B20202F7573722F62696E2F67706B67207069707820222440220A7D004C414E473D656E5F55532E5554462D38005832305F484F4D453D2F676F6F676C652F646174612F72772F75736572732F68612F6861726A6F686E005353485F434F4E4E454354494F4E3D3137322E3235332E33312E323337203437383431203137322E32382E35372E313037203232005844475F52554E54494D455F4449523D2F72756E2F757365722F34393937333200424153485F46554E435F757625253D2829207B20202F7573722F62696E2F67706B6720757620222440220A7D00424153485F46554E435F707974686F6E25253D2829207B20202F7573722F62696E2F67706B6720707974686F6E20222440220A7D00474F4F474C455F4150495F43455254494649434154455F434F4E4649473D2F6574632F67636C6F75642F63657274696669636174655F636F6E6669672E6A736F6E004356535F5253483D73736800505954484F4E504154483D2F7573722F6C6F63616C2F6275696C64746F6F6C732F63757272656E742F73697465637573746F6D697A65005844475F53455353494F4E5F434C4153533D7573657200474F4F474C455F415554485F574542415554484E5F504C5547494E3D67636C6F7564776562617574686E00424153485F46554E435F70646D25253D2829207B20202F7573722F62696E2F67706B672070646D20222440220A7D0053545245414D5A5F534552564552533D5B323030313A343836303A663830323A3A37385D3A3935333000484F4D453D2F7573722F6C6F63616C2F676F6F676C652F686F6D652F6861726A6F686E005844475F444154415F444952533D2F7573722F73686172652F676E6F6D653A2F7573722F6C6F63616C2F73686172652F3A2F7573722F73686172652F002F746D702F612E6F7574000000000000000000
+ - Type: LinuxCPUInfo
+ Text: |
+ processor : 0
+ vendor_id : AuthenticAMD
+ cpu family : 23
+ model : 49
+ model name : AMD EPYC 7B12
+ stepping : 0
+ microcode : 0xffffffff
+ cpu MHz : 2249.998
+ cache size : 512 KB
+ physical id : 0
+ siblings : 24
+ core id : 0
+ cpu cores : 12
+ apicid : 0
+ initial apicid : 0
+ fpu : yes
+ fpu_exception : yes
+ cpuid level : 13
+ wp : yes
+ flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc cpuid extd_apicid tsc_known_freq pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm cmp_legacy cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw topoext ssbd ibrs ibpb stibp vmmcall fsgsbase tsc_adjust bmi1 avx2 smep bmi2 rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 clzero xsaveerptr arat npt nrip_save umip rdpid
+ bugs : sysret_ss_attrs null_seg spectre_v1 spectre_v2 spec_store_bypass retbleed smt_rsb srso ibpb_no_ret spectre_v2_user
+ bogomips : 4499.99
+ TLB size : 3072 4K pages
+ clflush size : 64
+ cache_alignment : 64
+ address sizes : 48 bits physical, 48 bits virtual
+ power management:
+
+ processor : 1
+ vendor_id : AuthenticAMD
+ cpu family : 23
+ model : 49
+ model name : AMD EPYC 7B12
+ stepping : 0
+ microcode : 0xffffffff
+ cpu MHz : 2249.998
+ cache size : 512 KB
+ physical id : 0
+ siblings : 24
+ core id : 1
+ cpu cores : 12
+ apicid : 2
+ initial apicid : 2
+ fpu : yes
+ fpu_exception : yes
+ cpuid level : 13
+ wp : yes
+ flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc cpuid extd_apicid tsc_known_freq pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm cmp_legacy cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw topoext ssbd ibrs ibpb stibp vmmcall fsgsbase tsc_adjust bmi1 avx2 smep bmi2 rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 clzero xsaveerptr arat npt nrip_save umip rdpid
+ bugs : sysret_ss_attrs null_seg spectre_v1 spectre_v2 spec_store_bypass retbleed smt_rsb srso ibpb_no_ret spectre_v2_user
+ bogomips : 4499.99
+ TLB size : 3072 4K pages
+ clflush size : 64
+ cache_alignment : 64
+ address sizes : 48 bits physical, 48 bits virtual
+ power management:
+
+ processor : 2
+ vendor_id : AuthenticAMD
+ cpu family : 23
+ model : 49
+ model name : AMD EPYC 7B12
+ stepping : 0
+ microcode : 0xffffffff
+ cpu MHz : 2249.998
+ cache size : 512 KB
+ physical id : 0
+ siblings : 24
+ core id : 2
+ cpu cores : 12
+ apicid : 4
+ initial apicid : 4
+ fpu : yes
+ fpu_exception : yes
+ cpuid level : 13
+ wp : yes
+ flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc cpuid extd_apicid tsc_known_freq pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm cmp_legacy cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw topoext ssbd ibrs ibpb stibp vmmcall fsgsbase tsc_adjust bmi1 avx2 smep bmi2 rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 clzero xsaveerptr arat npt nrip_save umip rdpid
+ bugs : sysret_ss_attrs null_seg spectre_v1 spectre_v2 spec_store_bypass retbleed smt_rsb srso ibpb_no_ret spectre_v2_user
+ bogomips : 4499.99
+ TLB size : 3072 4K pages
+ clflush size : 64
+ cache_alignment : 64
+ address sizes : 48 bits physical, 48 bits virtual
+ power management:
+
+ processor : 3
+ vendor_id : AuthenticAMD
+ cpu family : 23
+ model : 49
+ model name : AMD EPYC 7B12
+ stepping : 0
+ microcode : 0xffffffff
+ cpu MHz : 2249.998
+ cache size : 512 KB
+ physical id : 0
+ siblings : 24
+ core id : 3
+ cpu cores : 12
+ apicid : 6
+ initial apicid : 6
+ fpu : yes
+ fpu_exception : yes
+ cpuid level : 13
+ wp : yes
+ flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc cpuid extd_apicid tsc_known_freq pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm cmp_legacy cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw topoext ssbd ibrs ibpb stibp vmmcall fsgsbase tsc_adjust bmi1 avx2 smep bmi2 rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 clzero xsaveerptr arat npt nrip_save umip rdpid
+ bugs : sysret_ss_attrs null_seg spectre_v1 spectre_v2 spec_store_bypass retbleed smt_rsb srso ibpb_no_ret spectre_v2_user
+ bogomips : 4499.99
+ TLB size : 3072 4K pages
+ clflush size : 64
+ cache_alignment : 64
+ address sizes : 48 bits physical, 48 bits virtual
+ power management:
+
+ processor : 4
+ vendor_id : AuthenticAMD
+ cpu family : 23
+ model : 49
+ model name : AMD EPYC 7B12
+ stepping : 0
+ microcode : 0xffffffff
+ cpu MHz : 2249.998
+ cache size : 512 KB
+ physical id : 0
+ siblings : 24
+ core id : 4
+ cpu cores : 12
+ apicid : 8
+ initial apicid : 8
+ fpu : yes
+ fpu_exception : yes
+ cpuid level : 13
+ wp : yes
+ flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc cpuid extd_apicid tsc_known_freq pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm cmp_legacy cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw topoext ssbd ibrs ibpb stibp vmmcall fsgsbase tsc_adjust bmi1 avx2 smep bmi2 rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 clzero xsaveerptr arat npt nrip_save umip rdpid
+ bugs : sysret_ss_attrs null_seg spectre_v1 spectre_v2 spec_store_bypass retbleed smt_rsb srso ibpb_no_ret spectre_v2_user
+ bogomips : 4499.99
+ TLB size : 3072 4K pages
+ clflush size : 64
+ cache_alignment : 64
+ address sizes : 48 bits physical, 48 bits virtual
+ power management:
+
+ processor : 5
+ vendor_id : AuthenticAMD
+ cpu family : 23
+ model : 49
+ model name : AMD EPYC 7B12
+ stepping : 0
+ microcode : 0xffffffff
+ cpu MHz : 2249.998
+ cache size : 512 KB
+ physical id : 0
+ siblings : 24
+ core id : 5
+ cpu cores : 12
+ apicid : 10
+ initial apicid : 10
+ fpu : yes
+ fpu_exception : yes
+ cpuid level : 13
+ wp : yes
+ flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc cpuid extd_apicid tsc_known_freq pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm cmp_legacy cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw topoext ssbd ibrs ibpb stibp vmmcall fsgsbase tsc_adjust bmi1 avx2 smep bmi2 rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 clzero xsaveerptr arat npt nrip_save umip rdpid
+ bugs : sysret_ss_attrs null_seg spectre_v1 spectre_v2 spec_store_bypass retbleed smt_rsb srso ibpb_no_ret spectre_v2_user
+ bogomips : 4499.99
+ TLB size : 3072 4K pages
+ clflush size : 64
+ cache_alignment : 64
+ address sizes : 48 bits physical, 48 bits virtual
+ power management:
+
+ processor : 6
+ vendor_id : AuthenticAMD
+ cpu family : 23
+ model : 49
+ model name : AMD EPYC 7B12
+ stepping : 0
+ microcode : 0xffffffff
+ cpu MHz : 2249.998
+ cache size : 512 KB
+ physical id : 0
+ siblings : 24
+ core id : 6
+ cpu cores : 12
+ apicid : 12
+ initial apicid : 12
+ fpu : yes
+ fpu_exception : yes
+ cpuid level : 13
+ wp : yes
+ flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc cpuid extd_apicid tsc_known_freq pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm cmp_legacy cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw topoext ssbd ibrs ibpb stibp vmmcall fsgsbase tsc_adjust bmi1 avx2 smep bmi2 rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 clzero xsaveerptr arat npt nrip_save umip rdpid
+ bugs : sysret_ss_attrs null_seg spectre_v1 spectre_v2 spec_store_bypass retbleed smt_rsb srso ibpb_no_ret spectre_v2_user
+ bogomips : 4499.99
+ TLB size : 3072 4K pages
+ clflush size : 64
+ cache_alignment : 64
+ address sizes : 48 bits physical, 48 bits virtual
+ power management:
+
+ processor : 7
+ vendor_id : AuthenticAMD
+ cpu family : 23
+ model : 49
+ model name : AMD EPYC 7B12
+ stepping : 0
+ microcode : 0xffffffff
+ cpu MHz : 2249.998
+ cache size : 512 KB
+ physical id : 0
+ siblings : 24
+ core id : 7
+ cpu cores : 12
+ apicid : 14
+ initial apicid : 14
+ fpu : yes
+ fpu_exception : yes
+ cpuid level : 13
+ wp : yes
+ flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc cpuid extd_apicid tsc_known_freq pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm cmp_legacy cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw topoext ssbd ibrs ibpb stibp vmmcall fsgsbase tsc_adjust bmi1 avx2 smep bmi2 rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 clzero xsaveerptr arat npt nrip_save umip rdpid
+ bugs : sysret_ss_attrs null_seg spectre_v1 spectre_v2 spec_store_bypass retbleed smt_rsb srso ibpb_no_ret spectre_v2_user
+ bogomips : 4499.99
+ TLB size : 3072 4K pages
+ clflush size : 64
+ cache_alignment : 64
+ address sizes : 48 bits physical, 48 bits virtual
+ power management:
+
+ processor : 8
+ vendor_id : AuthenticAMD
+ cpu family : 23
+ model : 49
+ model name : AMD EPYC 7B12
+ stepping : 0
+ microcode : 0xffffffff
+ cpu MHz : 2249.998
+ cache size : 512 KB
+ physical id : 0
+ siblings : 24
+ core id : 8
+ cpu cores : 12
+ apicid : 16
+ initial apicid : 16
+ fpu : yes
+ fpu_exception : yes
+ cpuid level : 13
+ wp : yes
+ flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc cpuid extd_apicid tsc_known_freq pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm cmp_legacy cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw topoext ssbd ibrs ibpb stibp vmmcall fsgsbase tsc_adjust bmi1 avx2 smep bmi2 rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 clzero xsaveerptr arat npt nrip_save umip rdpid
+ bugs : sysret_ss_attrs null_seg spectre_v1 spectre_v2 spec_store_bypass retbleed smt_rsb srso ibpb_no_ret spectre_v2_user
+ bogomips : 4499.99
+ TLB size : 3072 4K pages
+ clflush size : 64
+ cache_alignment : 64
+ address sizes : 48 bits physical, 48 bits virtual
+ power management:
+
+ processor : 9
+ vendor_id : AuthenticAMD
+ cpu family : 23
+ model : 49
+ model name : AMD EPYC 7B12
+ stepping : 0
+ microcode : 0xffffffff
+ cpu MHz : 2249.998
+ cache size : 512 KB
+ physical id : 0
+ siblings : 24
+ core id : 9
+ cpu cores : 12
+ apicid : 18
+ initial apicid : 18
+ fpu : yes
+ fpu_exception : yes
+ cpuid level : 13
+ wp : yes
+ flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc cpuid extd_apicid tsc_known_freq pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm cmp_legacy cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw topoext ssbd ibrs ibpb stibp vmmcall fsgsbase tsc_adjust bmi1 avx2 smep bmi2 rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 clzero xsaveerptr arat npt nrip_save umip rdpid
+ bugs : sysret_ss_attrs null_seg spectre_v1 spectre_v2 spec_store_bypass retbleed smt_rsb srso ibpb_no_ret spectre_v2_user
+ bogomips : 4499.99
+ TLB size : 3072 4K pages
+ clflush size : 64
+ cache_alignment : 64
+ address sizes : 48 bits physical, 48 bits virtual
+ power management:
+
+ processor : 10
+ vendor_id : AuthenticAMD
+ cpu family : 23
+ model : 49
+ model name : AMD EPYC 7B12
+ stepping : 0
+ microcode : 0xffffffff
+ cpu MHz : 2249.998
+ cache size : 512 KB
+ physical id : 0
+ siblings : 24
+ core id : 10
+ cpu cores : 12
+ apicid : 20
+ initial apicid : 20
+ fpu : yes
+ fpu_exception : yes
+ cpuid level : 13
+ wp : yes
+ flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc cpuid extd_apicid tsc_known_freq pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm cmp_legacy cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw topoext ssbd ibrs ibpb stibp vmmcall fsgsbase tsc_adjust bmi1 avx2 smep bmi2 rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 clzero xsaveerptr arat npt nrip_save umip rdpid
+ bugs : sysret_ss_attrs null_seg spectre_v1 spectre_v2 spec_store_bypass retbleed smt_rsb srso ibpb_no_ret spectre_v2_user
+ bogomips : 4499.99
+ TLB size : 3072 4K pages
+ clflush size : 64
+ cache_alignment : 64
+ address sizes : 48 bits physical, 48 bits virtual
+ power management:
+
+ processor : 11
+ vendor_id : AuthenticAMD
+ cpu family : 23
+ model : 49
+ model name : AMD EPYC 7B12
+ stepping : 0
+ microcode : 0xffffffff
+ cpu MHz : 2249.998
+ cache size : 512 KB
+ physical id : 0
+ siblings : 24
+ core id : 11
+ cpu cores : 12
+ apicid : 22
+ initial apicid : 22
+ fpu : yes
+ fpu_exception : yes
+ cpuid level : 13
+ wp : yes
+ flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc cpuid extd_apicid tsc_known_freq pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm cmp_legacy cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw topoext ssbd ibrs ibpb stibp vmmcall fsgsbase tsc_adjust bmi1 avx2 smep bmi2 rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 clzero xsaveerptr arat npt nrip_save umip rdpid
+ bugs : sysret_ss_attrs null_seg spectre_v1 spectre_v2 spec_store_bypass retbleed smt_rsb srso ibpb_no_ret spectre_v2_user
+ bogomips : 4499.99
+ TLB size : 3072 4K pages
+ clflush size : 64
+ cache_alignment : 64
+ address sizes : 48 bits physical, 48 bits virtual
+ power management:
+
+ processor : 12
+ vendor_id : AuthenticAMD
+ cpu family : 23
+ model : 49
+ model name : AMD EPYC 7B12
+ stepping : 0
+ microcode : 0xffffffff
+ cpu MHz : 2249.998
+ cache size : 512 KB
+ physical id : 0
+ siblings : 24
+ core id : 0
+ cpu cores : 12
+ apicid : 1
+ initial apicid : 1
+ fpu : yes
+ fpu_exception : yes
+ cpuid level : 13
+ wp : yes
+ flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc cpuid extd_apicid tsc_known_freq pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm cmp_legacy cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw topoext ssbd ibrs ibpb stibp vmmcall fsgsbase tsc_adjust bmi1 avx2 smep bmi2 rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 clzero xsaveerptr arat npt nrip_save umip rdpid
+ bugs : sysret_ss_attrs null_seg spectre_v1 spectre_v2 spec_store_bypass retbleed smt_rsb srso ibpb_no_ret spectre_v2_user
+ bogomips : 4499.99
+ TLB size : 3072 4K pages
+ clflush size : 64
+ cache_alignment : 64
+ address sizes : 48 bits physical, 48 bits virtual
+ power management:
+
+ processor : 13
+ vendor_id : AuthenticAMD
+ cpu family : 23
+ model : 49
+ model name : AMD EPYC 7B12
+ stepping : 0
+ microcode : 0xffffffff
+ cpu MHz : 2249.998
+ cache size : 512 KB
+ physical id : 0
+ siblings : 24
+ core id : 1
+ cpu cores : 12
+ apicid : 3
+ initial apicid : 3
+ fpu : yes
+ fpu_exception : yes
+ cpuid level : 13
+ wp : yes
+ flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc cpuid extd_apicid tsc_known_freq pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm cmp_legacy cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw topoext ssbd ibrs ibpb stibp vmmcall fsgsbase tsc_adjust bmi1 avx2 smep bmi2 rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 clzero xsaveerptr arat npt nrip_save umip rdpid
+ bugs : sysret_ss_attrs null_seg spectre_v1 spectre_v2 spec_store_bypass retbleed smt_rsb srso ibpb_no_ret spectre_v2_user
+ bogomips : 4499.99
+ TLB size : 3072 4K pages
+ clflush size : 64
+ cache_alignment : 64
+ address sizes : 48 bits physical, 48 bits virtual
+ power management:
+
+ processor : 14
+ vendor_id : AuthenticAMD
+ cpu family : 23
+ model : 49
+ model name : AMD EPYC 7B12
+ stepping : 0
+ microcode : 0xffffffff
+ cpu MHz : 2249.998
+ cache size : 512 KB
+ physical id : 0
+ siblings : 24
+ core id : 2
+ cpu cores : 12
+ apicid : 5
+ initial apicid : 5
+ fpu : yes
+ fpu_exception : yes
+ cpuid level : 13
+ wp : yes
+ flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc cpuid extd_apicid tsc_known_freq pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm cmp_legacy cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw topoext ssbd ibrs ibpb stibp vmmcall fsgsbase tsc_adjust bmi1 avx2 smep bmi2 rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 clzero xsaveerptr arat npt nrip_save umip rdpid
+ bugs : sysret_ss_attrs null_seg spectre_v1 spectre_v2 spec_store_bypass retbleed smt_rsb srso ibpb_no_ret spectre_v2_user
+ bogomips : 4499.99
+ TLB size : 3072 4K pages
+ clflush size : 64
+ cache_alignment : 64
+ address sizes : 48 bits physical, 48 bits virtual
+ power management:
+
+ processor : 15
+ vendor_id : AuthenticAMD
+ cpu family : 23
+ model : 49
+ model name : AMD EPYC 7B12
+ stepping : 0
+ microcode : 0xffffffff
+ cpu MHz : 2249.998
+ cache size : 512 KB
+ physical id : 0
+ siblings : 24
+ core id : 3
+ cpu cores : 12
+ apicid : 7
+ initial apicid : 7
+ fpu : yes
+ fpu_exception : yes
+ cpuid level : 13
+ wp : yes
+ flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc cpuid extd_apicid tsc_known_freq pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm cmp_legacy cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw topoext ssbd ibrs ibpb stibp vmmcall fsgsbase tsc_adjust bmi1 avx2 smep bmi2 rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 clzero xsaveerptr arat npt nrip_save umip rdpid
+ bugs : sysret_ss_attrs null_seg spectre_v1 spectre_v2 spec_store_bypass retbleed smt_rsb srso ibpb_no_ret spectre_v2_user
+ bogomips : 4499.99
+ TLB size : 3072 4K pages
+ clflush size : 64
+ cache_alignment : 64
+ address sizes : 48 bits physical, 48 bits virtual
+ power management:
+
+ processor : 16
+ vendor_id : AuthenticAMD
+ cpu family : 23
+ model : 49
+ model name : AMD EPYC 7B12
+ stepping : 0
+ microcode : 0xffffffff
+ cpu MHz : 2249.998
+ cache size : 512 KB
+ physical id : 0
+ siblings : 24
+ core id : 4
+ cpu cores : 12
+ apicid : 9
+ initial apicid : 9
+ fpu : yes
+ fpu_exception : yes
+ cpuid level : 13
+ wp : yes
+ flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc cpuid extd_apicid tsc_known_freq pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm cmp_legacy cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw topoext ssbd ibrs ibpb stibp vmmcall fsgsbase tsc_adjust bmi1 avx2 smep bmi2 rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 clzero xsaveerptr arat npt nrip_save umip rdpid
+ bugs : sysret_ss_attrs null_seg spectre_v1 spectre_v2 spec_store_bypass retbleed smt_rsb srso ibpb_no_ret spectre_v2_user
+ bogomips : 4499.99
+ TLB size : 3072 4K pages
+ clflush size : 64
+ cache_alignment : 64
+ address sizes : 48 bits physical, 48 bits virtual
+ power management:
+
+ processor : 17
+ vendor_id : AuthenticAMD
+ cpu family : 23
+ model : 49
+ model name : AMD EPYC 7B12
+ stepping : 0
+ microcode : 0xffffffff
+ cpu MHz : 2249.998
+ cache size : 512 KB
+ physical id : 0
+ siblings : 24
+ core id : 5
+ cpu cores : 12
+ apicid : 11
+ initial apicid : 11
+ fpu : yes
+ fpu_exception : yes
+ cpuid level : 13
+ wp : yes
+ flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc cpuid extd_apicid tsc_known_freq pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm cmp_legacy cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw topoext ssbd ibrs ibpb stibp vmmcall fsgsbase tsc_adjust bmi1 avx2 smep bmi2 rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 clzero xsaveerptr arat npt nrip_save umip rdpid
+ bugs : sysret_ss_attrs null_seg spectre_v1 spectre_v2 spec_store_bypass retbleed smt_rsb srso ibpb_no_ret spectre_v2_user
+ bogomips : 4499.99
+ TLB size : 3072 4K pages
+ clflush size : 64
+ cache_alignment : 64
+ address sizes : 48 bits physical, 48 bits virtual
+ power management:
+
+ processor : 18
+ vendor_id : AuthenticAMD
+ cpu family : 23
+ model : 49
+ model name : AMD EPYC 7B12
+ stepping : 0
+ microcode : 0xffffffff
+ cpu MHz : 2249.998
+ cache size : 512 KB
+ physical id : 0
+ siblings : 24
+ core id : 6
+ cpu cores : 12
+ apicid : 13
+ initial apicid : 13
+ fpu : yes
+ fpu_exception : yes
+ cpuid level : 13
+ wp : yes
+ flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc cpuid extd_apicid tsc_known_freq pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm cmp_legacy cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw topoext ssbd ibrs ibpb stibp vmmcall fsgsbase tsc_adjust bmi1 avx2 smep bmi2 rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 clzero xsaveerptr arat npt nrip_save umip rdpid
+ bugs : sysret_ss_attrs null_seg spectre_v1 spectre_v2 spec_store_bypass retbleed smt_rsb srso ibpb_no_ret spectre_v2_user
+ bogomips : 4499.99
+ TLB size : 3072 4K pages
+ clflush size : 64
+ cache_alignment : 64
+ address sizes : 48 bits physical, 48 bits virtual
+ power management:
+
+ processor : 19
+ vendor_id : AuthenticAMD
+ cpu family : 23
+ model : 49
+ model name : AMD EPYC 7B12
+ stepping : 0
+ microcode : 0xffffffff
+ cpu MHz : 2249.998
+ cache size : 512 KB
+ physical id : 0
+ siblings : 24
+ core id : 7
+ cpu cores : 12
+ apicid : 15
+ initial apicid : 15
+ fpu : yes
+ fpu_exception : yes
+ cpuid level : 13
+ wp : yes
+ flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc cpuid extd_apicid tsc_known_freq pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm cmp_legacy cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw topoext ssbd ibrs ibpb stibp vmmcall fsgsbase tsc_adjust bmi1 avx2 smep bmi2 rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 clzero xsaveerptr arat npt nrip_save umip rdpid
+ bugs : sysret_ss_attrs null_seg spectre_v1 spectre_v2 spec_store_bypass retbleed smt_rsb srso ibpb_no_ret spectre_v2_user
+ bogomips : 4499.99
+ TLB size : 3072 4K pages
+ clflush size : 64
+ cache_alignment : 64
+ address sizes : 48 bits physical, 48 bits virtual
+ power management:
+
+ processor : 20
+ vendor_id : AuthenticAMD
+ cpu family : 23
+ model : 49
+ model name : AMD EPYC 7B12
+ stepping : 0
+ microcode : 0xffffffff
+ cpu MHz : 2249.998
+ cache size : 512 KB
+ physical id : 0
+ siblings : 24
+ core id : 8
+ cpu cores : 12
+ apicid : 17
+ initial apicid : 17
+ fpu : yes
+ fpu_exception : yes
+ cpuid level : 13
+ wp : yes
+ flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc cpuid extd_apicid tsc_known_freq pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm cmp_legacy cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw topoext ssbd ibrs ibpb stibp vmmcall fsgsbase tsc_adjust bmi1 avx2 smep bmi2 rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 clzero xsaveerptr arat npt nrip_save umip rdpid
+ bugs : sysret_ss_attrs null_seg spectre_v1 spectre_v2 spec_store_bypass retbleed smt_rsb srso ibpb_no_ret spectre_v2_user
+ bogomips : 4499.99
+ TLB size : 3072 4K pages
+ clflush size : 64
+ cache_alignment : 64
+ address sizes : 48 bits physical, 48 bits virtual
+ power management:
+
+ processor : 21
+ vendor_id : AuthenticAMD
+ cpu family : 23
+ model : 49
+ model name : AMD EPYC 7B12
+ stepping : 0
+ microcode : 0xffffffff
+ cpu MHz : 2249.998
+ cache size : 512 KB
+ physical id : 0
+ siblings : 24
+ core id : 9
+ cpu cores : 12
+ apicid : 19
+ initial apicid : 19
+ fpu : yes
+ fpu_exception : yes
+ cpuid level : 13
+ wp : yes
+ flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc cpuid extd_apicid tsc_known_freq pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm cmp_legacy cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw topoext ssbd ibrs ibpb stibp vmmcall fsgsbase tsc_adjust bmi1 avx2 smep bmi2 rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 clzero xsaveerptr arat npt nrip_save umip rdpid
+ bugs : sysret_ss_attrs null_seg spectre_v1 spectre_v2 spec_store_bypass retbleed smt_rsb srso ibpb_no_ret spectre_v2_user
+ bogomips : 4499.99
+ TLB size : 3072 4K pages
+ clflush size : 64
+ cache_alignment : 64
+ address sizes : 48 bits physical, 48 bits virtual
+ power management:
+
+ processor : 22
+ vendor_id : AuthenticAMD
+ cpu family : 23
+ model : 49
+ model name : AMD EPYC 7B12
+ stepping : 0
+ microcode : 0xffffffff
+ cpu MHz : 2249.998
+ cache size : 512 KB
+ physical id : 0
+ siblings : 24
+ core id : 10
+ cpu cores : 12
+ apicid : 21
+ initial apicid : 21
+ fpu : yes
+ fpu_exception : yes
+ cpuid level : 13
+ wp : yes
+ flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc cpuid extd_apicid tsc_known_freq pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm cmp_legacy cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw topoext ssbd ibrs ibpb stibp vmmcall fsgsbase tsc_adjust bmi1 avx2 smep bmi2 rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 clzero xsaveerptr arat npt nrip_save umip rdpid
+ bugs : sysret_ss_attrs null_seg spectre_v1 spectre_v2 spec_store_bypass retbleed smt_rsb srso ibpb_no_ret spectre_v2_user
+ bogomips : 4499.99
+ TLB size : 3072 4K pages
+ clflush size : 64
+ cache_alignment : 64
+ address sizes : 48 bits physical, 48 bits virtual
+ power management:
+
+ processor : 23
+ vendor_id : AuthenticAMD
+ cpu family : 23
+ model : 49
+ model name : AMD EPYC 7B12
+ stepping : 0
+ microcode : 0xffffffff
+ cpu MHz : 2249.998
+ cache size : 512 KB
+ physical id : 0
+ siblings : 24
+ core id : 11
+ cpu cores : 12
+ apicid : 23
+ initial apicid : 23
+ fpu : yes
+ fpu_exception : yes
+ cpuid level : 13
+ wp : yes
+ flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc cpuid extd_apicid tsc_known_freq pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm cmp_legacy cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw topoext ssbd ibrs ibpb stibp vmmcall fsgsbase tsc_adjust bmi1 avx2 smep bmi2 rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 clzero xsaveerptr arat npt nrip_save umip rdpid
+ bugs : sysret_ss_attrs null_seg spectre_v1 spectre_v2 spec_store_bypass retbleed smt_rsb srso ibpb_no_ret spectre_v2_user
+ bogomips : 4499.99
+ TLB size : 3072 4K pages
+ clflush size : 64
+ cache_alignment : 64
+ address sizes : 48 bits physical, 48 bits virtual
+ power management:
+
+ - Type: LinuxLSBRelease
+ Text: |
+ # $Id: //depot/google3/googledata/corp/puppet/goobuntu/common/modules/base/templates/lsb-release.erb#9 $
+ DISTRIB_CODENAME=rodete
+ DISTRIB_DESCRIPTION="Debian GNU/Linux rodete"
+ DISTRIB_ID=Debian
+ DISTRIB_RELEASE=rodete
+ GOOGLE_CODENAME=rodete
+ GOOGLE_ID=Goobuntu
+ GOOGLE_RELEASE="rodete 20260210.05.04RD"
+ GOOGLE_ROLE=desktop
+ GOOGLE_TRACK=stable
+ - Type: LinuxProcStatus
+ Text: |
+ Name: a.out
+ Umask: 0027
+ State: t (tracing stop)
+ Tgid: 3616167
+ Ngid: 0
+ Pid: 3616167
+ PPid: 3616128
+ TracerPid: 3616128
+ Uid: 499732 499732 499732 499732
+ Gid: 89939 89939 89939 89939
+ FDSize: 64
+ Groups: 996 5000 66688 70967 70970 75209 77056 79910 79982 81448 82072 82189 82193 82712 83042 83243 84796 85841 86035 86931 87465 87558 87815 87986 88414 89046 89266 89275 89939 89971 90128 90338 90384 90387 90415 90518 90537 90558 90578 90673 90680 90899 90968 91041 91199 91674 91675 91750 91952 92188 92278 92487 92592 92741 92930 93214 93296 93298 93368 93703 93719 93743 93858 94083 94191 94278 94317 94330 94331 94332 94333 94334 94335 94336 94337 94338 94339 94340 94341 94342 94343 94344 94376 95521 96089 96577 96792 96853 97231 97552 97622 97644 97829 98356 98646 98661 99309 99388 99553 99567 99581 100113 100161 100283 100286 100405 100870 101193 101387 101389 101457 101493 102050 102136 102535 102941 103080 103090 103091 103093 103096 103121 103125 103142 103143 103175 103289 103291 103293 103295 103304 103306 103320 103323 103328 103343 103345 103411 103421 103462 103464 103465 103541 103568 103580 103587 103588 103596 103631 103654 103673 103745
+ NStgid: 3616167
+ NSpid: 3616167
+ NSpgid: 3616167
+ NSsid: 3608050
+ Kthread: 0
+ VmPeak: 2528 kB
+ VmSize: 2440 kB
+ VmLck: 0 kB
+ VmPin: 0 kB
+ VmHWM: 1216 kB
+ VmRSS: 1216 kB
+ RssAnon: 104 kB
+ RssFile: 1104 kB
+ RssShmem: 8 kB
+ VmData: 92 kB
+ VmStk: 136 kB
+ VmExe: 4 kB
+ VmLib: 1596 kB
+ VmPTE: 32 kB
+ VmSwap: 0 kB
+ HugetlbPages: 0 kB
+ CoreDumping: 0
+ THP_enabled: 1
+ untag_mask: 0xffffffffffffffff
+ Threads: 1
+ SigQ: 1918/385560
+ SigPnd: 0000000000000000
+ ShdPnd: 0000000000000000
+ SigBlk: 0000000000000000
+ SigIgn: 0000000004001000
+ SigCgt: 0000000000000000
+ CapInh: 0000000000000000
+ CapPrm: 0000000000000000
+ CapEff: 0000000000000000
+ CapBnd: 000001ffffffffff
+ CapAmb: 0000000000000000
+ NoNewPrivs: 0
+ Seccomp: 0
+ Seccomp_filters: 0
+ Speculation_Store_Bypass: thread vulnerable
+ SpeculationIndirectBranch: conditional enabled
+ Cpus_allowed: ffffff
+ Cpus_allowed_list: 0-23
+ Mems_allowed: 00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000001
+ Mems_allowed_list: 0
+ voluntary_ctxt_switches: 6
+ nonvoluntary_ctxt_switches: 0
+ x86_Thread_features:
+ x86_Thread_features_locked:
+ - Type: LinuxCMDLine
+ Text: |
+ /tmp/a.out
+ - Type: LinuxEnviron
+ Content: 434C4F554453444B5F434F4E544558545F41574152455F5553455F4543505F485454505F50524F58593D74727565004C4553534F50454E3D7C202F7573722F62696E2F6C6573737069706520257300424153485F46554E435F6E706D25253D2829207B20202F7573722F62696E2F67706B67206E706D20222440220A7D005253594E435F5253483D73736800504152494E49543D72546267715220423D2E3F5F415F6120513D5F733E7C3A004D4F54445F53484F574E3D70616D004C535F434F4C4F52533D72733D303A64693D30313B33343A6C6E3D30313B33363A6D683D30303A70693D34303B33333A736F3D30313B33353A646F3D30313B33353A62643D34303B33333B30313A63643D34303B33333B30313A6F723D34303B33313B30313A6D693D30303A73753D33373B34313A73673D33303B34333A63613D30303A74773D33303B34323A6F773D33343B34323A73743D33373B34343A65783D30313B33323A2A2E377A3D30313B33313A2A2E6163653D30313B33313A2A2E616C7A3D30313B33313A2A2E61706B3D30313B33313A2A2E6172633D30313B33313A2A2E61726A3D30313B33313A2A2E627A3D30313B33313A2A2E627A323D30313B33313A2A2E6361623D30313B33313A2A2E6370696F3D30313B33313A2A2E63726174653D30313B33313A2A2E6465623D30313B33313A2A2E6472706D3D30313B33313A2A2E64776D3D30313B33313A2A2E647A3D30313B33313A2A2E6561723D30313B33313A2A2E6567673D30313B33313A2A2E6573643D30313B33313A2A2E677A3D30313B33313A2A2E6A61723D30313B33313A2A2E6C68613D30313B33313A2A2E6C727A3D30313B33313A2A2E6C7A3D30313B33313A2A2E6C7A343D30313B33313A2A2E6C7A683D30313B33313A2A2E6C7A6D613D30313B33313A2A2E6C7A6F3D30313B33313A2A2E70797A3D30313B33313A2A2E7261723D30313B33313A2A2E72706D3D30313B33313A2A2E727A3D30313B33313A2A2E7361723D30313B33313A2A2E73776D3D30313B33313A2A2E74377A3D30313B33313A2A2E7461723D30313B33313A2A2E74617A3D30313B33313A2A2E74627A3D30313B33313A2A2E74627A323D30313B33313A2A2E74677A3D30313B33313A2A2E746C7A3D30313B33313A2A2E74787A3D30313B33313A2A2E747A3D30313B33313A2A2E747A6F3D30313B33313A2A2E747A73743D30313B33313A2A2E756465623D30313B33313A2A2E7761723D30313B33313A2A2E77686C3D30313B33313A2A2E77696D3D30313B33313A2A2E787A3D30313B33313A2A2E7A3D30313B33313A2A2E7A69703D30313B33313A2A2E7A6F6F3D30313B33313A2A2E7A73743D30313B33313A2A2E617669663D30313B33353A2A2E6A70673D30313B33353A2A2E6A7065673D30313B33353A2A2E6A786C3D30313B33353A2A2E6D6A70673D30313B33353A2A2E6D6A7065673D30313B33353A2A2E6769663D30313B33353A2A2E626D703D30313B33353A2A2E70626D3D30313B33353A2A2E70676D3D30313B33353A2A2E70706D3D30313B33353A2A2E7467613D30313B33353A2A2E78626D3D30313B33353A2A2E78706D3D30313B33353A2A2E7469663D30313B33353A2A2E746966663D30313B33353A2A2E706E673D30313B33353A2A2E7376673D30313B33353A2A2E7376677A3D30313B33353A2A2E6D6E673D30313B33353A2A2E7063783D30313B33353A2A2E6D6F763D30313B33353A2A2E6D70673D30313B33353A2A2E6D7065673D30313B33353A2A2E6D32763D30313B33353A2A2E6D6B763D30313B33353A2A2E7765626D3D30313B33353A2A2E776562703D30313B33353A2A2E6F676D3D30313B33353A2A2E6D70343D30313B33353A2A2E6D34763D30313B33353A2A2E6D7034763D30313B33353A2A2E766F623D30313B33353A2A2E71743D30313B33353A2A2E6E75763D30313B33353A2A2E776D763D30313B33353A2A2E6173663D30313B33353A2A2E726D3D30313B33353A2A2E726D76623D30313B33353A2A2E666C633D30313B33353A2A2E6176693D30313B33353A2A2E666C693D30313B33353A2A2E666C763D30313B33353A2A2E676C3D30313B33353A2A2E646C3D30313B33353A2A2E7863663D30313B33353A2A2E7877643D30313B33353A2A2E7975763D30313B33353A2A2E63676D3D30313B33353A2A2E656D663D30313B33353A2A2E6F67763D30313B33353A2A2E6F67783D30313B33353A2A2E6161633D30303B33363A2A2E61753D30303B33363A2A2E666C61633D30303B33363A2A2E6D34613D30303B33363A2A2E6D69643D30303B33363A2A2E6D6964693D30303B33363A2A2E6D6B613D30303B33363A2A2E6D70333D30303B33363A2A2E6D70633D30303B33363A2A2E6F67673D30303B33363A2A2E72613D30303B33363A2A2E7761763D30303B33363A2A2E6F67613D30303B33363A2A2E6F7075733D30303B33363A2A2E7370783D30303B33363A2A2E787370663D30303B33363A2A7E3D30303B39303A2A233D30303B39303A2A2E62616B3D30303B39303A2A2E6372646F776E6C6F61643D30303B39303A2A2E64706B672D646973743D30303B39303A2A2E64706B672D6E65773D30303B39303A2A2E64706B672D6F6C643D30303B39303A2A2E64706B672D746D703D30303B39303A2A2E6F6C643D30303B39303A2A2E6F7269673D30303B39303A2A2E706172743D30303B39303A2A2E72656A3D30303B39303A2A2E72706D6E65773D30303B39303A2A2E72706D6F7269673D30303B39303A2A2E72706D736176653D30303B39303A2A2E7377703D30303B39303A2A2E746D703D30303B39303A2A2E7563662D646973743D30303B39303A2A2E7563662D6E65773D30303B39303A2A2E7563662D6F6C643D30303B39303A00534B5F5349474E494E475F504C5547494E3D676E756262796167656E7400474F4F474C455F434C4F55445F44495341424C455F4449524543545F504154483D74727565005F3D2F7573722F62696E2F6C6C646200444255535F53455353494F4E5F4255535F414444524553533D756E69783A706174683D2F72756E2F757365722F3439393733322F62757300555345523D6861726A6F686E005353485F434C49454E543D3137322E3235332E33312E323337203437383431203232005034434F4E4649473D2E7034636F6E666967005353485F5454593D2F6465762F7074732F3000424153485F46554E435F7961726E25253D2829207B20202F7573722F62696E2F67706B67207961726E20222440220A7D00424153485F46554E435F6E707825253D2829207B20202F7573722F62696E2F67706B67206E707820222440220A7D0050344D455247453D2F676F6F676C652F7372632F66696C65732F686561642F6465706F742F656E672F706572666F7263652F6D6572676570342E74636C00424153485F46554E435F706E706D25253D2829207B20202F7573722F62696E2F67706B6720706E706D20222440220A7D004C4F474E414D453D6861726A6F686E00434C4F554453444B5F434F4E5441494E45525F5553455F4150504C49434154494F4E5F44454641554C545F43524544454E5449414C533D7472756500424153485F46554E435F686174636825253D2829207B20202F7573722F62696E2F67706B6720686174636820222440220A7D0048495354434F4E54524F4C3D69676E6F72656475707300504154483D2F7573722F6C69622F676F6F676C652D676F6C616E672F62696E3A2F7573722F6C6F63616C2F6275696C64746F6F6C732F6A6176612F6A646B2F62696E3A2F7573722F6C6F63616C2F7362696E3A2F7573722F6C6F63616C2F62696E3A2F7573722F7362696E3A2F7573722F62696E3A2F7362696E3A2F62696E005844475F53455353494F4E5F49443D6339303334005057443D2F7573722F6C6F63616C2F676F6F676C652F686F6D652F6861726A6F686E00424153485F46554E435F7961726E706B6725253D2829207B20202F7573722F62696E2F67706B67207961726E706B6720222440220A7D005353485F415554485F4B45593D65636473612D736861322D6E697374703235362D636572742D763031406F70656E7373682E636F6D20414141414B47566A5A484E684C584E6F59544974626D6C7A644841794E54597459325679644331324D4446416233426C626E4E7A6143356A623230414141416747477568656C4D7545582B357530682B61516D78456E366B6A50433075574E47494C2B793543766B314F6F4141414149626D6C7A644841794E545941414142424250415938413859644E6A6770617A733930786C70703835623231517841416D6C446A384432444A386976546B7648434B676748742F6759495A32306B6A70665A7142644F6C7437385A6C5674725A42453872344D2B385A4141414145414A7A38774141414145414141415861474679616D396F626B426A62334A774C6D6476623264735A53356A62323041414141644141414142326868636D7076614734414141414F5A3239765A32786C58476868636D70766147344141414141615A335A42514141414142706E764E784141414141414141414D77414141415959325679644331745A5852685A4746305955426E6232396E6247557559323974414141414B67414141435949415249677755464C345761352B4368396B4D7047676F4A764F4F4C5747456E75417759724C5073445A4265427576496742674141414256775A584A7461585174574445784C575A76636E6468636D5270626D634141414141414141414633426C636D3170644331685A3256756443316D62334A3359584A6B6157356E414141414141414141425A775A584A7461585174634739796443316D62334A3359584A6B6157356E4141414141414141414170775A584A7461585174634852354141414141414141414135775A584A746158517464584E6C6369317959774141414141414141414141414142467741414141647A63326774636E4E6841414141417745414151414141514541764E305A533562314F5A59746F4A3150534B59344749776A69733169347A5A5A324D42644E2F544559714A494F56736641746B447268433959475356757961692F6B4F58774C4C6E4663356456445257484C4453427A6F5845676C34514B436D4E75396E6E65562F634D4C4571346430336F3144504F535051474A44712B776570344B3948755277767A6F673677544441354B70306C6F436E5759384D4854627434532F4F32526F356D76463078306563397663637757314B4F74632F4379645169476D6576425A4F514F795874385A435A4B4574534F5449506841453535574B386167744D45734A6C485274637377536732424A4E4A4D5365554B674C31416E2F6F434539624B414D452F7A585659564B354675763465707163636E6433735157325438716E694F4963454449346F796244656A6D3647385650772F707869655350626146476674754C79522F72485335324F68774141415251414141414D636E4E684C584E6F595449744D6A55324141414241477A374C6357654478443770523942723178684E624A73317345744B4D7257736C65775657692F56356A34647A3268484C64384B6C57753467746367356A767370793876594E58454950576C47683037745953695744575869444D575562765544314E514F794E345548686B595576574F2B647A372B4C71776C7A574D515A38796958775234714E4A666B343070666F65424B59384E71726E776A4B52724173446E53656E4B544B4E6F646A73666E684B5A4839784C566663456F544764674831364375625947396C31666D65613750724D37714F7250554F6E6B4B565548736F6475766A6F72475A335063476258536176646E7A467836446A6251726D514462523638794F68675939746A77426B4A70627048345845452F612F777257336833595A656D59644536353063574C5364744447366444667476313148384B4B49306B477949554B52513377483367547531546D38736B3D0A0053484C564C3D3100434C4F554453444B5F434F4E544558545F41574152455F5553455F434C49454E545F43455254494649434154453D74727565004C455353434C4F53453D2F7573722F62696E2F6C6573737069706520257320257300424153485F46554E435F7069703325253D2829207B20202F7573722F62696E2F67706B67207069703320222440220A7D005353485F415554485F534F434B3D2F7573722F6C6F63616C2F676F6F676C652F686F6D652F6861726A6F686E2F2E7373682F6167656E742F732E3230524D6B6F466350352E737368642E333630383034322E63614837725067566563005445524D3D787465726D2D323536636F6C6F7200424153485F46554E435F706F6574727925253D2829207B20202F7573722F62696E2F67706B6720706F6574727920222440220A7D005348454C4C3D2F62696E2F6261736800434C4F554453444B5F494E5445524E414C5F555345523D7472756500434C4F554453444B5F434F4E544558545F41574152455F43455254494649434154455F434F4E4649475F46494C455F504154483D2F6574632F67636C6F75642F63657274696669636174655F636F6E6669672E6A736F6E004348524F4D455F52454D4F54455F4445534B544F505F44454641554C545F4445534B544F505F53495A45533D3136303078313230302C3338343078323136302C3338343078323536302C3531323078313434302C323136307833383430005844475F53455353494F4E5F545950453D74747900424153485F46554E435F706E707825253D2829207B20202F7573722F62696E2F67706B6720706E707820222440220A7D00424153485F46554E435F707974686F6E3325253D2829207B20202F7573722F62696E2F67706B6720707974686F6E3320222440220A7D00424153485F46554E435F70697025253D2829207B20202F7573722F62696E2F67706B672070697020222440220A7D00424153485F46554E435F7069707825253D2829207B20202F7573722F62696E2F67706B67207069707820222440220A7D004C414E473D656E5F55532E5554462D38005832305F484F4D453D2F676F6F676C652F646174612F72772F75736572732F68612F6861726A6F686E005353485F434F4E4E454354494F4E3D3137322E3235332E33312E323337203437383431203137322E32382E35372E313037203232005844475F52554E54494D455F4449523D2F72756E2F757365722F34393937333200424153485F46554E435F757625253D2829207B20202F7573722F62696E2F67706B6720757620222440220A7D00424153485F46554E435F707974686F6E25253D2829207B20202F7573722F62696E2F67706B6720707974686F6E20222440220A7D00474F4F474C455F4150495F43455254494649434154455F434F4E4649473D2F6574632F67636C6F75642F63657274696669636174655F636F6E6669672E6A736F6E004356535F5253483D73736800505954484F4E504154483D2F7573722F6C6F63616C2F6275696C64746F6F6C732F63757272656E742F73697465637573746F6D697A65005844475F53455353494F4E5F434C4153533D7573657200474F4F474C455F415554485F574542415554484E5F504C5547494E3D67636C6F7564776562617574686E00424153485F46554E435F70646D25253D2829207B20202F7573722F62696E2F67706B672070646D20222440220A7D0053545245414D5A5F534552564552533D5B323030313A343836303A663830323A3A37385D3A3935333000484F4D453D2F7573722F6C6F63616C2F676F6F676C652F686F6D652F6861726A6F686E005844475F444154415F444952533D2F7573722F73686172652F676E6F6D653A2F7573722F6C6F63616C2F73686172652F3A2F7573722F73686172652F00
+ - Type: LinuxAuxv
+ Content: 21000000000000000050FCF7FF7F00003300000000000000F0060000000000001000000000000000FFFB8B17000000000600000000000000001000000000000011000000000000006400000000000000030000000000000040405555555500000400000000000000380000000000000005000000000000000E0000000000000007000000000000000070FCF7FF7F000008000000000000000000000000000000090000000000000050505555555500000B0000000000000014A00700000000000C0000000000000014A00700000000000D00000000000000535F0100000000000E00000000000000535F01000000000017000000000000000000000000000000190000000000000059D9FFFFFF7F00001A0000000000000002000000000000001F00000000000000EDEFFFFFFF7F00000F0000000000000069D9FFFFFF7F00001B000000000000001C000000000000001C00000000000000200000000000000000000000000000000000000000000000
+ - Type: LinuxMaps
+ Text: |
+ 555555554000-555555555000 r--p 00000000 00:2c 69154 /tmp/a.out
+ 555555555000-555555556000 r-xp 00001000 00:2c 69154 /tmp/a.out
+ 555555556000-555555557000 r--p 00002000 00:2c 69154 /tmp/a.out
+ 555555557000-555555558000 r--p 00002000 00:2c 69154 /tmp/a.out
+ 555555558000-555555559000 rw-p 00003000 00:2c 69154 /tmp/a.out
+ 7ffff7dae000-7ffff7db1000 rw-p 00000000 00:00 0
+ 7ffff7db1000-7ffff7dd9000 r--p 00000000 fd:01 11689180 /usr/lib/x86_64-linux-gnu/libc.so.6
+ 7ffff7dd9000-7ffff7f3e000 r-xp 00028000 fd:01 11689180 /usr/lib/x86_64-linux-gnu/libc.so.6
+ 7ffff7f3e000-7ffff7f94000 r--p 0018d000 fd:01 11689180 /usr/lib/x86_64-linux-gnu/libc.so.6
+ 7ffff7f94000-7ffff7f98000 r--p 001e2000 fd:01 11689180 /usr/lib/x86_64-linux-gnu/libc.so.6
+ 7ffff7f98000-7ffff7f9a000 rw-p 001e6000 fd:01 11689180 /usr/lib/x86_64-linux-gnu/libc.so.6
+ 7ffff7f9a000-7ffff7fa7000 rw-p 00000000 00:00 0
+ 7ffff7fbd000-7ffff7fbf000 rw-p 00000000 00:00 0
+ 7ffff7fbf000-7ffff7fc3000 r--p 00000000 00:00 0 [vvar]
+ 7ffff7fc3000-7ffff7fc5000 r--p 00000000 00:00 0 [vvar_vclock]
+ 7ffff7fc5000-7ffff7fc7000 r-xp 00000000 00:00 0 [vdso]
+ 7ffff7fc7000-7ffff7fc8000 r--p 00000000 fd:01 11689079 /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
+ 7ffff7fc8000-7ffff7ff0000 r-xp 00001000 fd:01 11689079 /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
+ 7ffff7ff0000-7ffff7ffb000 r--p 00029000 fd:01 11689079 /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
+ 7ffff7ffb000-7ffff7ffd000 r--p 00034000 fd:01 11689079 /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
+ 7ffff7ffd000-7ffff7ffe000 rw-p 00036000 fd:01 11689079 /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
+ 7ffff7ffe000-7ffff7fff000 rw-p 00000000 00:00 0
+ 7ffffffdd000-7ffffffff000 rw-p 00000000 00:00 0 [stack]
+ - Type: LinuxProcStat
+ Text: |
+ 3616167 (a.out) t 3616128 3616167 3608050 34816 3615736 0 120 0 0 0 0 0 0 0 20 0 1 0 126326383 2498560 213 18446744073709551615 93824992235520 93824992236013 140737488344560 0 0 0 0 67112960 0 1 0 0 17 1 0 0 0 0 0 93824992247248 93824992247832 93824992251904 140737488345465 140737488345476 140737488345476 140737488351213 0
- Type: Exception
- Thread ID: 0x7E03
+ Thread ID: 0x372DA7
Exception Record:
- Exception Code: 0xB
- Exception Address: 0x40011C
- Thread Context: 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000700100000000000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E8150B24FC7F0000E8150B24FC7F00000C014000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001C014000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+ Exception Code: 0x2
+ Exception Flags: 0x4C4C4442
+ Exception Address: 0x555555555148
+ Number of Parameters: 1
+ Parameter 0: 0x696F706B61657262
+ Parameter 1: 0x312E3120746E
+ Thread Context: 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000700108000000000330000000000000000002B00020200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003E40D87D55555555000008D6FFFFFF7F0000F8D5FFFFFF7F0000A0D4FFFFFF7F0000A0D4FFFFFF7F0000F8D5FFFFFF7F0000B0D4FFFFFF7F0000000000000000000080BCFCF7FF7F000020D2FFFFFF7F00000202000000000000000000000000000008D6FFFFFF7F000000D0FFF7FF7F0000D87D5555555500004851555555550000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040E7DAF7FF7F00000000000000000000
- Type: MemoryList
Memory Ranges:
- - Start of Memory Range: 0x7FFC240B1568
- Content: 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006218160B24FC7F000042014000000000000C0140000000000000000000000000000000000000000000000000000000006638160B24FC7F00005F014000000000000000000000000000000000000000005F0000000000000000010000000000000002200B24FC7F00000000000000000000FE2F0B24FC7F00000000000000000000210000000000000000901224FC7F00001000000000000000FFFBEBBF0000000006000000000000000010000000000000110000000000000064000000000000000300000000000000400040000000000004000000000000003800000000000000050000000000000003000000000000000700000000000000000000000000000008000000000000000000000000000000090000000000000044014000000000000B0000000000000000000000000000000C0000000000000000000000000000000D0000000000000000000000000000000E000000000000000000000000000000170000000000000000000000000000001900000000000000A9170B24FC7F00001A0000000000000000000000000000001F00000000000000FC3F0B24FC7F00000F00000000000000B9170B24FC7F000000000000000000000000000000000000000AB340B9514A4C453C3FB52168ADE70E7838365F36340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F612E6F7574005F3D2F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F612E6F7574002F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F746573742F612E6F7574000000000000000000
- - Start of Memory Range: 0x400000
- Content: 7F454C4602010100000000000000000002003E000100000044014000000000004000000000000000F0040000000000000000000040003800030040000D000A000100000005000000000000000000000000004000000000000000400000000000E001000000000000E00100000000000000002000000000000400000004000000E800000000000000E800400000000000E80040000000000024000000000000002400000000000000040000000000000051E5746406000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000040000001400000003000000474E550001DF54A6045E657D3F8FFB9CE111878914F8BD6D554889E548897DE8C645FF62488B45E8C6002F5DC3554889E54883EC2048897DE8488975E0C645FF66488B55E8488B45E04889D7FFD0C9C3554889E54883EC10C645FF5FBE0C014000BF00000000E8C2FFFFFFC9C3000000000000001400000000000000017A5200017810011B0C0708900100001C0000001C00000084FFFFFF1500000000410E108602430D06500C07080000001C0000003C00000079FFFFFF2300000000410E108602430D065E0C07080000001C0000005C0000007CFFFFFF1D00000000410E108602430D06580C07080000004743433A20285562756E747520342E382E342D327562756E7475317E31342E30342920342E382E34002C0000000200000000000800000000000C01400000000000550000000000000000000000000000000000000000000000EC00000004000000000008011300000001070000003F0000000C01400000000000550000000000000000000000026261720001010C014000000000001500000000000000019C65000000030E00000001016500000002915804460001036B00000002916F0005086B0000000601065800000007666F6F00010721014000000000002300000000000000019CB8000000030E00000001076500000002915803000000000107C300000002915004460001096B00000002916F0008C30000000965000000000508B80000000A51000000010D44014000000000001D00000000000000019C044600010F6B00000002916F0000011101250E130B030E1B0E1101120710170000022E0103083A0B3B0B271911011207401897421901130000030500030E3A0B3B0B49130218000004340003083A0B3B0B491302180000050F000B0B491300000624000B0B3E0B030E0000072E0103083A0B3B0B271911011207401896421901130000081501271901130000090500491300000A2E013F19030E3A0B3B0B27191101120740189642190000003F00000002001D0000000101FB0E0D000101010100000001000001006D61696E2E6300000000000009020C0140000000000013834B7531F34BC931834BE50202000101626F6F6D6572006D61696E2E6300626F6F6D00474E55204320342E382E34202D6D74756E653D67656E65726963202D6D617263683D7838362D3634202D67002F686F6D652F6C61626174682F74657374005F7374617274006368617200002E73796D746162002E737472746162002E7368737472746162002E6E6F74652E676E752E6275696C642D6964002E74657874002E65685F6672616D65002E636F6D6D656E74002E64656275675F6172616E676573002E64656275675F696E666F002E64656275675F616262726576002E64656275675F6C696E65002E64656275675F737472000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001B000000070000000200000000000000E800400000000000E80000000000000024000000000000000000000000000000040000000000000000000000000000002E0000000100000006000000000000000C014000000000000C010000000000005500000000000000000000000000000001000000000000000000000000000000340000000100000002000000000000006801400000000000680100000000000078000000000000000000000000000000080000000000000000000000000000003E0000000100000030000000000000000000000000000000E0010000000000002900000000000000000000000000000001000000000000000100000000000000470000000100000000000000000000000000000000000000090200000000000030000000000000000000000000000000010000000000000000000000000000005600000001000000000000000000000000000000000000003902000000000000F00000000000000000000000000000000100000000000000000000000000000062000000010000000000000000000000000000000000000029030000000000009E00000000000000000000000000000001000000000000000000000000000000700000000100000000000000000000000000000000000000C70300000000000043000000000000000000000000000000010000000000000000000000000000007C00000001000000300000000000000000000000000000000A040000000000005D00000000000000000000000000000001000000000000000100000000000000110000000300000000000000000000000000000000000000670400000000000087000000000000000000000000000000010000000000000000000000000000000100000002000000000000000000000000000000000000003008000000000000B0010000000000000C0000000E00000008000000000000001800000000000000090000000300000000000000000000000000000000000000E0090000000000002F000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000100E800400000000000000000000000000000000000030002000C014000000000000000000000000000000000000300030068014000000000000000000000000000000000000300040000000000000000000000000000000000000000000300050000000000000000000000000000000000000000000300060000000000000000000000000000000000000000000300070000000000000000000000000000000000000000000300080000000000000000000000000000000000000000000300090000000000000000000000000000000000010000000400F1FF0000000000000000000000000000000008000000020002000C0140000000000015000000000000000C0000000200020021014000000000002300000000000000000000000400F1FF00000000000000000000000000000000100000001200020044014000000000001D000000000000001700000010000300001060000000000000000000000000002300000010000300001060000000000000000000000000002A0000001000030000106000000000000000000000000000006D61696E2E630062617200666F6F005F7374617274005F5F6273735F7374617274005F6564617461005F656E6400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
- - Start of Memory Range: 0x7FFC24126000
- Content: '000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
- - Start of Memory Range: 0x7FFC24129000
- Content: 7F454C4602010100000000000000000003003E000100000060060000000000004000000000000000D80A00000000000000000000400038000400400010000F0001000000050000000000000000000000000000000000000000000000000000000C0A0000000000000C0A00000000000000100000000000000200000004000000A003000000000000A003000000000000A0030000000000001001000000000000100100000000000008000000000000000400000004000000B004000000000000B004000000000000B00400000000000068000000000000006800000000000000040000000000000050E57464040000001805000000000000180500000000000018050000000000003C000000000000003C000000000000000400000000000000030000000C000000060000000500000008000000000000000000000009000000020000000A000000000000000B0000000100000007000000000000000300000004000000000000000300000001000000010000000600000089343805466500A10100000007000000090000007E55DD7100CA1BB0DA109A9E528F3068864B85E60D8E1E8294789E7C19A3436E8A2AC62626B062656D5887FF0000000000000000000000000000000000000000000000002800000022000B007008000000000000AC000000000000000100000012000B00D00700000000000088000000000000003D00000022000B00200900000000000048000000000000003600000012000B00200900000000000048000000000000000800000022000B00D00700000000000088000000000000001500000012000B00600800000000000010000000000000001C00000022000B00600800000000000010000000000000002100000012000B007008000000000000AC00000000000000680000001100F1FF000000000000000000000000000000004A00000012000B00700900000000000025000000000000005100000022000B0070090000000000002500000000000000005F5F7664736F5F67657474696D656F66646179005F5F7664736F5F74696D65005F5F7664736F5F636C6F636B5F67657474696D65005F5F7664736F5F636C6F636B5F676574726573005F5F7664736F5F676574637075006C696E75782D7664736F2E736F2E31004C494E55585F322E36000000020002000200020002000200020002000200020002000000000000000100010001000100A1BFEE0D140000001C00000058000000000000000100000002000100F675AE03140000000000000068000000000000000E0000000000000058000000000000001000000000000000000000000000000004000000000000002001000000000000F5FEFF6F0000000068010000000000000500000000000000D8020000000000000600000000000000B8010000000000000A0000000000000072000000000000000B000000000000001800000000000000FCFFFF6F000000006803000000000000FDFFFF6F000000000200000000000000F0FFFF6F000000004A030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000004000000000000004C696E75780000000D0505000600000017000000000100004C696E7578000000352E352E31332D3230302E666333312E7838365F36340000040000001400000003000000474E55008CBE1E6C351152C0C43E68C4EF417DB4C77E8EBD011B033B3C000000060000004801000058000000B80200009800000048030000D000000058030000E4000000080400001C0100005804000030010000000000001400000000000000017A5200017810011B0C0708900100003C0000001C000000E80000006E01000000410E108602540D06458D038C048305630AC347CC42CD41C60C0708410B025B0AC342CC45CD41C60C0708460B000000340000005C000000180200008800000000410E108602430D06428C0348830402490AC342CC41C60C0708410B520AC342CC41C60C0708410B100000009400000070020000100000000000000034000000A80000006C020000AC00000000410E108602430D06428D03458C04730ACC44CD41C60C0708410B480ACC49CD41C60C0708410B0010000000E0000000E4020000480000000000000010000000F400000020030000250000000000000000000000554863F64989D24989C948C1E6044C8D04374889E54155415453EB02F3908B3740F6C60175F68B470483F801741A83F8020F84BA00000083F80374755BB8FFFFFFFF415C415D5DC30F01F9669048C1E2204809C2498B4028488B4F084885D278DB448B5F184839D1730A4829CA490FAFD34801D08B4F1C4D8B58208B1739F2759D48D3E8483DFFC99A3B761631D2482D00CA9A3B83C201483DFFC99A3B77EF4901D35B415C4D891A415D5D49890131C0C34C8D25E8E8FFFF418B1C2485DB0F8478FFFFFF4C8B2DDDE8FFFF4C8B1DDEE8FFFF0F01F96690418B0C2439CB75D948C1E2204809D049F7E54C01DAE963FFFFFF8B15A9D8FFFF488D1DA2D8FFFF83E2FE4189D3F605B2D8FFFF010F842BFFFFFF0F01F9669048C1E2204809C24889D00FBE1595D8FFFF482B057AD8FFFF4989C489D1F7D949D3EC89D148D3E085D24C89E28B0D70D8FFFF480F49D04889D048F7E1480FACD020488B0D52D8FFFF8B134139D37599488D1408E9E6FEFFFF6690554889E541544989F4534883EC104885FF74384889FB488D55E0488D4DE831F6488D3D89C8FFFFE864FEFFFF85C0752B488B45E04889038B45E84869C0D34D621048C1E82689C04889430831C04D85E4751F4883C4105B415C5DC34889DF4C89E6B8600000000F054883C4105B415C5DC38B1519C9FFFF418914248B1513C9FFFF4189542404EBCA0F1F840000000000488B0539C8FFFF4885FF7403488907C3554889E541554989F541544189FC83FF0F7731B80100000089F9D3E0A9830800007434488D4E084889F289FE488D3DDDC7FFFFE8B8FDFFFF85C07508415C31C0415D5DC34489E74C89EE415CB8E40000000F05415D5DC3A860751BA81074E5488D4E084889F289FE488D3D91C8FFFFE87CFDFFFFEBC24863CF488D1590C7FFFF4883C10248C1E1044801D1EB02F3908B02A80175F8488B3149897500488B7108498975088B3239F07492EBE30F1F400083FF0F7731B80100000089F98B1536C8FFFFD3E0A98308000074134885F6742548C7060000000031C048895608C3A860750CA81075E5B8E50000000F05C3BA40420F00EBD631C0C39090909090909090B87B0000000F03C0904885FF740A89C281E2FF0F000089174885F67405C1E80C890631C0C313FDFFFF57000000720005050306FDFFFF4F0000003B0005030383FDFFFF45000000720005050376FDFFFF3D0000003B00050303A8FDFFFF3300000072000505039BFDFFFF2B0000003B0005030392FFFFFF2100000016020404010FAEE80F310F01F90FAEE80F310F01F90FAEE80F310F01F9F30FC7F84743433A2028474E552920392E322E3120323031393038323720285265642048617420392E322E312D312900002E7368737472746162002E676E752E68617368002E64796E73796D002E64796E737472002E676E752E76657273696F6E002E676E752E76657273696F6E5F64002E64796E616D6963002E6E6F7465002E65685F6672616D655F686472002E65685F6672616D65002E74657874002E616C74696E737472756374696F6E73002E616C74696E7374725F7265706C6163656D656E74002E636F6D6D656E74000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F0000000500000002000000000000002001000000000000200100000000000044000000000000000300000000000000080000000000000004000000000000000B000000F6FFFF6F0200000000000000680100000000000068010000000000005000000000000000030000000000000008000000000000000000000000000000150000000B0000000200000000000000B801000000000000B80100000000000020010000000000000400000001000000080000000000000018000000000000001D000000030000000200000000000000D802000000000000D802000000000000720000000000000000000000000000000100000000000000000000000000000025000000FFFFFF6F02000000000000004A030000000000004A03000000000000180000000000000003000000000000000200000000000000020000000000000032000000FDFFFF6F020000000000000068030000000000006803000000000000380000000000000004000000020000000800000000000000000000000000000041000000060000000300000000000000A003000000000000A00300000000000010010000000000000400000000000000080000000000000010000000000000004A000000070000000200000000000000B004000000000000B004000000000000680000000000000000000000000000000400000000000000000000000000000050000000010000000200000000000000180500000000000018050000000000003C000000000000000000000000000000040000000000000000000000000000005E000000010000000200000000000000580500000000000058050000000000000401000000000000000000000000000008000000000000000000000000000000680000000100000006000000000000006006000000000000600600000000000035030000000000000000000000000000100000000000000000000000000000006E000000010000000200000000000000950900000000000095090000000000005B000000000000000000000000000000010000000000000000000000000000007F000000010000000600000000000000F009000000000000F0090000000000001C000000000000000000000000000000010000000000000000000000000000009500000001000000300000000000000000000000000000000C0A0000000000002C00000000000000000000000000000001000000000000000100000000000000010000000300000000000000000000000000000000000000380A0000000000009E000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
- - Start of Memory Range: 0xFFFFFFFFFF600000
- Content: 48C7C0600000000F05C3CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC48C7C0C90000000F05C3CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC48C7C0350100000F05C3CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
+ - Start of Memory Range: 0x7FFFFFFFD420
+ Content: 0000C000000000000000C0000000000000010000000000000000C0000000000040000000000000001000000000000000000008000000000029018C2100000000170000000000000000000000000000000000000000000000000000000000000017000000310000000000000000000000B0D4FFFFFF7F00000000000000000000E0D4FFFFFF7F0000CB515555555500000000000000001440000000000000144000000000000039400000000000003E40F8D5FFFFFF7F000001000000000000000100000000000000A8ACDDF7FF7F0000E0D5FFFFFF7F000080515555555500004040555501000000F8D5FFFFFF7F0000F8D5FFFFFF7F00005002D40952A1CA98000000000000000008D6FFFFFF7F000000D0FFF7FF7F0000D87D555555550000500236A0AD5E356750021651E94E3567000000000000000000000000000000000000000000000000F8D5FFFFFF7F00000100000000000000007B97470D7B2415F0D5FFFFFF7F000065ADDDF7FF7F00008051555555550000D87D55555555000010E3FFF7FF7F0000000000000000000000000000000000005050555555550000F0D5FFFFFF7F0000000000000000000000000000000000007150555555550000E8D5FFFFFF7F00003800000000000000010000000000000079D9FFFFFF7F0000000000000000000084D9FFFFFF7F0000B3D9FFFFFF7F0000D3D9FFFFFF7F000002DAFFFFFF7F000010DAFFFFFF7F000030DAFFFFFF7F00003FDAFFFFFF7F0000BCE1FFFFFF7F0000DAE1FFFFFF7F000000E2FFFFFF7F000010E2FFFFFF7F000048E2FFFFFF7F000055E2FFFFFF7F000078E2FFFFFF7F00008BE2FFFFFF7F00009EE2FFFFFF7F0000CFE2FFFFFF7F0000FEE2FFFFFF7F00003CE3FFFFFF7F00006DE3FFFFFF7F00007DE3FFFFFF7F0000B9E3FFFFFF7F0000ECE3FFFFFF7F000003E4FFFFFF7F000083E4FFFFFF7F000098E4FFFFFF7F0000BBE4FFFFFF7F0000F2E4FFFFFF7F000086EAFFFFFF7F00008EEAFFFFFF7F0000C1EAFFFFFF7F0000E3EAFFFFFF7F000014EBFFFFFF7F000071EBFFFFFF7F000085EBFFFFFF7F0000BAEBFFFFFF7F0000CAEBFFFFFF7F0000E6EBFFFFFF7F00003EECFFFFFF7F00009CECFFFFFF7F0000B1ECFFFFFF7F0000E2ECFFFFFF7F000019EDFFFFFF7F000048EDFFFFFF7F000079EDFFFFFF7F00008AEDFFFFFF7F0000B4EDFFFFFF7F0000E9EDFFFFFF7F00000AEEFFFFFF7F000037EEFFFFFF7F00006CEEFFFFFF7F0000AEEEFFFFFF7F0000BAEEFFFFFF7F0000F1EEFFFFFF7F000008EFFFFFFF7F000033EFFFFFFF7F000062EFFFFFFF7F00008CEFFFFFFF7F0000B0EFFFFFFF7F0000000000000000000021000000000000000050FCF7FF7F00003300000000000000F0060000000000001000000000000000FFFB8B17000000000600000000000000001000000000000011000000000000006400000000000000030000000000000040405555555500000400000000000000380000000000000005000000000000000E0000000000000007000000000000000070FCF7FF7F000008000000000000000000000000000000090000000000000050505555555500000B0000000000000014A00700000000000C0000000000000014A00700000000000D00000000000000535F0100000000000E00000000000000535F01000000000017000000000000000000000000000000190000000000000059D9FFFFFF7F00001A0000000000000002000000000000001F00000000000000EDEFFFFFFF7F00000F0000000000000069D9FFFFFF7F00001B000000000000001C000000000000001C0000000000000020000000000000000000000000000000000000000000000000C27B97470D7B2415EB04A950654C28017838365F3634000000000000000000002F746D702F612E6F757400434C4F554453444B5F434F4E544558545F41574152455F5553455F4543505F485454505F50524F58593D74727565004C4553534F50454E3D7C202F7573722F62696E2F6C6573737069706520257300424153485F46554E435F6E706D25253D2829207B20202F7573722F62696E2F67706B67206E706D20222440220A7D005253594E435F5253483D73736800504152494E49543D72546267715220423D2E3F5F415F6120513D5F733E7C3A004D4F54445F53484F574E3D70616D004C535F434F4C4F52533D72733D303A64693D30313B33343A6C6E3D30313B33363A6D683D30303A70693D34303B33333A736F3D30313B33353A646F3D30313B33353A62643D34303B33333B30313A63643D34303B33333B30313A6F723D34303B33313B30313A6D693D30303A73753D33373B34313A73673D33303B34333A63613D30303A74773D33303B34323A6F773D33343B34323A73743D33373B34343A65783D30313B33323A2A2E377A3D30313B33313A2A2E6163653D30313B33313A2A2E616C7A3D30313B33313A2A2E61706B3D30313B33313A2A2E6172633D30313B33313A2A2E61726A3D30313B33313A2A2E627A3D30313B33313A2A2E627A323D30313B33313A2A2E6361623D30313B33313A2A2E6370696F3D30313B33313A2A2E63726174653D30313B33313A2A2E6465623D30313B33313A2A2E6472706D3D30313B33313A2A2E64776D3D30313B33313A2A2E647A3D30313B33313A2A2E6561723D30313B33313A2A2E6567673D30313B33313A2A2E6573643D30313B33313A2A2E677A3D30313B33313A2A2E6A61723D30313B33313A2A2E6C68613D30313B33313A2A2E6C727A3D30313B33313A2A2E6C7A3D30313B33313A2A2E6C7A343D30313B33313A2A2E6C7A683D30313B33313A2A2E6C7A6D613D30313B33313A2A2E6C7A6F3D30313B33313A2A2E70797A3D30313B33313A2A2E7261723D30313B33313A2A2E72706D3D30313B33313A2A2E727A3D30313B33313A2A2E7361723D30313B33313A2A2E73776D3D30313B33313A2A2E74377A3D30313B33313A2A2E7461723D30313B33313A2A2E74617A3D30313B33313A2A2E74627A3D30313B33313A2A2E74627A323D30313B33313A2A2E74677A3D30313B33313A2A2E746C7A3D30313B33313A2A2E74787A3D30313B33313A2A2E747A3D30313B33313A2A2E747A6F3D30313B33313A2A2E747A73743D30313B33313A2A2E756465623D30313B33313A2A2E7761723D30313B33313A2A2E77686C3D30313B33313A2A2E77696D3D30313B33313A2A2E787A3D30313B33313A2A2E7A3D30313B33313A2A2E7A69703D30313B33313A2A2E7A6F6F3D30313B33313A2A2E7A73743D30313B33313A2A2E617669663D30313B33353A2A2E6A70673D30313B33353A2A2E6A7065673D30313B33353A2A2E6A786C3D30313B33353A2A2E6D6A70673D30313B33353A2A2E6D6A7065673D30313B33353A2A2E6769663D30313B33353A2A2E626D703D30313B33353A2A2E70626D3D30313B33353A2A2E70676D3D30313B33353A2A2E70706D3D30313B33353A2A2E7467613D30313B33353A2A2E78626D3D30313B33353A2A2E78706D3D30313B33353A2A2E7469663D30313B33353A2A2E746966663D30313B33353A2A2E706E673D30313B33353A2A2E7376673D30313B33353A2A2E7376677A3D30313B33353A2A2E6D6E673D30313B33353A2A2E7063783D30313B33353A2A2E6D6F763D30313B33353A2A2E6D70673D30313B33353A2A2E6D7065673D30313B33353A2A2E6D32763D30313B33353A2A2E6D6B763D30313B33353A2A2E7765626D3D30313B33353A2A2E776562703D30313B33353A2A2E6F676D3D30313B33353A2A2E6D70343D30313B33353A2A2E6D34763D30313B33353A2A2E6D7034763D30313B33353A2A2E766F623D30313B33353A2A2E71743D30313B33353A2A2E6E75763D30313B33353A2A2E776D763D30313B33353A2A2E6173663D30313B33353A2A2E726D3D30313B33353A2A2E726D76623D30313B33353A2A2E666C633D30313B33353A2A2E6176693D30313B33353A2A2E666C693D30313B33353A2A2E666C763D30313B33353A2A2E676C3D30313B33353A2A2E646C3D30313B33353A2A2E7863663D30313B33353A2A2E7877643D30313B33353A2A2E7975763D30313B33353A2A2E63676D3D30313B33353A2A2E656D663D30313B33353A2A2E6F67763D30313B33353A2A2E6F67783D30313B33353A2A2E6161633D30303B33363A2A2E61753D30303B33363A2A2E666C61633D30303B33363A2A2E6D34613D30303B33363A2A2E6D69643D30303B33363A2A2E6D6964693D30303B33363A2A2E6D6B613D30303B33363A2A2E6D70333D30303B33363A2A2E6D70633D30303B33363A2A2E6F67673D30303B33363A2A2E72613D30303B33363A2A2E7761763D30303B33363A2A2E6F67613D30303B33363A2A2E6F7075733D30303B33363A2A2E7370783D30303B33363A2A2E787370663D30303B33363A2A7E3D30303B39303A2A233D30303B39303A2A2E62616B3D30303B39303A2A2E6372646F776E6C6F61643D30303B39303A2A2E64706B672D646973743D30303B39303A2A2E64706B672D6E65773D30303B39303A2A2E64706B672D6F6C643D30303B39303A2A2E64706B672D746D703D30303B39303A2A2E6F6C643D30303B39303A2A2E6F7269673D30303B39303A2A2E706172743D30303B39303A2A2E72656A3D30303B39303A2A2E72706D6E65773D30303B39303A2A2E72706D6F7269673D30303B39303A2A2E72706D736176653D30303B39303A2A2E7377703D30303B39303A2A2E746D703D30303B39303A2A2E7563662D646973743D30303B39303A2A2E7563662D6E65773D30303B39303A2A2E7563662D6F6C643D30303B39303A00534B5F5349474E494E475F504C5547494E3D676E756262796167656E7400474F4F474C455F434C4F55445F44495341424C455F4449524543545F504154483D74727565005F3D2F7573722F62696E2F6C6C646200444255535F53455353494F4E5F4255535F414444524553533D756E69783A706174683D2F72756E2F757365722F3439393733322F62757300555345523D6861726A6F686E005353485F434C49454E543D3137322E3235332E33312E323337203437383431203232005034434F4E4649473D2E7034636F6E666967005353485F5454593D2F6465762F7074732F3000424153485F46554E435F7961726E25253D2829207B20202F7573722F62696E2F67706B67207961726E20222440220A7D00424153485F46554E435F6E707825253D2829207B20202F7573722F62696E2F67706B67206E707820222440220A7D0050344D455247453D2F676F6F676C652F7372632F66696C65732F686561642F6465706F742F656E672F706572666F7263652F6D6572676570342E74636C00424153485F46554E435F706E706D25253D2829207B20202F7573722F62696E2F67706B6720706E706D20222440220A7D004C4F474E414D453D6861726A6F686E00434C4F554453444B5F434F4E5441494E45525F5553455F4150504C49434154494F4E5F44454641554C545F43524544454E5449414C533D7472756500424153485F46554E435F686174636825253D2829207B20202F7573722F62696E2F67706B6720686174636820222440220A7D0048495354434F4E54524F4C3D69676E6F72656475707300504154483D2F7573722F6C69622F676F6F676C652D676F6C616E672F62696E3A2F7573722F6C6F63616C2F6275696C64746F6F6C732F6A6176612F6A646B2F62696E3A2F7573722F6C6F63616C2F7362696E3A2F7573722F6C6F63616C2F62696E3A2F7573722F7362696E3A2F7573722F62696E3A2F7362696E3A2F62696E005844475F53455353494F4E5F49443D6339303334005057443D2F7573722F6C6F63616C2F676F6F676C652F686F6D652F6861726A6F686E00424153485F46554E435F7961726E706B6725253D2829207B20202F7573722F62696E2F67706B67207961726E706B6720222440220A7D005353485F415554485F4B45593D65636473612D736861322D6E697374703235362D636572742D763031406F70656E7373682E636F6D20414141414B47566A5A484E684C584E6F59544974626D6C7A644841794E54597459325679644331324D4446416233426C626E4E7A6143356A623230414141416747477568656C4D7545582B357530682B61516D78456E366B6A50433075574E47494C2B793543766B314F6F4141414149626D6C7A644841794E545941414142424250415938413859644E6A6770617A733930786C70703835623231517841416D6C446A384432444A386976546B7648434B676748742F6759495A32306B6A70665A7142644F6C7437385A6C5674725A42453872344D2B385A4141414145414A7A38774141414145414141415861474679616D396F626B426A62334A774C6D6476623264735A53356A62323041414141644141414142326868636D7076614734414141414F5A3239765A32786C58476868636D70766147344141414141615A335A42514141414142706E764E784141414141414141414D77414141415959325679644331745A5852685A4746305955426E6232396E6247557559323974414141414B67414141435949415249677755464C345761352B4368396B4D7047676F4A764F4F4C5747456E75417759724C5073445A4265427576496742674141414256775A584A7461585174574445784C575A76636E6468636D5270626D634141414141414141414633426C636D3170644331685A3256756443316D62334A3359584A6B6157356E414141414141414141425A775A584A7461585174634739796443316D62334A3359584A6B6157356E4141414141414141414170775A584A7461585174634852354141414141414141414135775A584A746158517464584E6C6369317959774141414141414141414141414142467741414141647A63326774636E4E6841414141417745414151414141514541764E305A533562314F5A59746F4A3150534B59344749776A69733169347A5A5A324D42644E2F544559714A494F56736641746B447268433959475356757961692F6B4F58774C4C6E4663356456445257484C4453427A6F5845676C34514B436D4E75396E6E65562F634D4C4571346430336F3144504F535051474A44712B776570344B3948755277767A6F673677544441354B70306C6F436E5759384D4854627434532F4F32526F356D76463078306563397663637757314B4F74632F4379645169476D6576425A4F514F795874385A435A4B4574534F5449506841453535574B386167744D45734A6C485274637377536732424A4E4A4D5365554B674C31416E2F6F434539624B414D452F7A585659564B354675763465707163636E6433735157325438716E694F4963454449346F796244656A6D3647385650772F707869655350626146476674754C79522F72485335324F68774141415251414141414D636E4E684C584E6F595449744D6A55324141414241477A374C6357654478443770523942723178684E624A73317345744B4D7257736C65775657692F56356A34647A3268484C64384B6C57753467746367356A767370793876594E58454950576C47683037745953695744575869444D575562765544314E514F794E345548686B595576574F2B647A372B4C71776C7A574D515A38796958775234714E4A666B343070666F65424B59384E71726E776A4B52724173446E53656E4B544B4E6F646A73666E684B5A4839784C566663456F544764674831364375625947396C31666D65613750724D37714F7250554F6E6B4B565548736F6475766A6F72475A335063476258536176646E7A467836446A6251726D514462523638794F68675939746A77426B4A70627048345845452F612F777257336833595A656D59644536353063574C5364744447366444667476313148384B4B49306B477949554B52513377483367547531546D38736B3D0A0053484C564C3D3100434C4F554453444B5F434F4E544558545F41574152455F5553455F434C49454E545F43455254494649434154453D74727565004C455353434C4F53453D2F7573722F62696E2F6C6573737069706520257320257300424153485F46554E435F7069703325253D2829207B20202F7573722F62696E2F67706B67207069703320222440220A7D005353485F415554485F534F434B3D2F7573722F6C6F63616C2F676F6F676C652F686F6D652F6861726A6F686E2F2E7373682F6167656E742F732E3230524D6B6F466350352E737368642E333630383034322E63614837725067566563005445524D3D787465726D2D323536636F6C6F7200424153485F46554E435F706F6574727925253D2829207B20202F7573722F62696E2F67706B6720706F6574727920222440220A7D005348454C4C3D2F62696E2F6261736800434C4F554453444B5F494E5445524E414C5F555345523D7472756500434C4F554453444B5F434F4E544558545F41574152455F43455254494649434154455F434F4E4649475F46494C455F504154483D2F6574632F67636C6F75642F63657274696669636174655F636F6E6669672E6A736F6E004348524F4D455F52454D4F54455F4445534B544F505F44454641554C545F4445534B544F505F53495A45533D3136303078313230302C3338343078323136302C3338343078323536302C3531323078313434302C323136307833383430005844475F53455353494F4E5F545950453D74747900424153485F46554E435F706E707825253D2829207B20202F7573722F62696E2F67706B6720706E707820222440220A7D00424153485F46554E435F707974686F6E3325253D2829207B20202F7573722F62696E2F67706B6720707974686F6E3320222440220A7D00424153485F46554E435F70697025253D2829207B20202F7573722F62696E2F67706B672070697020222440220A7D00424153485F46554E435F7069707825253D2829207B20202F7573722F62696E2F67706B67207069707820222440220A7D004C414E473D656E5F55532E5554462D38005832305F484F4D453D2F676F6F676C652F646174612F72772F75736572732F68612F6861726A6F686E005353485F434F4E4E454354494F4E3D3137322E3235332E33312E323337203437383431203137322E32382E35372E313037203232005844475F52554E54494D455F4449523D2F72756E2F757365722F34393937333200424153485F46554E435F757625253D2829207B20202F7573722F62696E2F67706B6720757620222440220A7D00424153485F46554E435F707974686F6E25253D2829207B20202F7573722F62696E2F67706B6720707974686F6E20222440220A7D00474F4F474C455F4150495F43455254494649434154455F434F4E4649473D2F6574632F67636C6F75642F63657274696669636174655F636F6E6669672E6A736F6E004356535F5253483D73736800505954484F4E504154483D2F7573722F6C6F63616C2F6275696C64746F6F6C732F63757272656E742F73697465637573746F6D697A65005844475F53455353494F4E5F434C4153533D7573657200474F4F474C455F415554485F574542415554484E5F504C5547494E3D67636C6F7564776562617574686E00424153485F46554E435F70646D25253D2829207B20202F7573722F62696E2F67706B672070646D20222440220A7D0053545245414D5A5F534552564552533D5B323030313A343836303A663830323A3A37385D3A3935333000484F4D453D2F7573722F6C6F63616C2F676F6F676C652F686F6D652F6861726A6F686E005844475F444154415F444952533D2F7573722F73686172652F676E6F6D653A2F7573722F6C6F63616C2F73686172652F3A2F7573722F73686172652F002F746D702F612E6F7574000000000000000000
+ - Type: Memory64List
+ Memory Ranges:
+ - Start of Memory Range: 0x555555557000
+ Content: 01000200000000000000000000001440000000000000144000000000000039400000000000003E406672616D655F617265613A2025660A00011B033B3400000005000000E8EFFFFF8000000008F0FFFFA800000018F0FFFF5000000008F1FFFFC000000048F1FFFFE0000000000000001400000000000000017A5200017810011B0C070890010710140000001C000000C0EFFFFF2200000000000000000000001400000000000000017A5200017810011B0C070890010000240000001C00000060EFFFFF20000000000E10460E184A0F0B770880003F1A3B2A33242200000000140000004400000058EFFFFF0800000000000000000000001C0000005C00000040F0FFFF3700000000410E108602430D06720C07080000001C0000007C00000060F0FFFF6100000000410E108602430D06025C0C0708000000000000040000001000000001000000474E55000000000003000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003051555555550000F050555555550000010000000000000029000000000000000C0000000000000000100000000000000D00000000000000E4110000000000001900000000000000D03D0000000000001B0000000000000008000000000000001A00000000000000D83D0000000000001C000000000000000800000000000000F5FEFF6F00000000B043555555550000050000000000000080445555555500000600000000000000D8435555555500000A000000000000008F000000000000000B000000000000001800000000000000150000000000000078DBFFF7FF7F00000300000000000000E87F555555550000020000000000000018000000000000001400000000000000070000000000000017000000000000001046555555550000070000000000000050455555555500000800000000000000C00000000000000009000000000000001800000000000000FBFFFF6F000000000000000800000000FEFFFF6F000000002005000000000000FFFFFF6F000000000100000000000000F0FFFF6F000000001045555555550000F9FFFF6F0000000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E0ACDDF7FF7F0000000000000000000000000000000000000000000000000000F02BDFF7FF7F0000E03D00000000000010E3FFF7FF7F00001096FDF7FF7F0000
+ - Start of Memory Range: 0x7FFFF7DAE000
+ Content: 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C093F9F7FF7F00004007FAF7FF7F00000000000000000000E0F9F3F7FF7F0000E0FFF3F7FF7F0000E008F4F7FF7F00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040E7DAF7FF7F0000E0F0DAF7FF7F000040E7DAF7FF7F000000000000000000000000000000000000007B97470D7B2415EB04A950654C280100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010DBFFF7FF7F000010DBFFF7FF7F0000A72D37000000000020EADAF7FF7F000020EADAF7FF7F0000E0FFFFFFFFFFFFFF0000000000000000000000000000000010D5FFFFFF7F00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050EADAF7FF7F0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F0D5FFFFFF7F000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E0DAF7FF7F00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F00000000000000000000000000000001000000000000000000000000000000B8E6DAF7FF7F0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010DBF7FF7F0000786EFAF7FF7F000060D1FBF7FF7F0000E040F6F7FF7F00000050FCF7FF7F00001768FCF7FF7F0000F0E8FFF7FF7F00008457FCF7FF7F00000070FCF7FF7F000010E3FFF7FF7F0000A0DDFFF7FF7F00005864FFF7FF7F00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
...
diff --git a/lldb/unittests/DAP/Inputs/linux-x86_64.out.yaml b/lldb/unittests/DAP/Inputs/linux-x86_64.out.yaml
index b374c57693a4b..bf8a046337715 100644
--- a/lldb/unittests/DAP/Inputs/linux-x86_64.out.yaml
+++ b/lldb/unittests/DAP/Inputs/linux-x86_64.out.yaml
@@ -1,148 +1,618 @@
+# $ cat sample.c
+# #include <stdio.h>
+#
+# struct rect {
+# double x, y, height, width;
+# };
+#
+# double frame_area(struct rect *rect) {
+# if (!rect) return 0;
+# return rect->height * rect->width;
+# }
+#
+# int main(int argc, char**argv) {
+# struct rect frame = {5, 5, 25, 30};
+# printf("frame_area: %f\n", frame_area(&frame));
+# return 0;
+# }
--- !ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
- Type: ET_EXEC
+ Type: ET_DYN
Machine: EM_X86_64
- Entry: 0x400144
+ Entry: 0x1050
ProgramHeaders:
+ - Type: PT_PHDR
+ Flags: [ PF_R ]
+ VAddr: 0x40
+ Align: 0x8
+ Offset: 0x40
+ - Type: PT_INTERP
+ Flags: [ PF_R ]
+ FirstSec: .interp
+ LastSec: .interp
+ VAddr: 0x394
+ Offset: 0x394
- Type: PT_LOAD
- Flags: [ PF_X, PF_R ]
- FirstSec: .note.gnu.build-id
- LastSec: .eh_frame
- VAddr: 0x400000
- Align: 0x200000
+ Flags: [ PF_R ]
+ FirstSec: .note.gnu.property
+ LastSec: .rela.plt
+ Align: 0x1000
Offset: 0x0
+ - Type: PT_LOAD
+ Flags: [ PF_X, PF_R ]
+ FirstSec: .init
+ LastSec: .fini
+ VAddr: 0x1000
+ Align: 0x1000
+ Offset: 0x1000
+ - Type: PT_LOAD
+ Flags: [ PF_R ]
+ FirstSec: .rodata
+ LastSec: .note.ABI-tag
+ VAddr: 0x2000
+ Align: 0x1000
+ Offset: 0x2000
+ - Type: PT_LOAD
+ Flags: [ PF_W, PF_R ]
+ FirstSec: .init_array
+ LastSec: .bss
+ VAddr: 0x3DD0
+ Align: 0x1000
+ Offset: 0x2DD0
+ - Type: PT_DYNAMIC
+ Flags: [ PF_W, PF_R ]
+ FirstSec: .dynamic
+ LastSec: .dynamic
+ VAddr: 0x3DE0
+ Align: 0x8
+ Offset: 0x2DE0
+ - Type: PT_NOTE
+ Flags: [ PF_R ]
+ FirstSec: .note.gnu.property
+ LastSec: .note.gnu.property
+ VAddr: 0x350
+ Align: 0x8
+ Offset: 0x350
- Type: PT_NOTE
Flags: [ PF_R ]
FirstSec: .note.gnu.build-id
LastSec: .note.gnu.build-id
- VAddr: 0x4000E8
+ VAddr: 0x370
+ Align: 0x4
+ Offset: 0x370
+ - Type: PT_NOTE
+ Flags: [ PF_R ]
+ FirstSec: .note.ABI-tag
+ LastSec: .note.ABI-tag
+ VAddr: 0x213C
Align: 0x4
- Offset: 0xE8
+ Offset: 0x213C
+ - Type: PT_GNU_PROPERTY
+ Flags: [ PF_R ]
+ FirstSec: .note.gnu.property
+ LastSec: .note.gnu.property
+ VAddr: 0x350
+ Align: 0x8
+ Offset: 0x350
+ - Type: PT_GNU_EH_FRAME
+ Flags: [ PF_R ]
+ FirstSec: .eh_frame_hdr
+ LastSec: .eh_frame_hdr
+ VAddr: 0x2038
+ Align: 0x4
+ Offset: 0x2038
- Type: PT_GNU_STACK
Flags: [ PF_W, PF_R ]
Align: 0x10
Offset: 0x0
+ - Type: PT_GNU_RELRO
+ Flags: [ PF_R ]
+ FirstSec: .init_array
+ LastSec: .got
+ VAddr: 0x3DD0
+ Offset: 0x2DD0
Sections:
+ - Name: .note.gnu.property
+ Type: SHT_NOTE
+ Flags: [ SHF_ALLOC ]
+ Address: 0x350
+ AddressAlign: 0x8
+ Notes:
+ - Name: GNU
+ Desc: 028000C0040000000100000000000000
+ Type: NT_GNU_PROPERTY_TYPE_0
- Name: .note.gnu.build-id
Type: SHT_NOTE
Flags: [ SHF_ALLOC ]
- Address: 0x4000E8
+ Address: 0x370
AddressAlign: 0x4
Notes:
- Name: GNU
- Desc: 01DF54A6045E657D3F8FFB9CE111878914F8BD6D
+ Desc: 768D260BD4FC15E892AAC361C910DF78AC15E194
Type: NT_PRPSINFO
+ - Name: .interp
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC ]
+ Address: 0x394
+ AddressAlign: 0x1
+ Content: 2F6C696236342F6C642D6C696E75782D7838362D36342E736F2E3200
+ - Name: .gnu.hash
+ Type: SHT_GNU_HASH
+ Flags: [ SHF_ALLOC ]
+ Address: 0x3B0
+ Link: .dynsym
+ AddressAlign: 0x8
+ Header:
+ SymNdx: 0x6
+ Shift2: 0x6
+ BloomFilter: [ 0x810000 ]
+ HashBuckets: [ 0x6, 0x0 ]
+ HashValues: [ 0x6DCE65D1 ]
+ - Name: .dynsym
+ Type: SHT_DYNSYM
+ Flags: [ SHF_ALLOC ]
+ Address: 0x3D8
+ Link: .dynstr
+ AddressAlign: 0x8
+ - Name: .dynstr
+ Type: SHT_STRTAB
+ Flags: [ SHF_ALLOC ]
+ Address: 0x480
+ AddressAlign: 0x1
+ - Name: .gnu.version
+ Type: SHT_GNU_versym
+ Flags: [ SHF_ALLOC ]
+ Address: 0x510
+ Link: .dynsym
+ AddressAlign: 0x2
+ Entries: [ 0, 2, 1, 3, 1, 1, 3 ]
+ - Name: .gnu.version_r
+ Type: SHT_GNU_verneed
+ Flags: [ SHF_ALLOC ]
+ Address: 0x520
+ Link: .dynstr
+ AddressAlign: 0x8
+ Dependencies:
+ - Version: 1
+ File: libc.so.6
+ Entries:
+ - Name: GLIBC_2.2.5
+ Hash: 157882997
+ Flags: 0
+ Other: 3
+ - Name: GLIBC_2.34
+ Hash: 110530996
+ Flags: 0
+ Other: 2
+ - Name: .rela.dyn
+ Type: SHT_RELA
+ Flags: [ SHF_ALLOC ]
+ Address: 0x550
+ Link: .dynsym
+ AddressAlign: 0x8
+ Relocations:
+ - Offset: 0x3DD0
+ Type: R_X86_64_RELATIVE
+ Addend: 4400
+ - Offset: 0x3DD8
+ Type: R_X86_64_RELATIVE
+ Addend: 4336
+ - Offset: 0x4010
+ Type: R_X86_64_RELATIVE
+ Addend: 16400
+ - Offset: 0x3FC0
+ Symbol: __libc_start_main
+ Type: R_X86_64_GLOB_DAT
+ - Offset: 0x3FC8
+ Symbol: _ITM_deregisterTMCloneTable
+ Type: R_X86_64_GLOB_DAT
+ - Offset: 0x3FD0
+ Symbol: __gmon_start__
+ Type: R_X86_64_GLOB_DAT
+ - Offset: 0x3FD8
+ Symbol: _ITM_registerTMCloneTable
+ Type: R_X86_64_GLOB_DAT
+ - Offset: 0x3FE0
+ Symbol: __cxa_finalize
+ Type: R_X86_64_GLOB_DAT
+ - Name: .rela.plt
+ Type: SHT_RELA
+ Flags: [ SHF_ALLOC, SHF_INFO_LINK ]
+ Address: 0x610
+ Link: .dynsym
+ AddressAlign: 0x8
+ Info: .got.plt
+ Relocations:
+ - Offset: 0x4000
+ Symbol: printf
+ Type: R_X86_64_JUMP_SLOT
+ - Name: .init
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ Address: 0x1000
+ AddressAlign: 0x4
+ Offset: 0x1000
+ Content: 4883EC08488B05C52F00004885C07402FFD04883C408C3
+ - Name: .plt
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ Address: 0x1020
+ AddressAlign: 0x10
+ EntSize: 0x10
+ Content: FF35CA2F0000FF25CC2F00000F1F4000FF25CA2F00006800000000E9E0FFFFFF
+ - Name: .plt.got
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ Address: 0x1040
+ AddressAlign: 0x8
+ EntSize: 0x8
+ Content: FF259A2F00006690
- Name: .text
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
- Address: 0x40010C
- AddressAlign: 0x1
- Content: 554889E548897DE8C645FF62488B45E8C6002F5DC3554889E54883EC2048897DE8488975E0C645FF66488B55E8488B45E04889D7FFD0C9C3554889E54883EC10C645FF5FBE0C014000BF00000000E8C2FFFFFFC9C3
+ Address: 0x1050
+ AddressAlign: 0x10
+ Content: 31ED4989D15E4889E24883E4F050544531C031C9488D3D15010000FF154F2F0000F4662E0F1F8400000000000F1F4000488D3D912F0000488D058A2F00004839F87415488B052E2F00004885C07409FFE00F1F8000000000C30F1F8000000000488D3D612F0000488D355A2F00004829FE4889F048C1EE3F48C1F8034801C648D1FE7414488B05FD2E00004885C07408FFE0660F1F440000C30F1F8000000000F30F1EFA803D1D2F000000752B5548833DDA2E0000004889E5740C488B3DFE2E0000E829FFFFFFE864FFFFFFC605F52E0000015DC30F1F00C30F1F8000000000F30F1EFAE977FFFFFF0F1F8000000000554889E548897DF048837DF000750A0F57C0F20F1145F8EB17488B45F0F20F104010488B45F0F20F594018F20F1145F8F20F1045F85DC3660F1F840000000000554889E54883EC30C745FC00000000897DF8488975F0488B056B0E0000488945D0488B05680E0000488945D8488B05650E0000488945E0488B05620E0000488945E8488D7DD0E875FFFFFF488D3D560E0000B001E857FEFFFF31C04883C4305DC3
+ - Name: .fini
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ Address: 0x11E4
+ AddressAlign: 0x4
+ Content: 4883EC084883C408C3
+ - Name: .rodata
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC ]
+ Address: 0x2000
+ AddressAlign: 0x8
+ Offset: 0x2000
+ Content: 01000200000000000000000000001440000000000000144000000000000039400000000000003E406672616D655F617265613A2025660A00
+ - Name: .eh_frame_hdr
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC ]
+ Address: 0x2038
+ AddressAlign: 0x4
+ Content: 011B033B3400000005000000E8EFFFFF8000000008F0FFFFA800000018F0FFFF5000000008F1FFFFC000000048F1FFFFE0000000
- Name: .eh_frame
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC ]
- Address: 0x400168
+ Address: 0x2070
+ AddressAlign: 0x8
+ Content: 1400000000000000017A5200017810011B0C070890010710140000001C000000C0EFFFFF2200000000000000000000001400000000000000017A5200017810011B0C070890010000240000001C00000060EFFFFF20000000000E10460E184A0F0B770880003F1A3B2A33242200000000140000004400000058EFFFFF0800000000000000000000001C0000005C00000040F0FFFF3700000000410E108602430D06720C07080000001C0000007C00000060F0FFFF6100000000410E108602430D06025C0C0708000000000000
+ - Name: .note.ABI-tag
+ Type: SHT_NOTE
+ Flags: [ SHF_ALLOC ]
+ Address: 0x213C
+ AddressAlign: 0x4
+ Notes:
+ - Name: GNU
+ Desc: '00000000030000000200000000000000'
+ Type: NT_VERSION
+ - Name: .init_array
+ Type: SHT_INIT_ARRAY
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ Address: 0x3DD0
+ AddressAlign: 0x8
+ EntSize: 0x8
+ Offset: 0x2DD0
+ Content: '3011000000000000'
+ - Name: .fini_array
+ Type: SHT_FINI_ARRAY
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ Address: 0x3DD8
AddressAlign: 0x8
- Content: 1400000000000000017A5200017810011B0C0708900100001C0000001C00000084FFFFFF1500000000410E108602430D06500C07080000001C0000003C00000079FFFFFF2300000000410E108602430D065E0C07080000001C0000005C0000007CFFFFFF1D00000000410E108602430D06580C0708000000
+ EntSize: 0x8
+ Content: F010000000000000
+ - Name: .dynamic
+ Type: SHT_DYNAMIC
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ Address: 0x3DE0
+ Link: .dynstr
+ AddressAlign: 0x8
+ Entries:
+ - Tag: DT_NEEDED
+ Value: 0x29
+ - Tag: DT_INIT
+ Value: 0x1000
+ - Tag: DT_FINI
+ Value: 0x11E4
+ - Tag: DT_INIT_ARRAY
+ Value: 0x3DD0
+ - Tag: DT_INIT_ARRAYSZ
+ Value: 0x8
+ - Tag: DT_FINI_ARRAY
+ Value: 0x3DD8
+ - Tag: DT_FINI_ARRAYSZ
+ Value: 0x8
+ - Tag: DT_GNU_HASH
+ Value: 0x3B0
+ - Tag: DT_STRTAB
+ Value: 0x480
+ - Tag: DT_SYMTAB
+ Value: 0x3D8
+ - Tag: DT_STRSZ
+ Value: 0x8F
+ - Tag: DT_SYMENT
+ Value: 0x18
+ - Tag: DT_DEBUG
+ Value: 0x0
+ - Tag: DT_PLTGOT
+ Value: 0x3FE8
+ - Tag: DT_PLTRELSZ
+ Value: 0x18
+ - Tag: DT_PLTREL
+ Value: 0x7
+ - Tag: DT_JMPREL
+ Value: 0x610
+ - Tag: DT_RELA
+ Value: 0x550
+ - Tag: DT_RELASZ
+ Value: 0xC0
+ - Tag: DT_RELAENT
+ Value: 0x18
+ - Tag: DT_FLAGS_1
+ Value: 0x8000000
+ - Tag: DT_VERNEED
+ Value: 0x520
+ - Tag: DT_VERNEEDNUM
+ Value: 0x1
+ - Tag: DT_VERSYM
+ Value: 0x510
+ - Tag: DT_RELACOUNT
+ Value: 0x3
+ - Tag: DT_NULL
+ Value: 0x0
+ - Tag: DT_NULL
+ Value: 0x0
+ - Tag: DT_NULL
+ Value: 0x0
+ - Tag: DT_NULL
+ Value: 0x0
+ - Tag: DT_NULL
+ Value: 0x0
+ - Name: .got
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ Address: 0x3FC0
+ AddressAlign: 0x8
+ EntSize: 0x8
+ Content: '00000000000000000000000000000000000000000000000000000000000000000000000000000000'
+ - Name: .got.plt
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ Address: 0x3FE8
+ AddressAlign: 0x8
+ EntSize: 0x8
+ Content: E03D000000000000000000000000000000000000000000003610000000000000
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ Address: 0x4008
+ AddressAlign: 0x8
+ Content: '00000000000000001040000000000000'
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ Address: 0x4018
+ AddressAlign: 0x1
+ Size: 0x8
- Name: .comment
Type: SHT_PROGBITS
Flags: [ SHF_MERGE, SHF_STRINGS ]
AddressAlign: 0x1
EntSize: 0x1
- Content: 4743433A20285562756E747520342E382E342D327562756E7475317E31342E30342920342E382E3400
+ Content: 4743433A202844656269616E2031352E322E302D34292031352E322E300044656269616E20636C616E672076657273696F6E2031392E312E37202831302E312B6275696C64312900
- Name: .debug_info
Type: SHT_PROGBITS
AddressAlign: 0x1
- Content: EC00000004000000000008011300000001070000003F0000000C01400000000000550000000000000000000000026261720001010C014000000000001500000000000000019C65000000030E00000001016500000002915804460001036B00000002916F0005086B0000000601065800000007666F6F00010721014000000000002300000000000000019CB8000000030E00000001076500000002915803000000000107C300000002915004460001096B00000002916F0008C30000000965000000000508B80000000A51000000010D44014000000000001D00000000000000019C044600010F6B00000002916F0000
+ Content: CB000000050001080000000001001D000108000000000000000201A100000008000000022D000000000E02A1000339000000043D0000001000050306010604080707013700000001560500078D000000080291700900079500000000070261000000015607000C91000000080291780E000C91000000080291700F000CC40000000902915010000D9A0000000005060408050805040A9A0000000B092000030C0A8D0000000004000C0B8D0000000004080C0C8D0000000004100C0D8D000000000418000AC90000000A3900000000
- Name: .debug_abbrev
Type: SHT_PROGBITS
AddressAlign: 0x1
- Content: 011101250E130B030E1B0E1101120710170000022E0103083A0B3B0B271911011207401897421901130000030500030E3A0B3B0B49130218000004340003083A0B3B0B491302180000050F000B0B491300000624000B0B3E0B030E0000072E0103083A0B3B0B271911011207401896421901130000081501271901130000090500491300000A2E013F19030E3A0B3B0B2719110112074018964219000000
+ Content: 011101252513050325721710171B25111B12067317000002340049133A0B3B0B02180000030101491300000421004913370B000005240003253E0B0B0B000006240003250B0B3E0B0000072E01111B1206401803253A0B3B0B271949133F190000080500021803253A0B3B0B49130000093400021803253A0B3B0B491300000A0F00491300000B130103250B0B3A0B3B0B00000C0D00032549133A0B3B0B380B000000
- Name: .debug_line
Type: SHT_PROGBITS
AddressAlign: 0x1
- Content: 3F00000002001D0000000101FB0E0D000101010100000001000001006D61696E2E6300000000000009020C0140000000000013834B7531F34BC931834BE50202000101
+ Content: 8C0000000500080037000000010101FB0E0D00010101010000000100000101011F010000000003011F020F051E011F00000000D56EC241486226563655292B9539311D040000090240110000000000001805080A8305070658050E2E050A069F0510064A05195805174A05035805010659060B58050006AE050F0A0859051E022C130503069006D7060B2E0206000101
+ - Name: .debug_line_str
+ Type: SHT_PROGBITS
+ Flags: [ SHF_MERGE, SHF_STRINGS ]
+ AddressAlign: 0x1
+ EntSize: 0x1
+ Content: 2F7573722F6C6F63616C2F676F6F676C652F686F6D652F6861726A6F686E002F746D702F73616D706C652E6300
+ - Name: .debug_str_offsets
+ Type: SHT_PROGBITS
+ AddressAlign: 0x1
+ Content: 4800000005000000000000002A00000038000000570000005C000000700000007B00000082000000870000008B0000009000000092000000940000009B000000A1000000A6000000AB000000
Symbols:
- - Name: .note.gnu.build-id
- Type: STT_SECTION
- Section: .note.gnu.build-id
- Value: 0x4000E8
- - Name: .text
- Type: STT_SECTION
- Section: .text
- Value: 0x40010C
- - Name: .eh_frame
- Type: STT_SECTION
- Section: .eh_frame
- Value: 0x400168
- - Name: .comment
- Type: STT_SECTION
- Section: .comment
- - Name: .debug_aranges
- Type: STT_SECTION
- Section: .debug_aranges
- - Name: .debug_info
- Type: STT_SECTION
- Section: .debug_info
- - Name: .debug_abbrev
- Type: STT_SECTION
- Section: .debug_abbrev
- - Name: .debug_line
- Type: STT_SECTION
- Section: .debug_line
- - Name: .debug_str
- Type: STT_SECTION
- Section: .debug_str
- - Name: main.c
+ - Name: Scrt1.o
+ Type: STT_FILE
+ Index: SHN_ABS
+ - Name: __abi_tag
+ Type: STT_OBJECT
+ Section: .note.ABI-tag
+ Value: 0x213C
+ Size: 0x20
+ - Name: crtstuff.c
Type: STT_FILE
Index: SHN_ABS
- - Name: bar
+ - Name: deregister_tm_clones
Type: STT_FUNC
Section: .text
- Value: 0x40010C
- Size: 0x15
- - Name: foo
+ Value: 0x1080
+ - Name: register_tm_clones
Type: STT_FUNC
Section: .text
- Value: 0x400121
- Size: 0x23
+ Value: 0x10B0
+ - Name: __do_global_dtors_aux
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x10F0
+ - Name: completed.0
+ Type: STT_OBJECT
+ Section: .bss
+ Value: 0x4018
+ Size: 0x1
+ - Name: __do_global_dtors_aux_fini_array_entry
+ Type: STT_OBJECT
+ Section: .fini_array
+ Value: 0x3DD8
+ - Name: frame_dummy
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x1130
+ - Name: __frame_dummy_init_array_entry
+ Type: STT_OBJECT
+ Section: .init_array
+ Value: 0x3DD0
+ - Name: sample.c
+ Type: STT_FILE
+ Index: SHN_ABS
+ - Name: 'crtstuff.c (1)'
+ Type: STT_FILE
+ Index: SHN_ABS
+ - Name: __FRAME_END__
+ Type: STT_OBJECT
+ Section: .eh_frame
+ Value: 0x2138
- Type: STT_FILE
Index: SHN_ABS
+ - Name: _DYNAMIC
+ Type: STT_OBJECT
+ Section: .dynamic
+ Value: 0x3DE0
+ - Name: __GNU_EH_FRAME_HDR
+ Section: .eh_frame_hdr
+ Value: 0x2038
+ - Name: _GLOBAL_OFFSET_TABLE_
+ Type: STT_OBJECT
+ Section: .got.plt
+ Value: 0x3FE8
+ - Name: '__libc_start_main at GLIBC_2.34'
+ Type: STT_FUNC
+ Binding: STB_GLOBAL
+ - Name: _ITM_deregisterTMCloneTable
+ Binding: STB_WEAK
+ - Name: data_start
+ Section: .data
+ Binding: STB_WEAK
+ Value: 0x4008
+ - Name: _edata
+ Section: .data
+ Binding: STB_GLOBAL
+ Value: 0x4018
+ - Name: _fini
+ Type: STT_FUNC
+ Section: .fini
+ Binding: STB_GLOBAL
+ Value: 0x11E4
+ Other: [ STV_HIDDEN ]
+ - Name: 'printf at GLIBC_2.2.5'
+ Type: STT_FUNC
+ Binding: STB_GLOBAL
+ - Name: __data_start
+ Section: .data
+ Binding: STB_GLOBAL
+ Value: 0x4008
+ - Name: __gmon_start__
+ Binding: STB_WEAK
+ - Name: __dso_handle
+ Type: STT_OBJECT
+ Section: .data
+ Binding: STB_GLOBAL
+ Value: 0x4010
+ Other: [ STV_HIDDEN ]
+ - Name: _IO_stdin_used
+ Type: STT_OBJECT
+ Section: .rodata
+ Binding: STB_GLOBAL
+ Value: 0x2000
+ Size: 0x4
+ - Name: _end
+ Section: .bss
+ Binding: STB_GLOBAL
+ Value: 0x4020
- Name: _start
Type: STT_FUNC
Section: .text
Binding: STB_GLOBAL
- Value: 0x400144
- Size: 0x1D
+ Value: 0x1050
+ Size: 0x22
+ - Name: frame_area
+ Type: STT_FUNC
+ Section: .text
+ Binding: STB_GLOBAL
+ Value: 0x1140
+ Size: 0x37
- Name: __bss_start
- Section: .eh_frame
+ Section: .bss
Binding: STB_GLOBAL
- Value: 0x601000
- - Name: _edata
- Section: .eh_frame
+ Value: 0x4018
+ - Name: main
+ Type: STT_FUNC
+ Section: .text
Binding: STB_GLOBAL
- Value: 0x601000
- - Name: _end
- Section: .eh_frame
+ Value: 0x1180
+ Size: 0x61
+ - Name: __TMC_END__
+ Type: STT_OBJECT
+ Section: .data
Binding: STB_GLOBAL
- Value: 0x601000
+ Value: 0x4018
+ Other: [ STV_HIDDEN ]
+ - Name: _ITM_registerTMCloneTable
+ Binding: STB_WEAK
+ - Name: '__cxa_finalize at GLIBC_2.2.5'
+ Type: STT_FUNC
+ Binding: STB_WEAK
+ - Name: _init
+ Type: STT_FUNC
+ Section: .init
+ Binding: STB_GLOBAL
+ Value: 0x1000
+ Other: [ STV_HIDDEN ]
+DynamicSymbols:
+ - Name: __libc_start_main
+ Type: STT_FUNC
+ Binding: STB_GLOBAL
+ - Name: _ITM_deregisterTMCloneTable
+ Binding: STB_WEAK
+ - Name: printf
+ Type: STT_FUNC
+ Binding: STB_GLOBAL
+ - Name: __gmon_start__
+ Binding: STB_WEAK
+ - Name: _ITM_registerTMCloneTable
+ Binding: STB_WEAK
+ - Name: __cxa_finalize
+ Type: STT_FUNC
+ Binding: STB_WEAK
DWARF:
debug_str:
- - boomer
- - main.c
- - boom
- - 'GNU C 4.8.4 -mtune=generic -march=x86-64 -g'
- - '/home/labath/test'
- - _start
+ - 'Debian clang version 19.1.7 (10.1+build1)'
+ - '/tmp/sample.c'
+ - '/usr/local/google/home/harjohn'
- char
- debug_aranges:
- - Length: 0x2C
- Version: 2
- CuOffset: 0x0
+ - __ARRAY_SIZE_TYPE__
+ - frame_area
+ - double
+ - main
+ - int
+ - rect
+ - x
+ - y
+ - height
+ - width
+ - argc
+ - argv
+ - frame
+ debug_addr:
+ - Length: 0x1C
+ Version: 0x5
AddressSize: 0x8
- Descriptors:
- - Address: 0x40010C
- Length: 0x55
+ Entries:
+ - Address: 0x2028
+ - Address: 0x1140
+ - Address: 0x1180
...
diff --git a/lldb/unittests/DAP/VariablesTest.cpp b/lldb/unittests/DAP/VariablesTest.cpp
index 8a1c9ce2c502f..d8e0e2b7a6ed5 100644
--- a/lldb/unittests/DAP/VariablesTest.cpp
+++ b/lldb/unittests/DAP/VariablesTest.cpp
@@ -10,10 +10,22 @@
#include "DAPLog.h"
#include "Protocol/DAPTypes.h"
#include "Protocol/ProtocolTypes.h"
+#include "TestingSupport/TestUtilities.h"
+#include "lldb/API/SBCommandInterpreter.h"
+#include "lldb/API/SBDebugger.h"
+#include "lldb/API/SBEvent.h"
#include "lldb/API/SBFrame.h"
+#include "lldb/API/SBListener.h"
+#include "lldb/API/SBStream.h"
+#include "lldb/API/SBThread.h"
#include "lldb/API/SBValue.h"
+#include "lldb/Host/FileSystem.h"
+#include "llvm/Testing/Support/Error.h"
#include "gtest/gtest.h"
+#include <optional>
+using namespace llvm;
+using namespace lldb;
using namespace lldb_dap;
using namespace lldb_dap::protocol;
@@ -22,11 +34,62 @@ class VariablesTest : public ::testing::Test {
public:
VariablesTest() : log(llvm::nulls(), mutex), vars(log) {}
+ static void SetUpTestSuite() {
+ lldb::SBError error = SBDebugger::InitializeWithErrorHandling();
+ EXPECT_TRUE(error.Success());
+ }
+ static void TeatUpTestSuite() { SBDebugger::Terminate(); }
+
+ void TearDown() override {
+ if (core)
+ ASSERT_THAT_ERROR(core->discard(), Succeeded());
+ if (binary)
+ ASSERT_THAT_ERROR(binary->discard(), Succeeded());
+ if (debugger)
+ debugger.Clear();
+ }
+
protected:
enum : bool { Permanent = true, Temporary = false };
Log::Mutex mutex;
Log log;
VariableReferenceStorage vars;
+ lldb::SBDebugger debugger;
+ lldb::SBTarget target;
+ lldb::SBProcess process;
+
+ static constexpr llvm::StringLiteral k_binary = "linux-x86_64.out.yaml";
+ static constexpr llvm::StringLiteral k_core = "linux-x86_64.core.yaml";
+
+ std::optional<llvm::sys::fs::TempFile> core;
+ std::optional<llvm::sys::fs::TempFile> binary;
+
+ void CreateDebugger() { debugger = lldb::SBDebugger::Create(); }
+
+ void LoadCore() {
+ ASSERT_TRUE(debugger);
+
+ llvm::Expected<lldb_private::TestFile> binary_yaml =
+ lldb_private::TestFile::fromYamlFile(k_binary);
+ ASSERT_THAT_EXPECTED(binary_yaml, Succeeded());
+ llvm::Expected<llvm::sys::fs::TempFile> binary_file =
+ binary_yaml->writeToTemporaryFile();
+ ASSERT_THAT_EXPECTED(binary_file, Succeeded());
+ binary = std::move(*binary_file);
+ target = debugger.CreateTarget(binary->TmpName.data());
+ ASSERT_TRUE(target);
+ debugger.SetSelectedTarget(target);
+
+ llvm::Expected<lldb_private::TestFile> core_yaml =
+ lldb_private::TestFile::fromYamlFile(k_core);
+ ASSERT_THAT_EXPECTED(core_yaml, Succeeded());
+ llvm::Expected<llvm::sys::fs::TempFile> core_file =
+ core_yaml->writeToTemporaryFile();
+ ASSERT_THAT_EXPECTED(core_file, Succeeded());
+ this->core = std::move(*core_file);
+ process = target.LoadCore(this->core->TmpName.data());
+ ASSERT_TRUE(process);
+ }
static const protocol::Scope *
FindScope(const std::vector<protocol::Scope> &scopes,
@@ -40,10 +103,16 @@ class VariablesTest : public ::testing::Test {
};
TEST_F(VariablesTest, GetNewVariableReference_UniqueAndRanges) {
- const var_ref_t temp1 = vars.InsertVariable(lldb::SBValue(), Temporary);
- const var_ref_t temp2 = vars.InsertVariable(lldb::SBValue(), Temporary);
- const var_ref_t perm1 = vars.InsertVariable(lldb::SBValue(), Permanent);
- const var_ref_t perm2 = vars.InsertVariable(lldb::SBValue(), Permanent);
+ CreateDebugger();
+ LoadCore();
+ auto x15 = target.CreateValueFromExpression("x", "15");
+ auto y42 = target.CreateValueFromExpression("y", "42");
+ auto gzero = target.CreateValueFromExpression("$0", "42");
+ auto gone = target.CreateValueFromExpression("$1", "7");
+ const var_ref_t temp1 = vars.Insert(x15, Temporary);
+ const var_ref_t temp2 = vars.Insert(y42, Temporary);
+ const var_ref_t perm1 = vars.Insert(gzero, Permanent);
+ const var_ref_t perm2 = vars.Insert(gone, Permanent);
EXPECT_NE(temp1.AsUInt32(), temp2.AsUInt32());
EXPECT_NE(perm1.AsUInt32(), perm2.AsUInt32());
EXPECT_LT(temp1.AsUInt32(), perm1.AsUInt32());
@@ -52,7 +121,7 @@ TEST_F(VariablesTest, GetNewVariableReference_UniqueAndRanges) {
TEST_F(VariablesTest, InsertAndGetVariable_Temporary) {
lldb::SBValue dummy;
- const var_ref_t ref = vars.InsertVariable(dummy, Temporary);
+ const var_ref_t ref = vars.Insert(dummy, Temporary);
lldb::SBValue out = vars.GetVariable(ref);
EXPECT_EQ(out.IsValid(), dummy.IsValid());
@@ -60,15 +129,15 @@ TEST_F(VariablesTest, InsertAndGetVariable_Temporary) {
TEST_F(VariablesTest, InsertAndGetVariable_Permanent) {
lldb::SBValue dummy;
- const var_ref_t ref = vars.InsertVariable(dummy, Permanent);
+ const var_ref_t ref = vars.Insert(dummy, Permanent);
lldb::SBValue out = vars.GetVariable(ref);
EXPECT_EQ(out.IsValid(), dummy.IsValid());
}
TEST_F(VariablesTest, IsPermanentVariableReference) {
- const var_ref_t perm = vars.InsertVariable(lldb::SBValue(), Permanent);
- const var_ref_t temp = vars.InsertVariable(lldb::SBValue(), Temporary);
+ const var_ref_t perm = vars.Insert(lldb::SBValue(), Permanent);
+ const var_ref_t temp = vars.Insert(lldb::SBValue(), Temporary);
EXPECT_EQ(perm.Kind(), eReferenceKindPermanent);
EXPECT_EQ(temp.Kind(), eReferenceKindTemporary);
@@ -76,8 +145,8 @@ TEST_F(VariablesTest, IsPermanentVariableReference) {
TEST_F(VariablesTest, Clear_RemovesTemporaryKeepsPermanent) {
lldb::SBValue dummy;
- const var_ref_t temp = vars.InsertVariable(dummy, Temporary);
- const var_ref_t perm = vars.InsertVariable(dummy, Permanent);
+ const var_ref_t temp = vars.Insert(dummy, Temporary);
+ const var_ref_t perm = vars.Insert(dummy, Permanent);
vars.Clear();
EXPECT_FALSE(vars.GetVariable(temp).IsValid());
@@ -85,9 +154,11 @@ TEST_F(VariablesTest, Clear_RemovesTemporaryKeepsPermanent) {
}
TEST_F(VariablesTest, VariablesStore) {
- lldb::SBFrame frame;
+ CreateDebugger();
+ LoadCore();
+ lldb::SBFrame frame = process.GetSelectedThread().GetSelectedFrame();
- std::vector<protocol::Scope> scopes = vars.CreateScopes(frame);
+ std::vector<protocol::Scope> scopes = vars.Insert(frame);
const protocol::Scope *locals_scope = FindScope(scopes, "Locals");
const protocol::Scope *globals_scope = FindScope(scopes, "Globals");
@@ -110,17 +181,33 @@ TEST_F(VariablesTest, VariablesStore) {
const var_ref_t local_ref = locals_scope->variablesReference;
const var_ref_t global_ref = globals_scope->variablesReference;
const var_ref_t register_ref = registers_scope->variablesReference;
- ASSERT_EQ(global_ref.Kind(), eReferenceKindScope);
- ASSERT_EQ(local_ref.Kind(), eReferenceKindScope);
- ASSERT_EQ(register_ref.Kind(), eReferenceKindScope);
+ ASSERT_EQ(global_ref.Kind(), eReferenceKindTemporary);
+ ASSERT_EQ(local_ref.Kind(), eReferenceKindTemporary);
+ ASSERT_EQ(register_ref.Kind(), eReferenceKindTemporary);
EXPECT_EQ(vars.GetVariableStore(var_ref_t(9999)), nullptr);
+
+ auto variables = locals_store->GetVariables(vars, {}, {});
+ ASSERT_EQ(variables.size(), 1u);
+ auto rect = variables[0];
+ ASSERT_EQ(rect.name, "rect");
+ auto *store = vars.GetVariableStore(rect.variablesReference);
+ ASSERT_NE(store, nullptr);
+
+ VariablesArguments args;
+ args.variablesReference = rect.variablesReference;
+ variables = store->GetVariables(vars, {}, args);
+ ASSERT_EQ(variables.size(), 4u);
+ ASSERT_EQ(variables[0].name, "x");
+ ASSERT_EQ(variables[1].name, "y");
+ ASSERT_EQ(variables[2].name, "height");
+ ASSERT_EQ(variables[3].name, "width");
}
TEST_F(VariablesTest, FindVariable_LocalsByName) {
lldb::SBFrame frame;
- std::vector<protocol::Scope> scopes = vars.CreateScopes(frame);
+ std::vector<protocol::Scope> scopes = vars.Insert(frame);
const protocol::Scope *locals_scope = FindScope(scopes, "Locals");
ASSERT_NE(locals_scope, nullptr);
>From 451920eef7888107cec1174c5c84ac873797cd09 Mon Sep 17 00:00:00 2001
From: John Harrison <harjohn at google.com>
Date: Wed, 4 Mar 2026 10:29:32 -0800
Subject: [PATCH 10/12] Correcting merge conflict.
---
lldb/unittests/DAP/TestBase.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lldb/unittests/DAP/TestBase.h b/lldb/unittests/DAP/TestBase.h
index 23b7466e0047d..8c26d2159150c 100644
--- a/lldb/unittests/DAP/TestBase.h
+++ b/lldb/unittests/DAP/TestBase.h
@@ -109,7 +109,7 @@ class DAPTestBase : public TransportBase {
static void SetUpTestSuite();
static void TearDownTestSuite();
- void SetUp() override;
+
void TearDown() override;
bool GetDebuggerSupportsTarget(llvm::StringRef platform);
>From 21fe05dd0ef6fa1df60303e99b5294ecd30d97c4 Mon Sep 17 00:00:00 2001
From: John Harrison <harjohn at google.com>
Date: Wed, 4 Mar 2026 10:41:16 -0800
Subject: [PATCH 11/12] Cleanup headers and stale includes.
---
lldb/tools/lldb-dap/DAP.cpp | 7 +++----
.../lldb-dap/Handler/ConfigurationDoneRequestHandler.cpp | 3 +--
2 files changed, 4 insertions(+), 6 deletions(-)
diff --git a/lldb/tools/lldb-dap/DAP.cpp b/lldb/tools/lldb-dap/DAP.cpp
index 1162a23d30544..68b5327059edd 100644
--- a/lldb/tools/lldb-dap/DAP.cpp
+++ b/lldb/tools/lldb-dap/DAP.cpp
@@ -20,9 +20,7 @@
#include "Protocol/ProtocolRequests.h"
#include "Protocol/ProtocolTypes.h"
#include "ProtocolUtils.h"
-#include "Transport.h"
#include "Variables.h"
-#include "lldb/API/SBBreakpoint.h"
#include "lldb/API/SBCommandInterpreter.h"
#include "lldb/API/SBCommandInterpreterRunOptions.h"
#include "lldb/API/SBEvent.h"
@@ -50,19 +48,18 @@
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/FormatVariadic.h"
#include "llvm/Support/raw_ostream.h"
-#include <algorithm>
#include <cassert>
#include <chrono>
#include <condition_variable>
#include <cstdarg>
#include <cstdint>
#include <cstdio>
+#include <fcntl.h>
#include <functional>
#include <memory>
#include <mutex>
#include <optional>
#include <string>
-#include <sys/fcntl.h>
#include <thread>
#include <tuple>
#include <utility>
@@ -1073,6 +1070,8 @@ void DAP::Received(const protocol::Request &request) {
if (m_active_request && cancel_args->requestId == m_active_request->seq) {
DAP_LOG(log, "interrupting inflight request (command={0} seq={1})",
m_active_request->command, m_active_request->seq);
+ // FIXME: Which of these are actually required, they all have different
+ // behavior.
debugger.RequestInterrupt();
debugger.DispatchInputInterrupt();
debugger.GetCommandInterpreter().InterruptCommand();
diff --git a/lldb/tools/lldb-dap/Handler/ConfigurationDoneRequestHandler.cpp b/lldb/tools/lldb-dap/Handler/ConfigurationDoneRequestHandler.cpp
index 8e589ed68c65c..89d0292c2a3ca 100644
--- a/lldb/tools/lldb-dap/Handler/ConfigurationDoneRequestHandler.cpp
+++ b/lldb/tools/lldb-dap/Handler/ConfigurationDoneRequestHandler.cpp
@@ -1,4 +1,4 @@
-//===-- ConfigurationDoneRequestHandler..cpp ------------------------------===//
+//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
@@ -7,7 +7,6 @@
//===----------------------------------------------------------------------===//
#include "DAP.h"
-#include "DAPLog.h"
#include "EventHelper.h"
#include "LLDBUtils.h"
#include "Protocol/ProtocolRequests.h"
>From a96e30a49bb7cfab0d206626b3ba7c91435dfff9 Mon Sep 17 00:00:00 2001
From: John Harrison <harjohn at google.com>
Date: Wed, 4 Mar 2026 10:57:14 -0800
Subject: [PATCH 12/12] Cleaning up IOWrapper::Create
---
lldb/tools/lldb-dap/DAP.cpp | 34 ++++++++++++++++++----------------
lldb/tools/lldb-dap/DAP.h | 5 +++--
2 files changed, 21 insertions(+), 18 deletions(-)
diff --git a/lldb/tools/lldb-dap/DAP.cpp b/lldb/tools/lldb-dap/DAP.cpp
index 68b5327059edd..4f094463588c2 100644
--- a/lldb/tools/lldb-dap/DAP.cpp
+++ b/lldb/tools/lldb-dap/DAP.cpp
@@ -222,8 +222,7 @@ ExceptionBreakpoint *DAP::GetExceptionBreakpoint(const lldb::break_id_t bp_id) {
return nullptr;
}
-llvm::Expected<std::pair<IOWrapper, IOWrapper>>
-IOWrapper::CreatePseudoTerminal() {
+static llvm::Expected<std::pair<IOWrapper, IOWrapper>> CreatePseudoTerminal() {
#ifdef WIN32
// Fallback to a pair of pipes until we have better support for a
// PsuedoConsole on Windows.
@@ -274,8 +273,7 @@ IOWrapper::CreatePseudoTerminal() {
#endif
}
-// Hookup a pair of pipes such that reading from one writes to the other.
-llvm::Expected<std::pair<IOWrapper, IOWrapper>> IOWrapper::CreatePipePair() {
+static llvm::Expected<std::pair<IOWrapper, IOWrapper>> CreatePipePair() {
lldb_private::Pipe primary_pipe, replica_pipe;
if (auto err = primary_pipe.CreateNew().takeError())
return err;
@@ -286,32 +284,36 @@ llvm::Expected<std::pair<IOWrapper, IOWrapper>> IOWrapper::CreatePipePair() {
IOWrapper(/*read=*/
std::make_shared<lldb_private::NativeFile>(
primary_pipe.ReleaseReadFileDescriptor(),
- lldb_private::File::eOpenOptionReadOnly, false),
+ lldb_private::File::eOpenOptionReadOnly, true),
/*write=*/std::make_shared<lldb_private::NativeFile>(
replica_pipe.ReleaseWriteFileDescriptor(),
lldb_private::File::eOpenOptionWriteOnly, true)),
IOWrapper(/*read=*/
std::make_shared<lldb_private::NativeFile>(
replica_pipe.ReleaseReadFileDescriptor(),
- lldb_private::File::eOpenOptionReadOnly, false),
+ lldb_private::File::eOpenOptionReadOnly, true),
/*write=*/std::make_shared<lldb_private::NativeFile>(
primary_pipe.ReleaseWriteFileDescriptor(),
lldb_private::File::eOpenOptionWriteOnly, true)));
}
+llvm::Expected<std::pair<IOWrapper, IOWrapper>> IOWrapper::Create() {
+ llvm::Expected<std::pair<IOWrapper, IOWrapper>> io = CreatePseudoTerminal();
+ if (!io) {
+ // Fallback to creating a pipe.
+ llvm::consumeError(io.takeError());
+ return CreatePipePair();
+ }
+
+ return *io;
+}
+
llvm::Error DAP::ConfigureIO(std::FILE *overrideOut, std::FILE *overrideErr) {
DAP_LOG(log, "Initializing IO");
- llvm::Expected<std::pair<IOWrapper, IOWrapper>> io =
- IOWrapper::CreatePseudoTerminal();
- if (!io) {
- DAP_LOG_ERROR(
- log, io.takeError(),
- "Falling back to a pipe for debugger IO, creating a pty failed: {0}");
- io = IOWrapper::CreatePipePair();
- if (!io)
- return io.takeError();
- }
+ llvm::Expected<std::pair<IOWrapper, IOWrapper>> io = IOWrapper::Create();
+ if (!io)
+ return io.takeError();
std::tie(primary, replica) = *io;
diff --git a/lldb/tools/lldb-dap/DAP.h b/lldb/tools/lldb-dap/DAP.h
index b9339585d2adc..f068c655aa5e4 100644
--- a/lldb/tools/lldb-dap/DAP.h
+++ b/lldb/tools/lldb-dap/DAP.h
@@ -88,8 +88,9 @@ struct IOWrapper {
IOWrapper(lldb::FileSP read, lldb::FileSP write)
: read(read), write(write) {};
- static llvm::Expected<std::pair<IOWrapper, IOWrapper>> CreatePseudoTerminal();
- static llvm::Expected<std::pair<IOWrapper, IOWrapper>> CreatePipePair();
+ /// Create a set of handles, either a pty and duplicate or a pair of pipes
+ /// based on platform support.
+ static llvm::Expected<std::pair<IOWrapper, IOWrapper>> Create();
lldb::FileSP read;
lldb::FileSP write;
More information about the lldb-commits
mailing list