an issue with the way the UnwindLLDB was handing out RegisterContexts: it was making shared pointers to register contexts and then handing out just the pointers (which would get put into shared pointers in the thread and stack frame classes) and cause double free issues. MallocScribble helped to find these issues after I did some other cleanup. To help avoid any RegisterContext issue in the future, all code that deals with them now returns shared pointers to the register contexts so we don't end up with multiple deletions. Also now that the RegisterContext class doesn't require a stack frame, we patched a memory leak where a StackFrame object was being created and leaked. Made the RegisterContext class not have a pointer to a StackFrame object as one register context class can be used for N inlined stack frames so there is not a 1 - 1 mapping. Updates the ExecutionContextScope part of the RegisterContext class to never return a stack frame to indicate this when it is asked to recreate the execution context. Now register contexts point to the concrete frame using a concrete frame index. Concrete frames are all of the frames that are actually formed on the stack of a thread. These concrete frames can be turned into one or more user visible frames due to inlining. Each inlined stack frame has the exact same register context (shared via shared pointers) as any parent inlined stack frames all the way up to the concrete frame itself. So now the stack frames and the register contexts should behave much better. llvm-svn: 122976
78 lines
1.9 KiB
C++
78 lines
1.9 KiB
C++
//===-- UnwindMacOSXFrameBackchain.h ----------------------------*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef lldb_UnwindMacOSXFrameBackchain_h_
|
|
#define lldb_UnwindMacOSXFrameBackchain_h_
|
|
|
|
// C Includes
|
|
// C++ Includes
|
|
#include <vector>
|
|
|
|
// Other libraries and framework includes
|
|
|
|
// Project includes
|
|
#include "lldb/lldb-private.h"
|
|
#include "lldb/Target/Unwind.h"
|
|
|
|
class UnwindMacOSXFrameBackchain : public lldb_private::Unwind
|
|
{
|
|
public:
|
|
UnwindMacOSXFrameBackchain (lldb_private::Thread &thread);
|
|
|
|
virtual
|
|
~UnwindMacOSXFrameBackchain()
|
|
{
|
|
}
|
|
|
|
virtual void
|
|
Clear()
|
|
{
|
|
m_cursors.clear();
|
|
}
|
|
|
|
virtual uint32_t
|
|
GetFrameCount();
|
|
|
|
bool
|
|
GetFrameInfoAtIndex (uint32_t frame_idx,
|
|
lldb::addr_t& cfa,
|
|
lldb::addr_t& pc);
|
|
|
|
lldb::RegisterContextSP
|
|
CreateRegisterContextForFrame (lldb_private::StackFrame *frame);
|
|
|
|
lldb_private::Thread &
|
|
GetThread();
|
|
|
|
protected:
|
|
friend class RegisterContextMacOSXFrameBackchain;
|
|
|
|
struct Cursor
|
|
{
|
|
lldb::addr_t pc; // Program counter
|
|
lldb::addr_t fp; // Frame pointer for us with backchain
|
|
};
|
|
|
|
private:
|
|
std::vector<Cursor> m_cursors;
|
|
|
|
size_t
|
|
GetStackFrameData_i386 (lldb_private::StackFrame *first_frame);
|
|
|
|
size_t
|
|
GetStackFrameData_x86_64 (lldb_private::StackFrame *first_frame);
|
|
|
|
//------------------------------------------------------------------
|
|
// For UnwindMacOSXFrameBackchain only
|
|
//------------------------------------------------------------------
|
|
DISALLOW_COPY_AND_ASSIGN (UnwindMacOSXFrameBackchain);
|
|
};
|
|
|
|
#endif // lldb_UnwindMacOSXFrameBackchain_h_
|