003 File Manager
Current Path:
/usr/src/contrib/llvm-project/lldb/source/Target
usr
/
src
/
contrib
/
llvm-project
/
lldb
/
source
/
Target
/
📁
..
📄
ABI.cpp
(9.36 KB)
📄
AssertFrameRecognizer.cpp
(5.4 KB)
📄
ExecutionContext.cpp
(18.19 KB)
📄
InstrumentationRuntime.cpp
(2.38 KB)
📄
InstrumentationRuntimeStopInfo.cpp
(1.2 KB)
📄
JITLoader.cpp
(1.07 KB)
📄
JITLoaderList.cpp
(1.94 KB)
📄
Language.cpp
(12.97 KB)
📄
LanguageRuntime.cpp
(9.71 KB)
📄
Memory.cpp
(15.12 KB)
📄
MemoryHistory.cpp
(943 B)
📄
MemoryRegionInfo.cpp
(1.55 KB)
📄
ModuleCache.cpp
(11.87 KB)
📄
OperatingSystem.cpp
(1.74 KB)
📄
PathMappingList.cpp
(9.73 KB)
📄
Platform.cpp
(66.82 KB)
📄
Process.cpp
(221.69 KB)
📄
Queue.cpp
(2.52 KB)
📄
QueueItem.cpp
(3 KB)
📄
QueueList.cpp
(1.68 KB)
📄
RegisterContext.cpp
(15.76 KB)
📄
RegisterContextUnwind.cpp
(86.86 KB)
📄
RegisterNumber.cpp
(3.34 KB)
📄
RemoteAwarePlatform.cpp
(16.06 KB)
📄
SectionLoadHistory.cpp
(6.39 KB)
📄
SectionLoadList.cpp
(9.57 KB)
📄
StackFrame.cpp
(70.8 KB)
📄
StackFrameList.cpp
(34.82 KB)
📄
StackFrameRecognizer.cpp
(7.27 KB)
📄
StackID.cpp
(3.39 KB)
📄
StopInfo.cpp
(44.17 KB)
📄
StructuredDataPlugin.cpp
(2.35 KB)
📄
SystemRuntime.cpp
(1.54 KB)
📄
Target.cpp
(146.79 KB)
📄
TargetList.cpp
(22.59 KB)
📄
TargetProperties.td
(15.71 KB)
📄
Thread.cpp
(70.22 KB)
📄
ThreadCollection.cpp
(2.18 KB)
📄
ThreadList.cpp
(24.9 KB)
📄
ThreadPlan.cpp
(9.54 KB)
📄
ThreadPlanBase.cpp
(6.32 KB)
📄
ThreadPlanCallFunction.cpp
(16.54 KB)
📄
ThreadPlanCallFunctionUsingABI.cpp
(2.35 KB)
📄
ThreadPlanCallOnFunctionExit.cpp
(3.3 KB)
📄
ThreadPlanCallUserExpression.cpp
(3.77 KB)
📄
ThreadPlanPython.cpp
(5.94 KB)
📄
ThreadPlanRunToAddress.cpp
(6.53 KB)
📄
ThreadPlanShouldStopHere.cpp
(5.82 KB)
📄
ThreadPlanStack.cpp
(14.76 KB)
📄
ThreadPlanStepInRange.cpp
(18.45 KB)
📄
ThreadPlanStepInstruction.cpp
(8.78 KB)
📄
ThreadPlanStepOut.cpp
(18.25 KB)
📄
ThreadPlanStepOverBreakpoint.cpp
(6.63 KB)
📄
ThreadPlanStepOverRange.cpp
(16.61 KB)
📄
ThreadPlanStepRange.cpp
(18.23 KB)
📄
ThreadPlanStepThrough.cpp
(8.79 KB)
📄
ThreadPlanStepUntil.cpp
(11.14 KB)
📄
ThreadPlanTracer.cpp
(7.78 KB)
📄
ThreadSpec.cpp
(4.46 KB)
📄
UnixSignals.cpp
(11.04 KB)
📄
UnwindAssembly.cpp
(1.09 KB)
📄
UnwindLLDB.cpp
(19.02 KB)
Editing: AssertFrameRecognizer.cpp
#include "lldb/Core/Module.h" #include "lldb/Symbol/Function.h" #include "lldb/Symbol/SymbolContext.h" #include "lldb/Target/Process.h" #include "lldb/Target/StackFrameList.h" #include "lldb/Target/Target.h" #include "lldb/Target/Thread.h" #include "lldb/Utility/Log.h" #include "lldb/Utility/Logging.h" #include "lldb/Target/AssertFrameRecognizer.h" using namespace llvm; using namespace lldb; using namespace lldb_private; namespace lldb_private { /// Stores a function module spec, symbol name and possibly an alternate symbol /// name. struct SymbolLocation { FileSpec module_spec; std::vector<ConstString> symbols; }; /// Fetches the abort frame location depending on the current platform. /// /// \param[in] os /// The target's os type. /// \param[in,out] location /// The struct that will contain the abort module spec and symbol names. /// \return /// \b true, if the platform is supported /// \b false, otherwise. bool GetAbortLocation(llvm::Triple::OSType os, SymbolLocation &location) { switch (os) { case llvm::Triple::Darwin: case llvm::Triple::MacOSX: location.module_spec = FileSpec("libsystem_kernel.dylib"); location.symbols.push_back(ConstString("__pthread_kill")); break; case llvm::Triple::Linux: location.module_spec = FileSpec("libc.so.6"); location.symbols.push_back(ConstString("raise")); location.symbols.push_back(ConstString("__GI_raise")); location.symbols.push_back(ConstString("gsignal")); break; default: Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_UNWIND)); LLDB_LOG(log, "AssertFrameRecognizer::GetAbortLocation Unsupported OS"); return false; } return true; } /// Fetches the assert frame location depending on the current platform. /// /// \param[in] os /// The target's os type. /// \param[in,out] location /// The struct that will contain the assert module spec and symbol names. /// \return /// \b true, if the platform is supported /// \b false, otherwise. bool GetAssertLocation(llvm::Triple::OSType os, SymbolLocation &location) { switch (os) { case llvm::Triple::Darwin: case llvm::Triple::MacOSX: location.module_spec = FileSpec("libsystem_c.dylib"); location.symbols.push_back(ConstString("__assert_rtn")); break; case llvm::Triple::Linux: location.module_spec = FileSpec("libc.so.6"); location.symbols.push_back(ConstString("__assert_fail")); location.symbols.push_back(ConstString("__GI___assert_fail")); break; default: Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_UNWIND)); LLDB_LOG(log, "AssertFrameRecognizer::GetAssertLocation Unsupported OS"); return false; } return true; } void RegisterAssertFrameRecognizer(Process *process) { static llvm::once_flag g_once_flag; llvm::call_once(g_once_flag, [process]() { Target &target = process->GetTarget(); llvm::Triple::OSType os = target.GetArchitecture().GetTriple().getOS(); SymbolLocation location; if (!GetAbortLocation(os, location)) return; StackFrameRecognizerManager::AddRecognizer( StackFrameRecognizerSP(new AssertFrameRecognizer()), location.module_spec.GetFilename(), location.symbols, /*first_instruction_only*/ false); }); } } // namespace lldb_private lldb::RecognizedStackFrameSP AssertFrameRecognizer::RecognizeFrame(lldb::StackFrameSP frame_sp) { ThreadSP thread_sp = frame_sp->GetThread(); ProcessSP process_sp = thread_sp->GetProcess(); Target &target = process_sp->GetTarget(); llvm::Triple::OSType os = target.GetArchitecture().GetTriple().getOS(); SymbolLocation location; if (!GetAssertLocation(os, location)) return RecognizedStackFrameSP(); const uint32_t frames_to_fetch = 5; const uint32_t last_frame_index = frames_to_fetch - 1; StackFrameSP prev_frame_sp = nullptr; // Fetch most relevant frame for (uint32_t frame_index = 0; frame_index < frames_to_fetch; frame_index++) { prev_frame_sp = thread_sp->GetStackFrameAtIndex(frame_index); if (!prev_frame_sp) { Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_UNWIND)); LLDB_LOG(log, "Abort Recognizer: Hit unwinding bound ({1} frames)!", frames_to_fetch); break; } SymbolContext sym_ctx = prev_frame_sp->GetSymbolContext(eSymbolContextEverything); if (!sym_ctx.module_sp->GetFileSpec().FileEquals(location.module_spec)) continue; ConstString func_name = sym_ctx.GetFunctionName(); if (llvm::is_contained(location.symbols, func_name)) { // We go a frame beyond the assert location because the most relevant // frame for the user is the one in which the assert function was called. // If the assert location is the last frame fetched, then it is set as // the most relevant frame. StackFrameSP most_relevant_frame_sp = thread_sp->GetStackFrameAtIndex( std::min(frame_index + 1, last_frame_index)); // Pass assert location to AbortRecognizedStackFrame to set as most // relevant frame. return lldb::RecognizedStackFrameSP( new AssertRecognizedStackFrame(most_relevant_frame_sp)); } } return RecognizedStackFrameSP(); } AssertRecognizedStackFrame::AssertRecognizedStackFrame( StackFrameSP most_relevant_frame_sp) : m_most_relevant_frame(most_relevant_frame_sp) { m_stop_desc = "hit program assert"; } lldb::StackFrameSP AssertRecognizedStackFrame::GetMostRelevantFrame() { return m_most_relevant_frame; }
Upload File
Create Folder