mirror of
https://github.com/intel/llvm.git
synced 2026-01-17 06:40:01 +08:00
[lldb/API] NFC: Reformat and simplify SBThread::GetStopDescription()
Summary: This gets rid of some nesting and of the raw char* variable that caused the memory management bug we hit recently. This commit also removes the fallback code which should trigger when the StopInfo provides no stop description. All currently implemented StopInfos have a `GetDescription()` method that shouldn't return an empty description. Reviewers: JDevlieghere, labath, mib Subscribers: lldb-commits Tags: #lldb Differential Revision: https://reviews.llvm.org/D74157
This commit is contained in:
@@ -40,7 +40,6 @@
|
||||
#include "lldb/Target/ThreadPlanStepInstruction.h"
|
||||
#include "lldb/Target/ThreadPlanStepOut.h"
|
||||
#include "lldb/Target/ThreadPlanStepRange.h"
|
||||
#include "lldb/Target/UnixSignals.h"
|
||||
#include "lldb/Utility/State.h"
|
||||
#include "lldb/Utility/Stream.h"
|
||||
#include "lldb/Utility/StructuredData.h"
|
||||
@@ -319,97 +318,26 @@ size_t SBThread::GetStopDescription(char *dst, size_t dst_len) {
|
||||
std::unique_lock<std::recursive_mutex> lock;
|
||||
ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
|
||||
|
||||
if (exe_ctx.HasThreadScope()) {
|
||||
Process::StopLocker stop_locker;
|
||||
if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) {
|
||||
|
||||
StopInfoSP stop_info_sp = exe_ctx.GetThreadPtr()->GetStopInfo();
|
||||
if (stop_info_sp) {
|
||||
std::string thread_stop_desc =
|
||||
exe_ctx.GetThreadPtr()->GetStopDescription();
|
||||
const char *stop_desc = thread_stop_desc.c_str();
|
||||
|
||||
if (stop_desc[0] != '\0') {
|
||||
if (dst)
|
||||
return ::snprintf(dst, dst_len, "%s", stop_desc);
|
||||
else {
|
||||
// NULL dst passed in, return the length needed to contain the
|
||||
// description
|
||||
return ::strlen(stop_desc) + 1; // Include the NULL byte for size
|
||||
}
|
||||
} else {
|
||||
size_t stop_desc_len = 0;
|
||||
switch (stop_info_sp->GetStopReason()) {
|
||||
case eStopReasonTrace:
|
||||
case eStopReasonPlanComplete: {
|
||||
static char trace_desc[] = "step";
|
||||
stop_desc = trace_desc;
|
||||
stop_desc_len =
|
||||
sizeof(trace_desc); // Include the NULL byte for size
|
||||
} break;
|
||||
|
||||
case eStopReasonBreakpoint: {
|
||||
static char bp_desc[] = "breakpoint hit";
|
||||
stop_desc = bp_desc;
|
||||
stop_desc_len = sizeof(bp_desc); // Include the NULL byte for size
|
||||
} break;
|
||||
|
||||
case eStopReasonWatchpoint: {
|
||||
static char wp_desc[] = "watchpoint hit";
|
||||
stop_desc = wp_desc;
|
||||
stop_desc_len = sizeof(wp_desc); // Include the NULL byte for size
|
||||
} break;
|
||||
|
||||
case eStopReasonSignal: {
|
||||
stop_desc =
|
||||
exe_ctx.GetProcessPtr()->GetUnixSignals()->GetSignalAsCString(
|
||||
stop_info_sp->GetValue());
|
||||
if (stop_desc == nullptr || stop_desc[0] == '\0') {
|
||||
static char signal_desc[] = "signal";
|
||||
stop_desc = signal_desc;
|
||||
stop_desc_len =
|
||||
sizeof(signal_desc); // Include the NULL byte for size
|
||||
}
|
||||
} break;
|
||||
|
||||
case eStopReasonException: {
|
||||
char exc_desc[] = "exception";
|
||||
stop_desc = exc_desc;
|
||||
stop_desc_len = sizeof(exc_desc); // Include the NULL byte for size
|
||||
} break;
|
||||
|
||||
case eStopReasonExec: {
|
||||
char exc_desc[] = "exec";
|
||||
stop_desc = exc_desc;
|
||||
stop_desc_len = sizeof(exc_desc); // Include the NULL byte for size
|
||||
} break;
|
||||
|
||||
case eStopReasonThreadExiting: {
|
||||
char limbo_desc[] = "thread exiting";
|
||||
stop_desc = limbo_desc;
|
||||
stop_desc_len = sizeof(limbo_desc);
|
||||
} break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (stop_desc && stop_desc[0]) {
|
||||
if (dst)
|
||||
return ::snprintf(dst, dst_len, "%s", stop_desc) +
|
||||
1; // Include the NULL byte
|
||||
|
||||
if (stop_desc_len == 0)
|
||||
stop_desc_len = ::strlen(stop_desc) + 1; // Include the NULL byte
|
||||
|
||||
return stop_desc_len;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (dst)
|
||||
*dst = 0;
|
||||
return 0;
|
||||
|
||||
if (!exe_ctx.HasThreadScope())
|
||||
return 0;
|
||||
|
||||
Process::StopLocker stop_locker;
|
||||
if (!stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
|
||||
return 0;
|
||||
|
||||
std::string thread_stop_desc = exe_ctx.GetThreadPtr()->GetStopDescription();
|
||||
if (thread_stop_desc.empty())
|
||||
return 0;
|
||||
|
||||
if (dst)
|
||||
return ::snprintf(dst, dst_len, "%s", thread_stop_desc.c_str()) + 1;
|
||||
|
||||
// NULL dst passed in, return the length needed to contain the
|
||||
// description.
|
||||
return thread_stop_desc.size() + 1; // Include the NULL byte for size
|
||||
}
|
||||
|
||||
SBValue SBThread::GetStopReturnValue() {
|
||||
|
||||
Reference in New Issue
Block a user