diff --git a/lldb/source/Target/MixedArkTSDebugger.cpp b/lldb/source/Target/MixedArkTSDebugger.cpp index 40a110ecca9cad4b5174b12f8a7389e64c5ace98..6e1137a992a59a61c474f9b664441463e9c87782 100644 --- a/lldb/source/Target/MixedArkTSDebugger.cpp +++ b/lldb/source/Target/MixedArkTSDebugger.cpp @@ -20,9 +20,8 @@ using namespace lldb; using namespace lldb_private; - -static const char* BackTrace = "(const char*)GetJsBacktrace()"; -static const char* DebugMessage = "(const char*)OperateJsDebugMessage(\"{0}\")"; +static const char* BackTrace = "struct DebugInput { size_t size; char *data; }; (DebugInput)GetJsBacktrace()"; +static const char* DebugMessage = "(DebugInput)OperateJsDebugMessage(\"{0}\")"; MixedArkTSDebugger::MixedArkTSDebugger(const TargetSP &target_sp) : MixedDebugger(target_sp) {} @@ -38,7 +37,9 @@ DataExtractorSP MixedArkTSDebugger::GetCurrentThreadBackTrace(Status &error) { } DataExtractorSP MixedArkTSDebugger::GetCurrentThreadOperateDebugMessageResult(const char *message, Status &error) { - std::string operateMessage = llvm::formatv(DebugMessage, message).str(); + std::string operateMessage = + "struct DebugInput {size_t size; char *data; };" + + llvm::formatv(DebugMessage, message).str(); DataExtractorSP result = ExecuteAction(operateMessage.c_str(), error); if (!error.Success()) { Log *log = GetLog(LLDBLog::MixedDebugger); diff --git a/lldb/source/Target/MixedDebugger.cpp b/lldb/source/Target/MixedDebugger.cpp index 3c21ac062592b02985949e65e6e1740c6d619cbc..fb76ba3cfd3c09488e8b3768ddce48d35b162916 100644 --- a/lldb/source/Target/MixedDebugger.cpp +++ b/lldb/source/Target/MixedDebugger.cpp @@ -53,35 +53,47 @@ DataExtractorSP MixedDebugger::ExecuteAction(const char* expr, Status &error) { return result; } - const size_t k_max_buf_size = 64; - size_t cstr_len = UINT32_MAX; - size_t offset = 0; - size_t bytes_read = 0; + ValueObjectSP size_vo = expr_value_sp->GetChildAtIndex(0, true); + ValueObjectSP data_ptr_vo = expr_value_sp->GetChildAtIndex(1, true); + + if (!data_ptr_vo || !size_vo) { + error.SetErrorString( + "[ExecuteAction] Failed to get DebugInput members"); + LLDB_LOGF(log, + "[ExecuteAction] struct members missing: data=%p, size=%p", + data_ptr_vo.get(), size_vo.get()); + return result; + } + + size_t payload_len = size_vo->GetValueAsUnsigned(0); + if (payload_len == 0 || payload_len >= UINT32_MAX) { + error.SetErrorString("[ExecuteAction] Invalid payload size"); + LLDB_LOGF(log, "[ExecuteAction] Invalid payload size: %zu", + payload_len); + return result; + } + DataExtractor data; - while ((bytes_read = expr_value_sp->GetPointeeData(data, offset, k_max_buf_size)) > 0) { - const char *cstr = data.PeekCStr(0); - size_t len = strnlen(cstr, k_max_buf_size); - if (len >= cstr_len) { - error.SetErrorString("[MixedDebugger::ExecuteAction] result over size"); - result->Clear(); - return result; - } - if (!result->Append(const_cast(cstr), len)) { - error.SetErrorString("[MixedDebugger::ExecuteAction] result append data failed"); - result->Clear(); - return result; - } - if (len < k_max_buf_size) { - break; - } - cstr_len -= len; - offset += len; + size_t bytes_read = data_ptr_vo->GetPointeeData(data, 0, payload_len); + if (bytes_read < payload_len) { + error.SetErrorString( + "[ExecuteAction] Failed to read data from pointer"); + LLDB_LOGF(log, "[ExecuteAction] Failed to read expected payload_len"); + return result; + } + + if (!result->Append(const_cast(data.GetDataStart()), + payload_len)) { + error.SetErrorString("[ExecuteAction] Failed to append result data"); + LLDB_LOGF(log, "[ExecuteAction] Failed to append result data"); + result->Clear(); + return result; } - // Add terminator to result data - char te = '\0'; - if (!result->Append(&te, 1)) { - error.SetErrorString("[MixedDebugger::ExecuteAction] result append terminator failed"); + char terminator = '\0'; + if (!result->Append(&terminator, 1)) { + error.SetErrorString( + "[MixedDebugger::ExecuteAction] result append terminator failed"); result->Clear(); return result; } @@ -89,6 +101,7 @@ DataExtractorSP MixedDebugger::ExecuteAction(const char* expr, Status &error) { } LLDB_LOGF(log, "[MixedDebugger::ExecuteAction] result is " - "%s", result->PeekCStr(0)); + "%s", + result->PeekCStr(0)); return result; }