-
Notifications
You must be signed in to change notification settings - Fork 15.3k
[lldb-dap] Add data breakpoints for bytes #167237
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 1 commit
482c89d
36466ae
b4ce53e
848e7a0
4d5fdf7
5071adf
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||
|---|---|---|---|---|---|---|
|
|
@@ -16,14 +16,27 @@ | |||||
|
|
||||||
| namespace lldb_dap { | ||||||
|
|
||||||
| static bool CheckAddress(DAP &dap, lldb::addr_t load_addr) { | ||||||
|
||||||
| lldb::SBMemoryRegionInfo region; | ||||||
| lldb::SBError err = | ||||||
| dap.target.GetProcess().GetMemoryRegionInfo(load_addr, region); | ||||||
| // Only lldb-server supports "qMemoryRegionInfo". So, don't fail this | ||||||
| // request if SBProcess::GetMemoryRegionInfo returns error. | ||||||
| if (err.Success()) { | ||||||
| if (!(region.IsReadable() || region.IsWritable())) { | ||||||
| return false; | ||||||
| } | ||||||
| } | ||||||
| return true; | ||||||
| } | ||||||
|
|
||||||
| /// Obtains information on a possible data breakpoint that could be set on an | ||||||
| /// expression or variable. Clients should only call this request if the | ||||||
| /// corresponding capability supportsDataBreakpoints is true. | ||||||
| llvm::Expected<protocol::DataBreakpointInfoResponseBody> | ||||||
| DataBreakpointInfoRequestHandler::Run( | ||||||
| const protocol::DataBreakpointInfoArguments &args) const { | ||||||
| protocol::DataBreakpointInfoResponseBody response; | ||||||
| lldb::SBFrame frame = dap.GetLLDBFrame(args.frameId); | ||||||
| lldb::SBValue variable = dap.variables.FindVariable( | ||||||
| args.variablesReference.value_or(0), args.name); | ||||||
| std::string addr, size; | ||||||
|
|
@@ -43,7 +56,8 @@ DataBreakpointInfoRequestHandler::Run( | |||||
| addr = llvm::utohexstr(load_addr); | ||||||
| size = llvm::utostr(byte_size); | ||||||
| } | ||||||
| } else if (args.variablesReference.value_or(0) == 0 && frame.IsValid()) { | ||||||
| } else if (lldb::SBFrame frame = dap.GetLLDBFrame(args.frameId); | ||||||
| args.variablesReference.value_or(0) == 0 && frame.IsValid()) { | ||||||
| lldb::SBValue value = frame.EvaluateExpression(args.name.c_str()); | ||||||
| if (value.GetError().Fail()) { | ||||||
| lldb::SBError error = value.GetError(); | ||||||
|
|
@@ -58,24 +72,28 @@ DataBreakpointInfoRequestHandler::Run( | |||||
| if (data.IsValid()) { | ||||||
| size = llvm::utostr(data.GetByteSize()); | ||||||
| addr = llvm::utohexstr(load_addr); | ||||||
| lldb::SBMemoryRegionInfo region; | ||||||
| lldb::SBError err = | ||||||
| dap.target.GetProcess().GetMemoryRegionInfo(load_addr, region); | ||||||
| // Only lldb-server supports "qMemoryRegionInfo". So, don't fail this | ||||||
| // request if SBProcess::GetMemoryRegionInfo returns error. | ||||||
| if (err.Success()) { | ||||||
| if (!(region.IsReadable() || region.IsWritable())) { | ||||||
| is_data_ok = false; | ||||||
| response.description = "memory region for address " + addr + | ||||||
| " has no read or write permissions"; | ||||||
| } | ||||||
| if (!CheckAddress(dap, load_addr)) { | ||||||
| is_data_ok = false; | ||||||
| response.description = "memory region for address " + addr + | ||||||
| " has no read or write permissions"; | ||||||
| } | ||||||
| } else { | ||||||
| is_data_ok = false; | ||||||
| response.description = | ||||||
| "unable to get byte size for expression: " + args.name; | ||||||
| } | ||||||
| } | ||||||
| } else if (args.asAddress) { | ||||||
| size = llvm::utostr(args.bytes.value_or(1)); | ||||||
|
||||||
| size = llvm::utostr(args.bytes.value_or(1)); | |
| size = llvm::utostr(args.bytes.value_or(dap.target.GetAddressByteSize())); |
Outdated
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
the address can still be invalid e.g (0xsier) use
llvm::StringRef::getAsInteger<lldb::addr_t>(0, load_addr)
After the conversion check if it a valid address in the target using SBAddress::IsValid()
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can we lift this to a statement instead of an inline expression like this?
This is a bit complex for an inline if