[Lldb-commits] [PATCH] D74398: [lldb-server] jThreadsInfo returns stack memory
Pavel Labath via Phabricator via lldb-commits
lldb-commits at lists.llvm.org
Wed Mar 18 08:08:53 PDT 2020
labath added a comment.
Thanks. Could you also add the other kind of test (the one inline asm) I mentioned. In an ideal world we'd have a test case for every boundary condition, but we're pretty far from that right now. Even so, one test case like that would be nice.
I am imagining the inferior doing something like:
movabsq $0xdead, %rax
pushq %rax ; fake pc
leaq 0x1000(%rsp), %rbp ; larger than kMaxFrameSize
pushq %rbp
movq %rsp, %rbp
pushq $1 ; fake frame contents
pushq $2
pushq $3
incq %rax
push %rax; second fake pc
pushq %rbp
movq %rsp, %rbp
pushq $4 ; fake frame contents
pushq $5
pushq $6
int3
and then the test would assert that the result contains the entirety of the first fake frame, the bp+pc of the second fake frame, and then would stop due to hitting the kMaxFrameSize boundary.
================
Comment at: lldb/packages/Python/lldbsuite/test/tools/lldb-server/TestGdbRemoteThreadsInStopReply.py:373
+ # Read memory chunks from jThreadsInfo.
+ memory_chunks = self.gather_threads_info_memory()
+ # Check the chunks are correct.
----------------
Also assert that you have at least one chunk here?
================
Comment at: lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp:501-504
+static void AddMemoryChunk(json::Array &stack_memory_chunks, addr_t address,
+ std::vector<int8_t> &bytes) {
+ if (bytes.empty())
+ return;
----------------
I think it would be cleaner if this returned the json::Object as a return value (much like `GetStackMemoryAsJSON` returns a json::Array).
================
Comment at: lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp:534
+ } else {
+ return stack_memory_chunks;
+ }
----------------
You will need to "handle" the error inside the Expected object here. The object asserts (at runtime) that you do that at the right time. (http://llvm.org/docs/ProgrammersManual.html#recoverable-errors).
That said, if you're not going to do anything with the error, then maybe the GetRegisterValue doesn't really need to return an Expected (maybe Optional<RegisterValue>)
================
Comment at: lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp:548
+ static_cast<size_t>(fp_value - sp_value));
+ std::vector<int8_t> buf(byte_count, 0);
+
----------------
we usually use arrays of *u*int8_t to represent uninterpreted data.
================
Comment at: lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp:578
+ lldb_private::DataExtractor extractor(fp_ra_buf.data(), fp_and_ra_size,
+ endian::InlHostByteOrder(),
+ address_size);
----------------
It is probably going to be the same, but you might as well use `process.GetArchitecture().GetByteOrder()`, since you have it handy.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D74398/new/
https://reviews.llvm.org/D74398
More information about the lldb-commits
mailing list