[Lldb-commits] [lldb] [lldb-dap] fix wrong assembly line number (PR #136486)
via lldb-commits
lldb-commits at lists.llvm.org
Sun Apr 20 05:32:03 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-lldb
Author: Ely Ronnen (eronnen)
<details>
<summary>Changes</summary>
Fix wrong assembly line number calculation that assumes the instruction size is `GetAddressByteSize() / 2`
---
Full diff: https://github.com/llvm/llvm-project/pull/136486.diff
3 Files Affected:
- (modified) lldb/tools/lldb-dap/Handler/StackTraceRequestHandler.cpp (+2-1)
- (modified) lldb/tools/lldb-dap/JSONUtils.cpp (+16-6)
- (modified) lldb/tools/lldb-dap/JSONUtils.h (+5-2)
``````````diff
diff --git a/lldb/tools/lldb-dap/Handler/StackTraceRequestHandler.cpp b/lldb/tools/lldb-dap/Handler/StackTraceRequestHandler.cpp
index a58e3325af100..5d1d2835b4392 100644
--- a/lldb/tools/lldb-dap/Handler/StackTraceRequestHandler.cpp
+++ b/lldb/tools/lldb-dap/Handler/StackTraceRequestHandler.cpp
@@ -67,7 +67,8 @@ static bool FillStackFrames(DAP &dap, lldb::SBThread &thread,
break;
}
- stack_frames.emplace_back(CreateStackFrame(frame, dap.frame_format));
+ stack_frames.emplace_back(
+ CreateStackFrame(frame, dap.frame_format, dap.target));
}
if (dap.configuration.displayExtendedBacktrace && reached_end_of_stack) {
diff --git a/lldb/tools/lldb-dap/JSONUtils.cpp b/lldb/tools/lldb-dap/JSONUtils.cpp
index 33f10c93d2ada..552fdc9439845 100644
--- a/lldb/tools/lldb-dap/JSONUtils.cpp
+++ b/lldb/tools/lldb-dap/JSONUtils.cpp
@@ -19,6 +19,8 @@
#include "lldb/API/SBFileSpec.h"
#include "lldb/API/SBFrame.h"
#include "lldb/API/SBFunction.h"
+#include "lldb/API/SBInstruction.h"
+#include "lldb/API/SBInstructionList.h"
#include "lldb/API/SBLineEntry.h"
#include "lldb/API/SBModule.h"
#include "lldb/API/SBQueue.h"
@@ -719,8 +721,8 @@ llvm::json::Value CreateSource(llvm::StringRef source_path) {
// },
// "required": [ "id", "name", "line", "column" ]
// }
-llvm::json::Value CreateStackFrame(lldb::SBFrame &frame,
- lldb::SBFormat &format) {
+llvm::json::Value CreateStackFrame(lldb::SBFrame &frame, lldb::SBFormat &format,
+ lldb::SBTarget &target) {
llvm::json::Object object;
int64_t frame_id = MakeDAPFrameID(frame);
object.try_emplace("id", frame_id);
@@ -776,10 +778,18 @@ llvm::json::Value CreateStackFrame(lldb::SBFrame &frame,
// Calculate the line of the current PC from the start of the current
// symbol.
- lldb::addr_t inst_offset = frame.GetPCAddress().GetOffset() -
- frame.GetSymbol().GetStartAddress().GetOffset();
- lldb::addr_t inst_line =
- inst_offset / (frame.GetThread().GetProcess().GetAddressByteSize() / 2);
+ lldb::SBAddress current_address = frame.GetPCAddress();
+ lldb::SBInstructionList inst_list =
+ frame.GetSymbol().GetInstructions(target);
+ size_t inst_line = 0;
+ for (size_t i = 0; i < inst_list.GetSize(); ++i) {
+ lldb::SBInstruction inst = inst_list.GetInstructionAtIndex(i);
+ if (inst.GetAddress() == current_address) {
+ inst_line = i;
+ break;
+ }
+ }
+
// Line numbers are 1-based.
object.try_emplace("line", inst_line + 1);
object.try_emplace("column", 1);
diff --git a/lldb/tools/lldb-dap/JSONUtils.h b/lldb/tools/lldb-dap/JSONUtils.h
index b8c53353bf42d..ffa10743501b8 100644
--- a/lldb/tools/lldb-dap/JSONUtils.h
+++ b/lldb/tools/lldb-dap/JSONUtils.h
@@ -363,11 +363,14 @@ llvm::json::Value CreateSource(llvm::StringRef source_path);
/// The LLDB format to use when populating out the "StackFrame"
/// object.
///
+/// \param[in] target
+/// The LLDB target to use when populating out the "StackFrame"
+/// object.
/// \return
/// A "StackFrame" JSON object with that follows the formal JSON
/// definition outlined by Microsoft.
-llvm::json::Value CreateStackFrame(lldb::SBFrame &frame,
- lldb::SBFormat &format);
+llvm::json::Value CreateStackFrame(lldb::SBFrame &frame, lldb::SBFormat &format,
+ lldb::SBTarget &target);
/// Create a "StackFrame" label object for a LLDB thread.
///
``````````
</details>
https://github.com/llvm/llvm-project/pull/136486
More information about the lldb-commits
mailing list