[Lldb-commits] [lldb] r219546 - LLDB AddressSanitizer instrumentation runtime plugin, breakpint on error and report data extraction

Kuba Brecka kuba.brecka at gmail.com
Fri Oct 10 17:52:55 PDT 2014


Thanks! Will be more careful next time.

Kuba

On Fri, Oct 10, 2014 at 5:50 PM, Eric Christopher <echristo at gmail.com>
wrote:

> FWIW this didn't even vaguely build on anything other than xcode. Fixed
> thusly:
>
> dzur:~/sources/llvm/tools/lldb> svn ci lib/Makefile source/
> Sending        lib/Makefile
> Sending        source/CMakeLists.txt
> Sending        source/Plugins/Makefile
> Transmitting file data ...
> Committed revision 219554.
>
> -eric
>
> On Fri, Oct 10, 2014 at 4:43 PM, Kuba Brecka <kuba.brecka at gmail.com>
> wrote:
> > Author: kuba.brecka
> > Date: Fri Oct 10 18:43:03 2014
> > New Revision: 219546
> >
> > URL: http://llvm.org/viewvc/llvm-project?rev=219546&view=rev
> > Log:
> > LLDB AddressSanitizer instrumentation runtime plugin, breakpint on error
> and report data extraction
> >
> > Reviewed at http://reviews.llvm.org/D5592
> >
> > This patch gives LLDB some ability to interact with AddressSanitizer
> runtime library, on top of what we already have (historical memory stack
> traces provided by ASan). Namely, that's the ability to stop on an error
> caught by ASan, and access the report information that are associated with
> it. The report information is also exposed into SB API.
> >
> > More precisely this patch...
> >
> > adds a new plugin type, InstrumentationRuntime, which should serve as a
> generic superclass for other instrumentation runtime libraries, these
> plugins get notified when modules are loaded, so they get a chance to
> "activate" when a specific dynamic library is loaded
> > an instance of this plugin type, AddressSanitizerRuntime, which
> activates itself when it sees the ASan dynamic library or founds ASan
> statically linked in the executable
> > adds a collection of these plugins into the Process class
> > AddressSanitizerRuntime sets an internal breakpoint on
> __asan::AsanDie(), and when this breakpoint gets hit, it retrieves the
> report information from ASan
> > this breakpoint is then exposed as a new StopReason,
> eStopReasonInstrumentation, with a new StopInfo subclass,
> InstrumentationRuntimeStopInfo
> > the StopInfo superclass is extended with a m_extended_info field (it's a
> StructuredData::ObjectSP), that can hold arbitrary JSON-like data, which is
> the way the new plugin provides the report data
> > the "thread info" command now accepts a "-s" flag that prints out the
> JSON data of a stop reason (same way the "-j" flag works now)
> > SBThread has a new API, GetStopReasonExtendedInfoAsJSON, which dumps the
> JSON string into a SBStream
> > adds a test case for all of this
> > I plan to also get rid of the original ASan plugin (memory history stack
> traces) and use an instance of AddressSanitizerRuntime for that purpose.
> >
> > Kuba
> >
> >
> > Added:
> >     lldb/trunk/include/lldb/Target/InstrumentationRuntime.h
> >     lldb/trunk/include/lldb/Target/InstrumentationRuntimeStopInfo.h
> >     lldb/trunk/source/Plugins/InstrumentationRuntime/
> >     lldb/trunk/source/Plugins/InstrumentationRuntime/AddressSanitizer/
> >
>  lldb/trunk/source/Plugins/InstrumentationRuntime/AddressSanitizer/AddressSanitizerRuntime.cpp
> >
>  lldb/trunk/source/Plugins/InstrumentationRuntime/AddressSanitizer/AddressSanitizerRuntime.h
> >
>  lldb/trunk/source/Plugins/InstrumentationRuntime/AddressSanitizer/CMakeLists.txt
> >
>  lldb/trunk/source/Plugins/InstrumentationRuntime/AddressSanitizer/Makefile
> >     lldb/trunk/source/Plugins/InstrumentationRuntime/CMakeLists.txt
> >     lldb/trunk/source/Target/InstrumentationRuntime.cpp
> >     lldb/trunk/source/Target/InstrumentationRuntimeStopInfo.cpp
> >     lldb/trunk/test/functionalities/asan/TestMemoryHistory.py
> >       - copied unchanged from r219545,
> lldb/trunk/test/functionalities/asan/TestAsan.py
> >     lldb/trunk/test/functionalities/asan/TestReportData.py
> > Removed:
> >     lldb/trunk/test/functionalities/asan/TestAsan.py
> > Modified:
> >     lldb/trunk/include/lldb/API/SBThread.h
> >     lldb/trunk/include/lldb/Core/PluginManager.h
> >     lldb/trunk/include/lldb/Target/Process.h
> >     lldb/trunk/include/lldb/Target/StopInfo.h
> >     lldb/trunk/include/lldb/Target/Thread.h
> >     lldb/trunk/include/lldb/lldb-enumerations.h
> >     lldb/trunk/include/lldb/lldb-forward.h
> >     lldb/trunk/include/lldb/lldb-private-interfaces.h
> >     lldb/trunk/lldb.xcodeproj/project.pbxproj
> >     lldb/trunk/scripts/Python/interface/SBThread.i
> >     lldb/trunk/source/API/SBThread.cpp
> >     lldb/trunk/source/Commands/CommandObjectThread.cpp
> >     lldb/trunk/source/Core/Debugger.cpp
> >     lldb/trunk/source/Core/PluginManager.cpp
> >     lldb/trunk/source/Target/CMakeLists.txt
> >     lldb/trunk/source/Target/Process.cpp
> >     lldb/trunk/source/Target/StopInfo.cpp
> >     lldb/trunk/source/Target/Thread.cpp
> >     lldb/trunk/source/lldb.cpp
> >     lldb/trunk/test/functionalities/asan/main.c
> >
> > Modified: lldb/trunk/include/lldb/API/SBThread.h
> > URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/API/SBThread.h?rev=219546&r1=219545&r2=219546&view=diff
> >
> ==============================================================================
> > --- lldb/trunk/include/lldb/API/SBThread.h (original)
> > +++ lldb/trunk/include/lldb/API/SBThread.h Fri Oct 10 18:43:03 2014
> > @@ -78,7 +78,10 @@ public:
> >
> //--------------------------------------------------------------------------
> >      uint64_t
> >      GetStopReasonDataAtIndex(uint32_t idx);
> > -
> > +
> > +    bool
> > +    GetStopReasonExtendedInfoAsJSON (lldb::SBStream &stream);
> > +
> >      size_t
> >      GetStopDescription (char *dst, size_t dst_len);
> >
> >
> > Modified: lldb/trunk/include/lldb/Core/PluginManager.h
> > URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/PluginManager.h?rev=219546&r1=219545&r2=219546&view=diff
> >
> ==============================================================================
> > --- lldb/trunk/include/lldb/Core/PluginManager.h (original)
> > +++ lldb/trunk/include/lldb/Core/PluginManager.h Fri Oct 10 18:43:03 2014
> > @@ -361,6 +361,28 @@ public:
> >      GetMemoryHistoryCreateCallbackForPluginName (const ConstString
> &name);
> >
> >      //------------------------------------------------------------------
> > +    // InstrumentationRuntime
> > +    //------------------------------------------------------------------
> > +    static bool
> > +    RegisterPlugin (const ConstString &name,
> > +                    const char *description,
> > +                    InstrumentationRuntimeCreateInstance
> create_callback,
> > +                    InstrumentationRuntimeGetType get_type_callback);
> > +
> > +    static bool
> > +    UnregisterPlugin (InstrumentationRuntimeCreateInstance
> create_callback);
> > +
> > +    static InstrumentationRuntimeGetType
> > +    GetInstrumentationRuntimeGetTypeCallbackAtIndex (uint32_t idx);
> > +
> > +    static InstrumentationRuntimeCreateInstance
> > +    GetInstrumentationRuntimeCreateCallbackAtIndex (uint32_t idx);
> > +
> > +    static InstrumentationRuntimeCreateInstance
> > +    GetInstrumentationRuntimeCreateCallbackForPluginName (const
> ConstString &name);
> > +
> > +
> > +    //------------------------------------------------------------------
> >      // Some plug-ins might register a DebuggerInitializeCallback
> >      // callback when registering the plug-in. After a new Debugger
> >      // instance is created, this DebuggerInitialize function will get
> >
> > Added: lldb/trunk/include/lldb/Target/InstrumentationRuntime.h
> > URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Target/InstrumentationRuntime.h?rev=219546&view=auto
> >
> ==============================================================================
> > --- lldb/trunk/include/lldb/Target/InstrumentationRuntime.h (added)
> > +++ lldb/trunk/include/lldb/Target/InstrumentationRuntime.h Fri Oct 10
> 18:43:03 2014
> > @@ -0,0 +1,47 @@
> > +//===-- InstrumentationRuntime.h --------------------------------*- C++
> -*-===//
> > +//
> > +//                     The LLVM Compiler Infrastructure
> > +//
> > +// This file is distributed under the University of Illinois Open Source
> > +// License. See LICENSE.TXT for details.
> > +//
> >
> +//===----------------------------------------------------------------------===//
> > +
> > +#ifndef liblldb_InstrumentationRuntime_h_
> > +#define liblldb_InstrumentationRuntime_h_
> > +
> > +// C Includes
> > +// C++ Includes
> > +#include <vector>
> > +#include <map>
> > +
> > +// Other libraries and framework includes
> > +// Project includes
> > +#include "lldb/lldb-private.h"
> > +#include "lldb/lldb-types.h"
> > +#include "lldb/Core/PluginInterface.h"
> > +
> > +namespace lldb_private {
> > +
> > +typedef std::map<lldb::InstrumentationRuntimeType,
> lldb::InstrumentationRuntimeSP> InstrumentationRuntimeCollection;
> > +
> > +class InstrumentationRuntime :
> > +    public std::enable_shared_from_this<InstrumentationRuntime>,
> > +    public PluginInterface
> > +{
> > +public:
> > +
> > +    static void
> > +    ModulesDidLoad(lldb_private::ModuleList &module_list, Process
> *process, InstrumentationRuntimeCollection &runtimes);
> > +
> > +    virtual void
> > +    ModulesDidLoad(lldb_private::ModuleList &module_list);
> > +
> > +    virtual bool
> > +    IsActive();
> > +
> > +};
> > +
> > +} // namespace lldb_private
> > +
> > +#endif  // liblldb_InstrumentationRuntime_h_
> >
> > Added: lldb/trunk/include/lldb/Target/InstrumentationRuntimeStopInfo.h
> > URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Target/InstrumentationRuntimeStopInfo.h?rev=219546&view=auto
> >
> ==============================================================================
> > --- lldb/trunk/include/lldb/Target/InstrumentationRuntimeStopInfo.h
> (added)
> > +++ lldb/trunk/include/lldb/Target/InstrumentationRuntimeStopInfo.h Fri
> Oct 10 18:43:03 2014
> > @@ -0,0 +1,52 @@
> > +//===-- InstrumentationRuntimeStopInfo.h ------------------------*- C++
> -*-===//
> > +//
> > +//                     The LLVM Compiler Infrastructure
> > +//
> > +// This file is distributed under the University of Illinois Open Source
> > +// License. See LICENSE.TXT for details.
> > +//
> >
> +//===----------------------------------------------------------------------===//
> > +
> > +#ifndef liblldb_InstrumentationRuntimeStopInfo_h_
> > +#define liblldb_InstrumentationRuntimeStopInfo_h_
> > +
> > +// C Includes
> > +// C++ Includes
> > +#include <string>
> > +
> > +// Other libraries and framework includes
> > +// Project includes
> > +#include "lldb/Target/StopInfo.h"
> > +#include "lldb/Core/StructuredData.h"
> > +
> > +namespace lldb_private {
> > +
> > +class InstrumentationRuntimeStopInfo : public StopInfo
> > +{
> > +public:
> > +
> > +    virtual ~InstrumentationRuntimeStopInfo()
> > +    {
> > +    }
> > +
> > +    virtual lldb::StopReason
> > +    GetStopReason () const
> > +    {
> > +        return lldb::eStopReasonInstrumentation;
> > +    }
> > +
> > +    virtual const char *
> > +    GetDescription ();
> > +
> > +    static lldb::StopInfoSP
> > +    CreateStopReasonWithInstrumentationData (Thread &thread,
> std::string description, StructuredData::ObjectSP additional_data);
> > +
> > +private:
> > +
> > +    InstrumentationRuntimeStopInfo(Thread &thread, std::string
> description, StructuredData::ObjectSP additional_data);
> > +
> > +};
> > +
> > +} // namespace lldb_private
> > +
> > +#endif  // liblldb_InstrumentationRuntimeStopInfo_h_
> >
> > Modified: lldb/trunk/include/lldb/Target/Process.h
> > URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Target/Process.h?rev=219546&r1=219545&r2=219546&view=diff
> >
> ==============================================================================
> > --- lldb/trunk/include/lldb/Target/Process.h (original)
> > +++ lldb/trunk/include/lldb/Target/Process.h Fri Oct 10 18:43:03 2014
> > @@ -52,6 +52,7 @@
> >  #include "lldb/Target/ThreadList.h"
> >  #include "lldb/Target/UnixSignals.h"
> >  #include "lldb/Utility/PseudoTerminal.h"
> > +#include "lldb/Target/InstrumentationRuntime.h"
> >
> >  namespace lldb_private {
> >
> > @@ -3082,6 +3083,7 @@ protected:
> >      AllocatedMemoryCache        m_allocated_memory_cache;
> >      bool                        m_should_detach;   /// Should we detach
> if the process object goes away with an explicit call to Kill or Detach?
> >      LanguageRuntimeCollection   m_language_runtimes;
> > +    InstrumentationRuntimeCollection m_instrumentation_runtimes;
> >      std::unique_ptr<NextEventAction> m_next_event_action_ap;
> >      std::vector<PreResumeCallbackAndBaton> m_pre_resume_actions;
> >      ProcessRunLock              m_public_run_lock;
> >
> > Modified: lldb/trunk/include/lldb/Target/StopInfo.h
> > URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Target/StopInfo.h?rev=219546&r1=219545&r2=219546&view=diff
> >
> ==============================================================================
> > --- lldb/trunk/include/lldb/Target/StopInfo.h (original)
> > +++ lldb/trunk/include/lldb/Target/StopInfo.h Fri Oct 10 18:43:03 2014
> > @@ -18,6 +18,7 @@
> >  // Project includes
> >  #include "lldb/lldb-public.h"
> >  #include "lldb/Target/Process.h"
> > +#include "lldb/Core/StructuredData.h"
> >
> >  namespace lldb_private {
> >
> > @@ -140,6 +141,12 @@ public:
> >          return m_override_should_stop == eLazyBoolYes;
> >      }
> >
> > +    StructuredData::ObjectSP
> > +    GetExtendedInfo ()
> > +    {
> > +        return m_extended_info;
> > +    }
> > +
> >      static lldb::StopInfoSP
> >      CreateStopReasonWithBreakpointSiteID (Thread &thread,
> lldb::break_id_t break_id);
> >
> > @@ -211,6 +218,8 @@ protected:
> >      LazyBool        m_override_should_notify;
> >      LazyBool        m_override_should_stop;
> >
> > +    StructuredData::ObjectSP m_extended_info; // The extended info for
> this stop info
> > +
> >      // This determines whether the target has run since this stop info.
> >      // N.B. running to evaluate a user expression does not count.
> >      bool HasTargetRunSinceMe ();
> >
> > Modified: lldb/trunk/include/lldb/Target/Thread.h
> > URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Target/Thread.h?rev=219546&r1=219545&r2=219546&view=diff
> >
> ==============================================================================
> > --- lldb/trunk/include/lldb/Target/Thread.h (original)
> > +++ lldb/trunk/include/lldb/Target/Thread.h Fri Oct 10 18:43:03 2014
> > @@ -535,7 +535,7 @@ public:
> >      DumpUsingSettingsFormat (Stream &strm, uint32_t frame_idx);
> >
> >      bool
> > -    GetDescription (Stream &s, lldb::DescriptionLevel level, bool
> json_output);
> > +    GetDescription (Stream &s, lldb::DescriptionLevel level, bool
> print_json_thread, bool print_json_stopinfo);
> >
> >      //------------------------------------------------------------------
> >      /// Default implementation for stepping into.
> >
> > Modified: lldb/trunk/include/lldb/lldb-enumerations.h
> > URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/lldb-enumerations.h?rev=219546&r1=219545&r2=219546&view=diff
> >
> ==============================================================================
> > --- lldb/trunk/include/lldb/lldb-enumerations.h (original)
> > +++ lldb/trunk/include/lldb/lldb-enumerations.h Fri Oct 10 18:43:03 2014
> > @@ -185,7 +185,8 @@ namespace lldb {
> >          eStopReasonException,
> >          eStopReasonExec,        // Program was re-exec'ed
> >          eStopReasonPlanComplete,
> > -        eStopReasonThreadExiting
> > +        eStopReasonThreadExiting,
> > +        eStopReasonInstrumentation
> >      } StopReason;
> >
> >
> //----------------------------------------------------------------------
> > @@ -387,6 +388,11 @@ namespace lldb {
> >          eLanguageTypeDylan           = 0x0020,   ///< Dylan.
> >          eNumLanguageTypes
> >      } LanguageType;
> > +
> > +    typedef enum InstrumentationRuntimeType {
> > +        eInstrumentationRuntimeTypeAddressSanitizer = 0x0000,
> > +        eNumInstrumentationRuntimeTypes
> > +    } InstrumentationRuntimeType;
> >
> >      typedef enum DynamicValueType
> >      {
> >
> > Modified: lldb/trunk/include/lldb/lldb-forward.h
> > URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/lldb-forward.h?rev=219546&r1=219545&r2=219546&view=diff
> >
> ==============================================================================
> > --- lldb/trunk/include/lldb/lldb-forward.h (original)
> > +++ lldb/trunk/include/lldb/lldb-forward.h Fri Oct 10 18:43:03 2014
> > @@ -104,6 +104,7 @@ class   FunctionInfo;
> >  class   InlineFunctionInfo;
> >  class   Instruction;
> >  class   InstructionList;
> > +class   InstrumentationRuntime;
> >  class   IOHandler;
> >  class   IOObject;
> >  class   IRExecutionUnit;
> > @@ -312,6 +313,7 @@ namespace lldb {
> >      typedef std::shared_ptr<lldb_private::FuncUnwinders>
> FuncUnwindersSP;
> >      typedef std::shared_ptr<lldb_private::InlineFunctionInfo>
> InlineFunctionInfoSP;
> >      typedef std::shared_ptr<lldb_private::Instruction> InstructionSP;
> > +    typedef std::shared_ptr<lldb_private::InstrumentationRuntime>
> InstrumentationRuntimeSP;
> >      typedef std::shared_ptr<lldb_private::IOHandler> IOHandlerSP;
> >      typedef std::shared_ptr<lldb_private::IOObject> IOObjectSP;
> >      typedef std::shared_ptr<lldb_private::JITLoader> JITLoaderSP;
> >
> > Modified: lldb/trunk/include/lldb/lldb-private-interfaces.h
> > URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/lldb-private-interfaces.h?rev=219546&r1=219545&r2=219546&view=diff
> >
> ==============================================================================
> > --- lldb/trunk/include/lldb/lldb-private-interfaces.h (original)
> > +++ lldb/trunk/include/lldb/lldb-private-interfaces.h Fri Oct 10
> 18:43:03 2014
> > @@ -40,6 +40,8 @@ namespace lldb_private
> >      typedef lldb::ThreadPlanSP (*ThreadPlanStepFromHereCallback)
> (ThreadPlan *current_plan, Flags &flags, lldb::FrameComparison operation,
> void *baton);
> >      typedef UnwindAssembly* (*UnwindAssemblyCreateInstance) (const
> ArchSpec &arch);
> >      typedef lldb::MemoryHistorySP (*MemoryHistoryCreateInstance) (const
> lldb::ProcessSP &process_sp);
> > +    typedef lldb::InstrumentationRuntimeType
> (*InstrumentationRuntimeGetType) ();
> > +    typedef lldb::InstrumentationRuntimeSP
> (*InstrumentationRuntimeCreateInstance) (const lldb::ProcessSP &process_sp);
> >      typedef int (*ComparisonFunction)(const void *, const void *);
> >      typedef void (*DebuggerInitializeCallback)(Debugger &debugger);
> >
> >
> > Modified: lldb/trunk/lldb.xcodeproj/project.pbxproj
> > URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/lldb.xcodeproj/project.pbxproj?rev=219546&r1=219545&r2=219546&view=diff
> >
> ==============================================================================
> > --- lldb/trunk/lldb.xcodeproj/project.pbxproj (original)
> > +++ lldb/trunk/lldb.xcodeproj/project.pbxproj Fri Oct 10 18:43:03 2014
> > @@ -637,6 +637,9 @@
> >                 8CCB017E19BA28A80009FD44 /* ThreadCollection.cpp in
> Sources */ = {isa = PBXBuildFile; fileRef = 8CCB017A19BA283D0009FD44 /*
> ThreadCollection.cpp */; };
> >                 8CCB018219BA4E270009FD44 /* SBThreadCollection.h in
> Headers */ = {isa = PBXBuildFile; fileRef = 8CCB018119BA4E210009FD44 /*
> SBThreadCollection.h */; settings = {ATTRIBUTES = (Public, ); }; };
> >                 8CCB018319BA51BF0009FD44 /* SBThreadCollection.cpp in
> Sources */ = {isa = PBXBuildFile; fileRef = 8CCB017F19BA4DD00009FD44 /*
> SBThreadCollection.cpp */; };
> > +               8CF02AE919DCC01900B14BE0 /* InstrumentationRuntime.cpp
> in Sources */ = {isa = PBXBuildFile; fileRef = 8CF02ADF19DCBF3B00B14BE0 /*
> InstrumentationRuntime.cpp */; };
> > +               8CF02AEA19DCC02100B14BE0 /* AddressSanitizerRuntime.cpp
> in Sources */ = {isa = PBXBuildFile; fileRef = 8CF02AE519DCBF8400B14BE0 /*
> AddressSanitizerRuntime.cpp */; };
> > +               8CF02AEF19DD16B100B14BE0 /*
> InstrumentationRuntimeStopInfo.cpp in Sources */ = {isa = PBXBuildFile;
> fileRef = 8CF02AED19DD15CF00B14BE0 /* InstrumentationRuntimeStopInfo.cpp
> */; };
> >                 94094C6B163B6F840083A547 /* ValueObjectCast.cpp in
> Sources */ = {isa = PBXBuildFile; fileRef = 94094C69163B6CD90083A547 /*
> ValueObjectCast.cpp */; };
> >                 940B02F619DC96E700AD0F52 /* SBExecutionContext.cpp in
> Sources */ = {isa = PBXBuildFile; fileRef = 940B02F519DC96E700AD0F52 /*
> SBExecutionContext.cpp */; };
> >                 94145431175E63B500284436 /* lldb-versioning.h in Headers
> */ = {isa = PBXBuildFile; fileRef = 94145430175D7FDE00284436 /*
> lldb-versioning.h */; settings = {ATTRIBUTES = (Public, ); }; };
> > @@ -1965,6 +1968,12 @@
> >                 8CCB017F19BA4DD00009FD44 /* SBThreadCollection.cpp */ =
> {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name =
> SBThreadCollection.cpp; path = source/API/SBThreadCollection.cpp;
> sourceTree = "<group>"; };
> >                 8CCB018119BA4E210009FD44 /* SBThreadCollection.h */ =
> {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name =
> SBThreadCollection.h; path = include/lldb/API/SBThreadCollection.h;
> sourceTree = "<group>"; };
> >                 8CCB018419BA54930009FD44 /* SBThreadCollection.i */ =
> {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c.preprocessed;
> path = SBThreadCollection.i; sourceTree = "<group>"; };
> > +               8CF02ADF19DCBF3B00B14BE0 /* InstrumentationRuntime.cpp
> */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name
> = InstrumentationRuntime.cpp; path =
> source/Target/InstrumentationRuntime.cpp; sourceTree = "<group>"; };
> > +               8CF02AE019DCBF3B00B14BE0 /* InstrumentationRuntime.h */
> = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name =
> InstrumentationRuntime.h; path =
> include/lldb/Target/InstrumentationRuntime.h; sourceTree = "<group>"; };
> > +               8CF02AE519DCBF8400B14BE0 /* AddressSanitizerRuntime.cpp
> */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType =
> sourcecode.cpp.cpp; path = AddressSanitizerRuntime.cpp; sourceTree =
> "<group>"; };
> > +               8CF02AE619DCBF8400B14BE0 /* AddressSanitizerRuntime.h */
> = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType =
> sourcecode.c.h; path = AddressSanitizerRuntime.h; sourceTree = "<group>"; };
> > +               8CF02AED19DD15CF00B14BE0 /*
> InstrumentationRuntimeStopInfo.cpp */ = {isa = PBXFileReference;
> lastKnownFileType = sourcecode.cpp.cpp; name =
> InstrumentationRuntimeStopInfo.cpp; path =
> source/Target/InstrumentationRuntimeStopInfo.cpp; sourceTree = "<group>"; };
> > +               8CF02AEE19DD15CF00B14BE0 /*
> InstrumentationRuntimeStopInfo.h */ = {isa = PBXFileReference;
> lastKnownFileType = sourcecode.c.h; name =
> InstrumentationRuntimeStopInfo.h; path =
> include/lldb/Target/InstrumentationRuntimeStopInfo.h; sourceTree =
> "<group>"; };
> >                 94005E0313F438DF001EF42D /* python-wrapper.swig */ =
> {isa = PBXFileReference; lastKnownFileType = text; path =
> "python-wrapper.swig"; sourceTree = "<group>"; };
> >                 94005E0513F45A1B001EF42D /* embedded_interpreter.py */ =
> {isa = PBXFileReference; lastKnownFileType = text.script.python; name =
> embedded_interpreter.py; path = source/Interpreter/embedded_interpreter.py;
> sourceTree = "<group>"; };
> >                 94031A9F13CF5B3D00DCFF3C /* PriorityPointerPair.h */ =
> {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name =
> PriorityPointerPair.h; path = include/lldb/Utility/PriorityPointerPair.h;
> sourceTree = "<group>"; };
> > @@ -2423,6 +2432,7 @@
> >                 260C897110F57C5600BB2B04 /* Plugins */ = {
> >                         isa = PBXGroup;
> >                         children = (
> > +                               8CF02ADD19DCBEC200B14BE0 /*
> InstrumentationRuntime */,
> >                                 8C2D6A58197A1FB9006989C9 /*
> MemoryHistory */,
> >                                 26DB3E051379E7AD0080DC73 /* ABI */,
> >                                 260C897210F57C5600BB2B04 /* Disassembler
> */,
> > @@ -3746,6 +3756,10 @@
> >                 26BC7DEF10F1B80200F91463 /* Target */ = {
> >                         isa = PBXGroup;
> >                         children = (
> > +                               8CF02AE019DCBF3B00B14BE0 /*
> InstrumentationRuntime.h */,
> > +                               8CF02ADF19DCBF3B00B14BE0 /*
> InstrumentationRuntime.cpp */,
> > +                               8CF02AEE19DD15CF00B14BE0 /*
> InstrumentationRuntimeStopInfo.h */,
> > +                               8CF02AED19DD15CF00B14BE0 /*
> InstrumentationRuntimeStopInfo.cpp */,
> >                                 3FDFD6C3199C396E009756A7 /* FileAction.h
> */,
> >                                 3FDFDDBC199C3A06009756A7 /*
> FileAction.cpp */,
> >                                 23EDE3311926843600F6A132 /*
> NativeRegisterContext.h */,
> > @@ -4264,6 +4278,23 @@
> >                         path = asan;
> >                         sourceTree = "<group>";
> >                 };
> > +               8CF02ADD19DCBEC200B14BE0 /* InstrumentationRuntime */ = {
> > +                       isa = PBXGroup;
> > +                       children = (
> > +                               8CF02ADE19DCBEE600B14BE0 /*
> AddressSanitizer */,
> > +                       );
> > +                       path = InstrumentationRuntime;
> > +                       sourceTree = "<group>";
> > +               };
> > +               8CF02ADE19DCBEE600B14BE0 /* AddressSanitizer */ = {
> > +                       isa = PBXGroup;
> > +                       children = (
> > +                               8CF02AE519DCBF8400B14BE0 /*
> AddressSanitizerRuntime.cpp */,
> > +                               8CF02AE619DCBF8400B14BE0 /*
> AddressSanitizerRuntime.h */,
> > +                       );
> > +                       path = AddressSanitizer;
> > +                       sourceTree = "<group>";
> > +               };
> >                 9457596415349416005A9070 /* POSIX */ = {
> >                         isa = PBXGroup;
> >                         children = (
> > @@ -4965,6 +4996,7 @@
> >                                 2689000713353DB600698AC0 /*
> BreakpointSite.cpp in Sources */,
> >                                 2689000913353DB600698AC0 /*
> BreakpointSiteList.cpp in Sources */,
> >                                 26474CC918D0CB5B0073DEBA /*
> RegisterContextMemory.cpp in Sources */,
> > +                               8CF02AEA19DCC02100B14BE0 /*
> AddressSanitizerRuntime.cpp in Sources */,
> >                                 26474CB218D0CB180073DEBA /*
> RegisterContextLinux_i386.cpp in Sources */,
> >                                 26474CCB18D0CB5B0073DEBA /*
> RegisterContextPOSIX_mips64.cpp in Sources */,
> >                                 2689000B13353DB600698AC0 /*
> Stoppoint.cpp in Sources */,
> > @@ -5002,6 +5034,7 @@
> >                                 2689002813353DDE00698AC0 /*
> CommandObjectThread.cpp in Sources */,
> >                                 2689002913353DDE00698AC0 /*
> CommandObjectVersion.cpp in Sources */,
> >                                 2689002A13353E0400698AC0 /* Address.cpp
> in Sources */,
> > +                               8CF02AE919DCC01900B14BE0 /*
> InstrumentationRuntime.cpp in Sources */,
> >                                 2689002B13353E0400698AC0 /*
> AddressRange.cpp in Sources */,
> >                                 236124A41986B4E2004EFC37 /* IOObject.cpp
> in Sources */,
> >                                 2689002C13353E0400698AC0 /*
> AddressResolver.cpp in Sources */,
> > @@ -5223,6 +5256,7 @@
> >                                 268900FA13353E6F00698AC0 /*
> ThreadList.cpp in Sources */,
> >                                 268900FB13353E6F00698AC0 /*
> ThreadPlan.cpp in Sources */,
> >                                 232CB619191E00CD00EF39FC /*
> NativeProcessProtocol.cpp in Sources */,
> > +                               8CF02AEF19DD16B100B14BE0 /*
> InstrumentationRuntimeStopInfo.cpp in Sources */,
> >                                 268900FC13353E6F00698AC0 /*
> ThreadPlanBase.cpp in Sources */,
> >                                 268900FD13353E6F00698AC0 /*
> ThreadPlanCallFunction.cpp in Sources */,
> >                                 268900FE13353E6F00698AC0 /*
> ThreadPlanCallUserExpression.cpp in Sources */,
> >
> > Modified: lldb/trunk/scripts/Python/interface/SBThread.i
> > URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/scripts/Python/interface/SBThread.i?rev=219546&r1=219545&r2=219546&view=diff
> >
> ==============================================================================
> > --- lldb/trunk/scripts/Python/interface/SBThread.i (original)
> > +++ lldb/trunk/scripts/Python/interface/SBThread.i Fri Oct 10 18:43:03
> 2014
> > @@ -110,6 +110,14 @@ public:
> >      ") GetStopReasonDataAtIndex;
> >      uint64_t
> >      GetStopReasonDataAtIndex(uint32_t idx);
> > +
> > +    %feature("autodoc", "
> > +    Collects a thread's stop reason extended information dictionary and
> prints it
> > +    into the SBStream in a JSON format. The format of this JSON
> dictionary depends
> > +    on the stop reason and is currently used only for instrumentation
> plugins.
> > +    ") GetStopReasonExtendedInfoAsJSON;
> > +    bool
> > +    GetStopReasonExtendedInfoAsJSON (lldb::SBStream &stream);
> >
> >      %feature("autodoc", "
> >      Pass only an (int)length and expect to get a Python string
> describing the
> >
> > Modified: lldb/trunk/source/API/SBThread.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/source/API/SBThread.cpp?rev=219546&r1=219545&r2=219546&view=diff
> >
> ==============================================================================
> > --- lldb/trunk/source/API/SBThread.cpp (original)
> > +++ lldb/trunk/source/API/SBThread.cpp Fri Oct 10 18:43:03 2014
> > @@ -195,6 +195,7 @@ SBThread::GetStopReasonDataCount ()
> >                  case eStopReasonExec:
> >                  case eStopReasonPlanComplete:
> >                  case eStopReasonThreadExiting:
> > +                case eStopReasonInstrumentation:
> >                      // There is no data for these stop reasons.
> >                      return 0;
> >
> > @@ -255,6 +256,7 @@ SBThread::GetStopReasonDataAtIndex (uint
> >                  case eStopReasonExec:
> >                  case eStopReasonPlanComplete:
> >                  case eStopReasonThreadExiting:
> > +                case eStopReasonInstrumentation:
> >                      // There is no data for these stop reasons.
> >                      return 0;
> >
> > @@ -306,6 +308,26 @@ SBThread::GetStopReasonDataAtIndex (uint
> >      return 0;
> >  }
> >
> > +bool
> > +SBThread::GetStopReasonExtendedInfoAsJSON (lldb::SBStream &stream)
> > +{
> > +    Stream &strm = stream.ref();
> > +
> > +    ExecutionContext exe_ctx (m_opaque_sp.get());
> > +    if (! exe_ctx.HasThreadScope())
> > +        return false;
> > +
> > +
> > +    StopInfoSP stop_info = exe_ctx.GetThreadPtr()->GetStopInfo();
> > +    StructuredData::ObjectSP info = stop_info->GetExtendedInfo();
> > +    if (! info)
> > +        return false;
> > +
> > +    info->Dump(strm);
> > +
> > +    return true;
> > +}
> > +
> >  size_t
> >  SBThread::GetStopDescription (char *dst, size_t dst_len)
> >  {
> >
> > Modified: lldb/trunk/source/Commands/CommandObjectThread.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Commands/CommandObjectThread.cpp?rev=219546&r1=219545&r2=219546&view=diff
> >
> ==============================================================================
> > --- lldb/trunk/source/Commands/CommandObjectThread.cpp (original)
> > +++ lldb/trunk/source/Commands/CommandObjectThread.cpp Fri Oct 10
> 18:43:03 2014
> > @@ -1431,7 +1431,8 @@ public:
> >          void
> >          OptionParsingStarting ()
> >          {
> > -            m_json = false;
> > +            m_json_thread = false;
> > +            m_json_stopinfo = false;
> >          }
> >
> >          virtual
> > @@ -1448,10 +1449,14 @@ public:
> >              switch (short_option)
> >              {
> >                  case 'j':
> > -                    m_json = true;
> > +                    m_json_thread = true;
> > +                    break;
> > +
> > +                case 's':
> > +                    m_json_stopinfo = true;
> >                      break;
> >
> > -                 default:
> > +                default:
> >                      return Error("invalid short option character '%c'",
> short_option);
> >
> >              }
> > @@ -1464,7 +1469,8 @@ public:
> >              return g_option_table;
> >          }
> >
> > -        bool m_json;
> > +        bool m_json_thread;
> > +        bool m_json_stopinfo;
> >
> >          static OptionDefinition g_option_table[];
> >      };
> > @@ -1486,7 +1492,7 @@ public:
> >      HandleOneThread (Thread &thread, CommandReturnObject &result)
> >      {
> >          Stream &strm = result.GetOutputStream();
> > -        if (!thread.GetDescription (strm, eDescriptionLevelFull,
> m_options.m_json))
> > +        if (!thread.GetDescription (strm, eDescriptionLevelFull,
> m_options.m_json_thread, m_options.m_json_stopinfo))
> >          {
> >              result.AppendErrorWithFormat ("error displaying info for
> thread: \"%d\"\n", thread.GetIndexID());
> >              result.SetStatus (eReturnStatusFailed);
> > @@ -1503,6 +1509,7 @@ OptionDefinition
> >  CommandObjectThreadInfo::CommandOptions::g_option_table[] =
> >  {
> >      { LLDB_OPT_SET_ALL, false, "json",'j', OptionParser::eNoArgument,
> NULL, NULL, 0, eArgTypeNone, "Display the thread info in JSON format."},
> > +    { LLDB_OPT_SET_ALL, false, "stop-info",'s',
> OptionParser::eNoArgument, NULL, NULL, 0, eArgTypeNone, "Display the
> extended stop info in JSON format."},
> >
> >      { 0, false, NULL, 0, 0, NULL, NULL, 0, eArgTypeNone, NULL }
> >  };
> >
> > Modified: lldb/trunk/source/Core/Debugger.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/Debugger.cpp?rev=219546&r1=219545&r2=219546&view=diff
> >
> ==============================================================================
> > --- lldb/trunk/source/Core/Debugger.cpp (original)
> > +++ lldb/trunk/source/Core/Debugger.cpp Fri Oct 10 18:43:03 2014
> > @@ -3234,6 +3234,7 @@ Debugger::HandleProcessEvent (const Even
> >                                          case eStopReasonException:
> >                                          case eStopReasonExec:
> >                                          case eStopReasonThreadExiting:
> > +                                        case eStopReasonInstrumentation:
> >                                              if (!other_thread)
> >                                                  other_thread = thread;
> >                                              break;
> >
> > Modified: lldb/trunk/source/Core/PluginManager.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/PluginManager.cpp?rev=219546&r1=219545&r2=219546&view=diff
> >
> ==============================================================================
> > --- lldb/trunk/source/Core/PluginManager.cpp (original)
> > +++ lldb/trunk/source/Core/PluginManager.cpp Fri Oct 10 18:43:03 2014
> > @@ -2172,6 +2172,125 @@ PluginManager::GetMemoryHistoryCreateCal
> >      return NULL;
> >  }
> >
> > +#pragma mark InstrumentationRuntime
> > +
> > +struct InstrumentationRuntimeInstance
> > +{
> > +    InstrumentationRuntimeInstance() :
> > +    name(),
> > +    description(),
> > +    create_callback(NULL)
> > +    {
> > +    }
> > +
> > +    ConstString name;
> > +    std::string description;
> > +    InstrumentationRuntimeCreateInstance create_callback;
> > +    InstrumentationRuntimeGetType get_type_callback;
> > +};
> > +
> > +typedef std::vector<InstrumentationRuntimeInstance>
> InstrumentationRuntimeInstances;
> > +
> > +static Mutex &
> > +GetInstrumentationRuntimeMutex ()
> > +{
> > +    static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
> > +    return g_instances_mutex;
> > +}
> > +
> > +static InstrumentationRuntimeInstances &
> > +GetInstrumentationRuntimeInstances ()
> > +{
> > +    static InstrumentationRuntimeInstances g_instances;
> > +    return g_instances;
> > +}
> > +
> > +bool
> > +PluginManager::RegisterPlugin
> > +(
> > + const ConstString &name,
> > + const char *description,
> > + InstrumentationRuntimeCreateInstance create_callback,
> > + InstrumentationRuntimeGetType get_type_callback
> > + )
> > +{
> > +    if (create_callback)
> > +    {
> > +        InstrumentationRuntimeInstance instance;
> > +        assert ((bool)name);
> > +        instance.name = name;
> > +        if (description && description[0])
> > +            instance.description = description;
> > +        instance.create_callback = create_callback;
> > +        instance.get_type_callback = get_type_callback;
> > +        Mutex::Locker locker (GetInstrumentationRuntimeMutex ());
> > +        GetInstrumentationRuntimeInstances ().push_back (instance);
> > +    }
> > +    return false;
> > +}
> > +
> > +bool
> > +PluginManager::UnregisterPlugin (InstrumentationRuntimeCreateInstance
> create_callback)
> > +{
> > +    if (create_callback)
> > +    {
> > +        Mutex::Locker locker (GetInstrumentationRuntimeMutex ());
> > +        InstrumentationRuntimeInstances &instances =
> GetInstrumentationRuntimeInstances ();
> > +
> > +        InstrumentationRuntimeInstances::iterator pos, end =
> instances.end();
> > +        for (pos = instances.begin(); pos != end; ++ pos)
> > +        {
> > +            if (pos->create_callback == create_callback)
> > +            {
> > +                instances.erase(pos);
> > +                return true;
> > +            }
> > +        }
> > +    }
> > +    return false;
> > +}
> > +
> > +InstrumentationRuntimeGetType
> > +PluginManager::GetInstrumentationRuntimeGetTypeCallbackAtIndex
> (uint32_t idx)
> > +{
> > +    Mutex::Locker locker (GetInstrumentationRuntimeMutex ());
> > +    InstrumentationRuntimeInstances &instances =
> GetInstrumentationRuntimeInstances ();
> > +    if (idx < instances.size())
> > +        return instances[idx].get_type_callback;
> > +    return NULL;
> > +}
> > +
> > +InstrumentationRuntimeCreateInstance
> > +PluginManager::GetInstrumentationRuntimeCreateCallbackAtIndex (uint32_t
> idx)
> > +{
> > +    Mutex::Locker locker (GetInstrumentationRuntimeMutex ());
> > +    InstrumentationRuntimeInstances &instances =
> GetInstrumentationRuntimeInstances ();
> > +    if (idx < instances.size())
> > +        return instances[idx].create_callback;
> > +    return NULL;
> > +}
> > +
> > +
> > +InstrumentationRuntimeCreateInstance
> > +PluginManager::GetInstrumentationRuntimeCreateCallbackForPluginName
> (const ConstString &name)
> > +{
> > +    if (name)
> > +    {
> > +        Mutex::Locker locker (GetInstrumentationRuntimeMutex ());
> > +        InstrumentationRuntimeInstances &instances =
> GetInstrumentationRuntimeInstances ();
> > +
> > +        InstrumentationRuntimeInstances::iterator pos, end =
> instances.end();
> > +        for (pos = instances.begin(); pos != end; ++ pos)
> > +        {
> > +            if (name == pos->name)
> > +                return pos->create_callback;
> > +        }
> > +    }
> > +    return NULL;
> > +}
> > +
> > +#pragma mark PluginManager
> > +
> >  void
> >  PluginManager::DebuggerInitialize (Debugger &debugger)
> >  {
> >
> > Added:
> lldb/trunk/source/Plugins/InstrumentationRuntime/AddressSanitizer/AddressSanitizerRuntime.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/InstrumentationRuntime/AddressSanitizer/AddressSanitizerRuntime.cpp?rev=219546&view=auto
> >
> ==============================================================================
> > ---
> lldb/trunk/source/Plugins/InstrumentationRuntime/AddressSanitizer/AddressSanitizerRuntime.cpp
> (added)
> > +++
> lldb/trunk/source/Plugins/InstrumentationRuntime/AddressSanitizer/AddressSanitizerRuntime.cpp
> Fri Oct 10 18:43:03 2014
> > @@ -0,0 +1,300 @@
> > +//===-- AddressSanitizerRuntime.cpp -----------------------------*- C++
> -*-===//
> > +//
> > +//                     The LLVM Compiler Infrastructure
> > +//
> > +// This file is distributed under the University of Illinois Open Source
> > +// License. See LICENSE.TXT for details.
> > +//
> >
> +//===----------------------------------------------------------------------===//
> > +
> > +#include "AddressSanitizerRuntime.h"
> > +
> > +#include "lldb/Core/PluginInterface.h"
> > +#include "lldb/Core/PluginManager.h"
> > +#include "lldb/Core/ModuleList.h"
> > +#include "lldb/Symbol/SymbolContext.h"
> > +#include "lldb/Core/Module.h"
> > +#include "lldb/Target/Target.h"
> > +#include "lldb/Target/Thread.h"
> > +#include "lldb/Target/StopInfo.h"
> > +#include "lldb/Symbol/Symbol.h"
> > +#include "lldb/Breakpoint/StoppointCallbackContext.h"
> > +#include "lldb/Core/ValueObject.h"
> > +#include "lldb/Target/InstrumentationRuntimeStopInfo.h"
> > +#include "lldb/Core/Debugger.h"
> > +#include "lldb/Core/Stream.h"
> > +#include "lldb/Core/StreamFile.h"
> > +
> > +using namespace lldb;
> > +using namespace lldb_private;
> > +
> > +lldb::InstrumentationRuntimeSP
> > +AddressSanitizerRuntime::CreateInstance (const lldb::ProcessSP
> &process_sp)
> > +{
> > +    return InstrumentationRuntimeSP(new
> AddressSanitizerRuntime(process_sp));
> > +}
> > +
> > +void
> > +AddressSanitizerRuntime::Initialize()
> > +{
> > +    PluginManager::RegisterPlugin (GetPluginNameStatic(),
> > +                                   "AddressSanitizer instrumentation
> runtime plugin.",
> > +                                   CreateInstance,
> > +                                   GetTypeStatic);
> > +}
> > +
> > +void
> > +AddressSanitizerRuntime::Terminate()
> > +{
> > +    PluginManager::UnregisterPlugin (CreateInstance);
> > +}
> > +
> > +lldb_private::ConstString
> > +AddressSanitizerRuntime::GetPluginNameStatic()
> > +{
> > +    return ConstString("AddressSanitizer");
> > +}
> > +
> > +lldb::InstrumentationRuntimeType
> > +AddressSanitizerRuntime::GetTypeStatic()
> > +{
> > +    return eInstrumentationRuntimeTypeAddressSanitizer;
> > +}
> > +
> > +AddressSanitizerRuntime::AddressSanitizerRuntime(const ProcessSP
> &process_sp) :
> > +    m_is_active(false),
> > +    m_runtime_module(),
> > +    m_process(process_sp),
> > +    m_breakpoint_id(0)
> > +{
> > +}
> > +
> > +AddressSanitizerRuntime::~AddressSanitizerRuntime()
> > +{
> > +    Deactivate();
> > +}
> > +
> > +bool ModuleContainsASanRuntime(Module * module)
> > +{
> > +    SymbolContextList sc_list;
> > +    const bool include_symbols = true;
> > +    const bool append = true;
> > +    const bool include_inlines = true;
> > +
> > +    size_t num_matches =
> module->FindFunctions(ConstString("__asan_get_alloc_stack"), NULL,
> eFunctionNameTypeAuto, include_symbols, include_inlines, append, sc_list);
> > +
> > +    return num_matches > 0;
> > +}
> > +
> > +void
> > +AddressSanitizerRuntime::ModulesDidLoad(lldb_private::ModuleList
> &module_list)
> > +{
> > +    if (IsActive())
> > +        return;
> > +
> > +    if (m_runtime_module) {
> > +        Activate();
> > +        return;
> > +    }
> > +
> > +    Mutex::Locker modules_locker(module_list.GetMutex());
> > +    const size_t num_modules = module_list.GetSize();
> > +    for (size_t i = 0; i < num_modules; ++i)
> > +    {
> > +        Module *module_pointer =
> module_list.GetModulePointerAtIndexUnlocked(i);
> > +        const FileSpec & file_spec = module_pointer->GetFileSpec();
> > +        if (! file_spec)
> > +            continue;
> > +
> > +        static RegularExpression
> g_asan_runtime_regex("libclang_rt.asan_(.*)_dynamic\\.dylib");
> > +        if (g_asan_runtime_regex.Execute
> (file_spec.GetFilename().GetCString()) || module_pointer->IsExecutable())
> > +        {
> > +            if (ModuleContainsASanRuntime(module_pointer))
> > +            {
> > +                m_runtime_module = module_pointer->shared_from_this();
> > +                Activate();
> > +                return;
> > +            }
> > +        }
> > +    }
> > +}
> > +
> > +bool
> > +AddressSanitizerRuntime::IsActive()
> > +{
> > +    return m_is_active;
> > +}
> > +
> > +#define RETRIEVE_REPORT_DATA_FUNCTION_TIMEOUT_USEC 2*1000*1000
> > +
> > +const char *
> > +address_sanitizer_retrieve_report_data_command = R"(
> > +    struct {
> > +        int present;
> > +        void *pc, *bp, *sp, *address;
> > +        int access_type;
> > +        size_t access_size;
> > +        const char *description;
> > +    } t;
> > +
> > +    t.present = ((int (*) ())__asan_report_present)();
> > +    t.pc = ((void * (*) ())__asan_get_report_pc)();
> > +    /* commented out because rdar://problem/18533301
> > +    t.bp = ((void * (*) ())__asan_get_report_bp)();
> > +    t.sp = ((void * (*) ())__asan_get_report_sp)();
> > +    */
> > +    t.address = ((void * (*) ())__asan_get_report_address)();
> > +    t.description = ((const char * (*)
> ())__asan_get_report_description)();
> > +    t.access_type = ((int (*) ())__asan_get_report_access_type)();
> > +    t.access_size = ((size_t (*) ())__asan_get_report_access_size)();
> > +
> > +    t;
> > +)";
> > +
> > +StructuredData::ObjectSP
> > +AddressSanitizerRuntime::RetrieveReportData()
> > +{
> > +    ThreadSP thread_sp = m_process->GetThreadList().GetSelectedThread();
> > +    StackFrameSP frame_sp = thread_sp->GetSelectedFrame();
> > +
> > +    if (!frame_sp)
> > +        return StructuredData::ObjectSP();
> > +
> > +    EvaluateExpressionOptions options;
> > +    options.SetUnwindOnError(true);
> > +    options.SetTryAllThreads(true);
> > +    options.SetStopOthers(true);
> > +    options.SetIgnoreBreakpoints(true);
> > +    options.SetTimeoutUsec(RETRIEVE_REPORT_DATA_FUNCTION_TIMEOUT_USEC);
> > +
> > +    ValueObjectSP return_value_sp;
> > +    if
> (m_process->GetTarget().EvaluateExpression(address_sanitizer_retrieve_report_data_command,
> frame_sp.get(), return_value_sp, options) != eExpressionCompleted)
> > +        return StructuredData::ObjectSP();
> > +
> > +    int present =
> return_value_sp->GetValueForExpressionPath(".present")->GetValueAsUnsigned(0);
> > +    if (present != 1)
> > +        return StructuredData::ObjectSP();
> > +
> > +    addr_t pc =
> return_value_sp->GetValueForExpressionPath(".pc")->GetValueAsUnsigned(0);
> > +    addr_t bp =
> return_value_sp->GetValueForExpressionPath(".bp")->GetValueAsUnsigned(0);
> > +    addr_t sp =
> return_value_sp->GetValueForExpressionPath(".sp")->GetValueAsUnsigned(0);
> > +    addr_t address =
> return_value_sp->GetValueForExpressionPath(".address")->GetValueAsUnsigned(0);
> > +    addr_t access_type =
> return_value_sp->GetValueForExpressionPath(".access_type")->GetValueAsUnsigned(0);
> > +    addr_t access_size =
> return_value_sp->GetValueForExpressionPath(".access_size")->GetValueAsUnsigned(0);
> > +    addr_t description_ptr =
> return_value_sp->GetValueForExpressionPath(".description")->GetValueAsUnsigned(0);
> > +    std::string description;
> > +    Error error;
> > +    m_process->ReadCStringFromMemory(description_ptr, description,
> error);
> > +
> > +    StructuredData::Dictionary *dict = new StructuredData::Dictionary();
> > +    dict->AddStringItem("instrumentation_class", "AddressSanitizer");
> > +    dict->AddStringItem("stop_type", "fatal_error");
> > +    dict->AddIntegerItem("pc", pc);
> > +    dict->AddIntegerItem("bp", bp);
> > +    dict->AddIntegerItem("sp", sp);
> > +    dict->AddIntegerItem("address", address);
> > +    dict->AddIntegerItem("access_type", access_type);
> > +    dict->AddIntegerItem("access_size", access_size);
> > +    dict->AddStringItem("description", description);
> > +
> > +    return StructuredData::ObjectSP(dict);
> > +}
> > +
> > +std::string
> > +AddressSanitizerRuntime::FormatDescription(StructuredData::ObjectSP
> report)
> > +{
> > +    std::string description =
> report->GetAsDictionary()->GetValueForKey("description")->GetAsString()->GetValue();
> > +    if (description == "heap-use-after-free") {
> > +        return "Use of deallocated memory detected";
> > +    } else if (description == "heap-buffer-overflow") {
> > +        return "Heap buffer overflow detected";
> > +    } else if (description == "stack-buffer-underflow") {
> > +        return "Stack buffer underflow detected";
> > +    } else if (description == "initialization-order-fiasco") {
> > +        return "Initialization order problem detected";
> > +    } else if (description == "stack-buffer-overflow") {
> > +        return "Stack buffer overflow detected";
> > +    } else if (description == "stack-use-after-return") {
> > +        return "Use of returned stack memory detected";
> > +    } else if (description == "use-after-poison") {
> > +        return "Use of poisoned memory detected";
> > +    } else if (description == "container-overflow") {
> > +        return "Container overflow detected";
> > +    } else if (description == "stack-use-after-scope") {
> > +        return "Use of out-of-scope stack memory detected";
> > +    } else if (description == "global-buffer-overflow") {
> > +        return "Global buffer overflow detected";
> > +    } else if (description == "unknown-crash") {
> > +        return "Invalid memory access detected";
> > +    }
> > +
> > +    // for unknown report codes just show the code
> > +    return description;
> > +}
> > +
> > +bool
> > +AddressSanitizerRuntime::NotifyBreakpointHit(void *baton,
> StoppointCallbackContext *context, user_id_t break_id, user_id_t
> break_loc_id)
> > +{
> > +    assert (baton && "null baton");
> > +    if (!baton)
> > +        return false;
> > +
> > +    AddressSanitizerRuntime *const instance =
> static_cast<AddressSanitizerRuntime*>(baton);
> > +
> > +    StructuredData::ObjectSP report = instance->RetrieveReportData();
> > +    std::string description;
> > +    if (report) {
> > +        description = instance->FormatDescription(report);
> > +    }
> > +    ThreadSP thread = context->exe_ctx_ref.GetThreadSP();
> > +
> thread->SetStopInfo(InstrumentationRuntimeStopInfo::CreateStopReasonWithInstrumentationData(*thread,
> description.c_str(), report));
> > +
> > +    instance->m_runtime_module->ReportWarning("AddressSanitizer report
> breakpoint hit. Use 'thread info -s' to get extended information about the
> report.\n");
> > +
> > +    // Return true to stop the target, false to just let the target run.
> > +    return true;
> > +}
> > +
> > +void
> > +AddressSanitizerRuntime::Activate()
> > +{
> > +    if (m_is_active)
> > +        return;
> > +
> > +    ConstString symbol_name ("__asan::AsanDie()");
> > +    const Symbol *symbol =
> m_runtime_module->FindFirstSymbolWithNameAndType (symbol_name,
> eSymbolTypeCode);
> > +
> > +    if (symbol == NULL)
> > +        return;
> > +
> > +    if (!symbol->GetAddress().IsValid())
> > +        return;
> > +
> > +    Target &target = m_process->GetTarget();
> > +    addr_t symbol_address =
> symbol->GetAddress().GetOpcodeLoadAddress(&target);
> > +
> > +    if (symbol_address == LLDB_INVALID_ADDRESS)
> > +        return;
> > +
> > +    bool internal = true;
> > +    bool hardware = false;
> > +    Breakpoint *breakpoint =
> m_process->GetTarget().CreateBreakpoint(symbol_address, internal,
> hardware).get();
> > +    breakpoint->SetCallback
> (AddressSanitizerRuntime::NotifyBreakpointHit, this, true);
> > +    breakpoint->SetBreakpointKind ("address-sanitizer-report");
> > +    m_breakpoint_id = breakpoint->GetID();
> > +
> > +    m_runtime_module->ReportWarning("AddressSanitizer debugger support
> is active. Memory error breakpoint has been installed and you can now use
> the 'memory history' command.\n");
> > +
> > +    m_is_active = true;
> > +}
> > +
> > +void
> > +AddressSanitizerRuntime::Deactivate()
> > +{
> > +    if (m_breakpoint_id != LLDB_INVALID_BREAK_ID)
> > +    {
> > +        m_process->GetTarget().RemoveBreakpointByID(m_breakpoint_id);
> > +        m_breakpoint_id = LLDB_INVALID_BREAK_ID;
> > +    }
> > +    m_is_active = false;
> > +}
> >
> > Added:
> lldb/trunk/source/Plugins/InstrumentationRuntime/AddressSanitizer/AddressSanitizerRuntime.h
> > URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/InstrumentationRuntime/AddressSanitizer/AddressSanitizerRuntime.h?rev=219546&view=auto
> >
> ==============================================================================
> > ---
> lldb/trunk/source/Plugins/InstrumentationRuntime/AddressSanitizer/AddressSanitizerRuntime.h
> (added)
> > +++
> lldb/trunk/source/Plugins/InstrumentationRuntime/AddressSanitizer/AddressSanitizerRuntime.h
> Fri Oct 10 18:43:03 2014
> > @@ -0,0 +1,86 @@
> > +//===-- AddressSanitizerRuntime.h -------------------------------*- C++
> -*-===//
> > +//
> > +//                     The LLVM Compiler Infrastructure
> > +//
> > +// This file is distributed under the University of Illinois Open Source
> > +// License. See LICENSE.TXT for details.
> > +//
> >
> +//===----------------------------------------------------------------------===//
> > +
> > +#ifndef liblldb_AddressSanitizerRuntime_h_
> > +#define liblldb_AddressSanitizerRuntime_h_
> > +
> > +#include "lldb/lldb-private.h"
> > +#include "lldb/Target/ABI.h"
> > +#include "lldb/Target/InstrumentationRuntime.h"
> > +#include "lldb/Target/Process.h"
> > +#include "lldb/Core/StructuredData.h"
> > +
> > +namespace lldb_private {
> > +
> > +class AddressSanitizerRuntime : public
> lldb_private::InstrumentationRuntime
> > +{
> > +public:
> > +
> > +    static lldb::InstrumentationRuntimeSP
> > +    CreateInstance (const lldb::ProcessSP &process_sp);
> > +
> > +    static void
> > +    Initialize();
> > +
> > +    static void
> > +    Terminate();
> > +
> > +    static lldb_private::ConstString
> > +    GetPluginNameStatic();
> > +
> > +    static lldb::InstrumentationRuntimeType
> > +    GetTypeStatic();
> > +
> > +    virtual
> > +    ~AddressSanitizerRuntime();
> > +
> > +    virtual lldb_private::ConstString
> > +    GetPluginName() { return GetPluginNameStatic(); }
> > +
> > +    virtual lldb::InstrumentationRuntimeType
> > +    GetType() { return GetTypeStatic(); }
> > +
> > +    virtual uint32_t
> > +    GetPluginVersion() { return 1; }
> > +
> > +    virtual void
> > +    ModulesDidLoad(lldb_private::ModuleList &module_list);
> > +
> > +    virtual bool
> > +    IsActive();
> > +
> > +private:
> > +
> > +    AddressSanitizerRuntime(const lldb::ProcessSP &process_sp);
> > +
> > +    void
> > +    Activate();
> > +
> > +    void
> > +    Deactivate();
> > +
> > +    static bool
> > +    NotifyBreakpointHit(void *baton, StoppointCallbackContext *context,
> lldb::user_id_t break_id, lldb::user_id_t break_loc_id);
> > +
> > +    StructuredData::ObjectSP
> > +    RetrieveReportData();
> > +
> > +    std::string
> > +    FormatDescription(StructuredData::ObjectSP report);
> > +
> > +    bool m_is_active;
> > +    lldb::ModuleSP m_runtime_module;
> > +    lldb::ProcessSP m_process;
> > +    lldb::user_id_t m_breakpoint_id;
> > +
> > +};
> > +
> > +} // namespace lldb_private
> > +
> > +#endif  // liblldb_InstrumentationRuntime_h_
> >
> > Added:
> lldb/trunk/source/Plugins/InstrumentationRuntime/AddressSanitizer/CMakeLists.txt
> > URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/InstrumentationRuntime/AddressSanitizer/CMakeLists.txt?rev=219546&view=auto
> >
> ==============================================================================
> > ---
> lldb/trunk/source/Plugins/InstrumentationRuntime/AddressSanitizer/CMakeLists.txt
> (added)
> > +++
> lldb/trunk/source/Plugins/InstrumentationRuntime/AddressSanitizer/CMakeLists.txt
> Fri Oct 10 18:43:03 2014
> > @@ -0,0 +1,5 @@
> > +set(LLVM_NO_RTTI 1)
> > +
> > +add_lldb_library(lldbPluginInstrumentationRuntimeAddressSanitizer
> > +  AddressSanitizerRuntime.cpp
> > +  )
> >
> > Added:
> lldb/trunk/source/Plugins/InstrumentationRuntime/AddressSanitizer/Makefile
> > URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/InstrumentationRuntime/AddressSanitizer/Makefile?rev=219546&view=auto
> >
> ==============================================================================
> > ---
> lldb/trunk/source/Plugins/InstrumentationRuntime/AddressSanitizer/Makefile
> (added)
> > +++
> lldb/trunk/source/Plugins/InstrumentationRuntime/AddressSanitizer/Makefile
> Fri Oct 10 18:43:03 2014
> > @@ -0,0 +1,14 @@
> > +##===- source/Plugins/InstrumentationRuntime/AddressSanitizer  Makefile
> -*-===##
> > +#
> > +#                     The LLVM Compiler Infrastructure
> > +#
> > +# This file is distributed under the University of Illinois Open Source
> > +# License. See LICENSE.TXT for details.
> > +#
> >
> +##===----------------------------------------------------------------------===##
> > +
> > +LLDB_LEVEL := ../../../..
> > +LIBRARYNAME := lldbPluginInstrumentationRuntimeAddressSanitizer
> > +BUILD_ARCHIVE = 1
> > +
> > +include $(LLDB_LEVEL)/Makefile
> >
> > Added: lldb/trunk/source/Plugins/InstrumentationRuntime/CMakeLists.txt
> > URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/InstrumentationRuntime/CMakeLists.txt?rev=219546&view=auto
> >
> ==============================================================================
> > --- lldb/trunk/source/Plugins/InstrumentationRuntime/CMakeLists.txt
> (added)
> > +++ lldb/trunk/source/Plugins/InstrumentationRuntime/CMakeLists.txt Fri
> Oct 10 18:43:03 2014
> > @@ -0,0 +1 @@
> > +add_subdirectory(AddressSanitizer)
> >
> > Modified: lldb/trunk/source/Target/CMakeLists.txt
> > URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/CMakeLists.txt?rev=219546&r1=219545&r2=219546&view=diff
> >
> ==============================================================================
> > --- lldb/trunk/source/Target/CMakeLists.txt (original)
> > +++ lldb/trunk/source/Target/CMakeLists.txt Fri Oct 10 18:43:03 2014
> > @@ -9,6 +9,8 @@ add_lldb_library(lldbTarget
> >    FileAction.cpp
> >    JITLoader.cpp
> >    JITLoaderList.cpp
> > +  InstrumentationRuntime.cpp
> > +  InstrumentationRuntimeStopInfo.cpp
> >    LanguageRuntime.cpp
> >    Memory.cpp
> >    MemoryHistory.cpp
> >
> > Added: lldb/trunk/source/Target/InstrumentationRuntime.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/InstrumentationRuntime.cpp?rev=219546&view=auto
> >
> ==============================================================================
> > --- lldb/trunk/source/Target/InstrumentationRuntime.cpp (added)
> > +++ lldb/trunk/source/Target/InstrumentationRuntime.cpp Fri Oct 10
> 18:43:03 2014
> > @@ -0,0 +1,48 @@
> > +//===-- InstrumentationRuntime.cpp ------------------------------*- C++
> -*-===//
> > +//
> > +//                     The LLVM Compiler Infrastructure
> > +//
> > +// This file is distributed under the University of Illinois Open Source
> > +// License. See LICENSE.TXT for details.
> > +//
> >
> +//===----------------------------------------------------------------------===//
> > +
> > +#include "lldb/lldb-private.h"
> > +#include "lldb/Target/Process.h"
> > +#include "lldb/Core/PluginManager.h"
> > +#include "lldb/Target/InstrumentationRuntime.h"
> > +
> > +using namespace lldb;
> > +using namespace lldb_private;
> > +
> > +void
> > +InstrumentationRuntime::ModulesDidLoad(lldb_private::ModuleList
> &module_list, lldb_private::Process *process,
> InstrumentationRuntimeCollection &runtimes)
> > +{
> > +    InstrumentationRuntimeCreateInstance create_callback = NULL;
> > +    InstrumentationRuntimeGetType get_type_callback;
> > +    for (uint32_t idx = 0; ; ++idx)
> > +    {
> > +        create_callback =
> PluginManager::GetInstrumentationRuntimeCreateCallbackAtIndex(idx);
> > +        if (create_callback == NULL)
> > +            break;
> > +        get_type_callback =
> PluginManager::GetInstrumentationRuntimeGetTypeCallbackAtIndex(idx);
> > +        InstrumentationRuntimeType type = get_type_callback();
> > +
> > +        InstrumentationRuntimeCollection::iterator pos;
> > +        pos = runtimes.find (type);
> > +        if (pos == runtimes.end()) {
> > +            runtimes[type] =
> create_callback(process->shared_from_this());
> > +        }
> > +    }
> > +}
> > +
> > +void
> > +InstrumentationRuntime::ModulesDidLoad(lldb_private::ModuleList
> &module_list)
> > +{
> > +}
> > +
> > +bool
> > +InstrumentationRuntime::IsActive()
> > +{
> > +    return false;
> > +}
> >
> > Added: lldb/trunk/source/Target/InstrumentationRuntimeStopInfo.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/InstrumentationRuntimeStopInfo.cpp?rev=219546&view=auto
> >
> ==============================================================================
> > --- lldb/trunk/source/Target/InstrumentationRuntimeStopInfo.cpp (added)
> > +++ lldb/trunk/source/Target/InstrumentationRuntimeStopInfo.cpp Fri Oct
> 10 18:43:03 2014
> > @@ -0,0 +1,36 @@
> > +//===-- InstrumentationRuntimeStopInfo.cpp ----------------------*- C++
> -*-===//
> > +//
> > +//                     The LLVM Compiler Infrastructure
> > +//
> > +// This file is distributed under the University of Illinois Open Source
> > +// License. See LICENSE.TXT for details.
> > +//
> >
> +//===----------------------------------------------------------------------===//
> > +
> > +#include "lldb/Target/InstrumentationRuntimeStopInfo.h"
> > +
> > +#include "lldb/lldb-private.h"
> > +#include "lldb/Target/Process.h"
> > +#include "lldb/Target/InstrumentationRuntime.h"
> > +
> > +using namespace lldb;
> > +using namespace lldb_private;
> > +
> > +InstrumentationRuntimeStopInfo::InstrumentationRuntimeStopInfo(Thread
> &thread, std::string description, StructuredData::ObjectSP additional_data)
> :
> > +    StopInfo(thread, 0)
> > +{
> > +    m_extended_info = additional_data;
> > +    m_description = description;
> > +}
> > +
> > +const char *
> > +InstrumentationRuntimeStopInfo::GetDescription ()
> > +{
> > +    return m_description.c_str();
> > +}
> > +
> > +StopInfoSP
> > +InstrumentationRuntimeStopInfo::CreateStopReasonWithInstrumentationData
> (Thread &thread, std::string description, StructuredData::ObjectSP
> additionalData)
> > +{
> > +    return StopInfoSP(new InstrumentationRuntimeStopInfo(thread,
> description, additionalData));
> > +}
> >
> > Modified: lldb/trunk/source/Target/Process.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/Process.cpp?rev=219546&r1=219545&r2=219546&view=diff
> >
> ==============================================================================
> > --- lldb/trunk/source/Target/Process.cpp (original)
> > +++ lldb/trunk/source/Target/Process.cpp Fri Oct 10 18:43:03 2014
> > @@ -48,6 +48,7 @@
> >  #include "lldb/Target/Thread.h"
> >  #include "lldb/Target/ThreadPlan.h"
> >  #include "lldb/Target/ThreadPlanBase.h"
> > +#include "lldb/Target/InstrumentationRuntime.h"
> >  #include "Plugins/Process/Utility/InferiorCallPOSIX.h"
> >
> >  using namespace lldb;
> > @@ -843,6 +844,7 @@ Process::Finalize()
> >      m_memory_cache.Clear();
> >      m_allocated_memory_cache.Clear();
> >      m_language_runtimes.clear();
> > +    m_instrumentation_runtimes.clear();
> >      m_next_event_action_ap.reset();
> >  //#ifdef LLDB_CONFIGURATION_DEBUG
> >  //    StreamFile s(stdout, false);
> > @@ -5983,6 +5985,7 @@ Process::DidExec ()
> >      m_image_tokens.clear();
> >      m_allocated_memory_cache.Clear();
> >      m_language_runtimes.clear();
> > +    m_instrumentation_runtimes.clear();
> >      m_thread_list.DiscardThreadPlans();
> >      m_memory_cache.Clear(true);
> >      DoDidExec();
> > @@ -6033,13 +6036,24 @@ Process::ResolveIndirectFunction(const A
> >  void
> >  Process::ModulesDidLoad (ModuleList &module_list)
> >  {
> > -  SystemRuntime *sys_runtime = GetSystemRuntime();
> > -  if (sys_runtime)
> > -  {
> > -    sys_runtime->ModulesDidLoad (module_list);
> > -  }
> > +    SystemRuntime *sys_runtime = GetSystemRuntime();
> > +    if (sys_runtime)
> > +    {
> > +        sys_runtime->ModulesDidLoad (module_list);
> > +    }
> > +
> > +    GetJITLoaders().ModulesDidLoad (module_list);
> > +
> > +    // Give runtimes a chance to be created.
> > +    InstrumentationRuntime::ModulesDidLoad(module_list, this,
> m_instrumentation_runtimes);
> > +
> > +    // Tell runtimes about new modules.
> > +    for (auto pos = m_instrumentation_runtimes.begin(); pos !=
> m_instrumentation_runtimes.end(); ++pos)
> > +    {
> > +        InstrumentationRuntimeSP runtime = pos->second;
> > +        runtime->ModulesDidLoad(module_list);
> > +    }
> >
> > -  GetJITLoaders().ModulesDidLoad (module_list);
> >  }
> >
> >  ThreadCollectionSP
> >
> > Modified: lldb/trunk/source/Target/StopInfo.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/StopInfo.cpp?rev=219546&r1=219545&r2=219546&view=diff
> >
> ==============================================================================
> > --- lldb/trunk/source/Target/StopInfo.cpp (original)
> > +++ lldb/trunk/source/Target/StopInfo.cpp Fri Oct 10 18:43:03 2014
> > @@ -40,7 +40,8 @@ StopInfo::StopInfo (Thread &thread, uint
> >      m_resume_id (thread.GetProcess()->GetResumeID()),
> >      m_value (value),
> >      m_override_should_notify (eLazyBoolCalculate),
> > -    m_override_should_stop (eLazyBoolCalculate)
> > +    m_override_should_stop (eLazyBoolCalculate),
> > +    m_extended_info()
> >  {
> >  }
> >
> >
> > Modified: lldb/trunk/source/Target/Thread.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/Thread.cpp?rev=219546&r1=219545&r2=219546&view=diff
> >
> ==============================================================================
> > --- lldb/trunk/source/Target/Thread.cpp (original)
> > +++ lldb/trunk/source/Target/Thread.cpp Fri Oct 10 18:43:03 2014
> > @@ -2086,6 +2086,7 @@ Thread::StopReasonAsCString (lldb::StopR
> >      case eStopReasonExec:          return "exec";
> >      case eStopReasonPlanComplete:  return "plan complete";
> >      case eStopReasonThreadExiting: return "thread exiting";
> > +    case eStopReasonInstrumentation: return "instrumentation break";
> >      }
> >
> >
> > @@ -2165,17 +2166,28 @@ Thread::GetStatus (Stream &strm, uint32_
> >  }
> >
> >  bool
> > -Thread::GetDescription (Stream &strm, lldb::DescriptionLevel level,
> bool print_json)
> > +Thread::GetDescription (Stream &strm, lldb::DescriptionLevel level,
> bool print_json_thread, bool print_json_stopinfo)
> >  {
> >      DumpUsingSettingsFormat (strm, 0);
> >      strm.Printf("\n");
> >
> >      StructuredData::ObjectSP thread_info = GetExtendedInfo();
> > -
> > -    if (thread_info && print_json)
> > +    StructuredData::ObjectSP stop_info =
> m_stop_info_sp->GetExtendedInfo();
> > +
> > +    if (print_json_thread || print_json_stopinfo)
> >      {
> > -        thread_info->Dump (strm);
> > -        strm.Printf("\n");
> > +        if (thread_info && print_json_thread)
> > +        {
> > +            thread_info->Dump (strm);
> > +            strm.Printf("\n");
> > +        }
> > +
> > +        if (stop_info && print_json_stopinfo)
> > +        {
> > +            stop_info->Dump (strm);
> > +            strm.Printf("\n");
> > +        }
> > +
> >          return true;
> >      }
> >
> >
> > Modified: lldb/trunk/source/lldb.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/source/lldb.cpp?rev=219546&r1=219545&r2=219546&view=diff
> >
> ==============================================================================
> > --- lldb/trunk/source/lldb.cpp (original)
> > +++ lldb/trunk/source/lldb.cpp Fri Oct 10 18:43:03 2014
> > @@ -93,6 +93,7 @@
> >  #include "Plugins/Process/gdb-remote/ProcessGDBRemote.h"
> >  #include "Plugins/DynamicLoader/Static/DynamicLoaderStatic.h"
> >  #include "Plugins/MemoryHistory/asan/MemoryHistoryASan.h"
> > +#include
> "Plugins/InstrumentationRuntime/AddressSanitizer/AddressSanitizerRuntime.h"
> >
> >  using namespace lldb;
> >  using namespace lldb_private;
> > @@ -156,6 +157,7 @@ lldb_private::Initialize ()
> >          JITLoaderGDB::Initialize();
> >          ProcessElfCore::Initialize();
> >          MemoryHistoryASan::Initialize();
> > +        AddressSanitizerRuntime::Initialize();
> >
> >  #if defined (__APPLE__)
> >
> //----------------------------------------------------------------------
> > @@ -247,6 +249,7 @@ lldb_private::Terminate ()
> >      JITLoaderGDB::Terminate();
> >      ProcessElfCore::Terminate();
> >      MemoryHistoryASan::Terminate();
> > +    AddressSanitizerRuntime::Terminate();
> >
> >  #if defined (__APPLE__)
> >      DynamicLoaderMacOSXDYLD::Terminate();
> >
> > Removed: lldb/trunk/test/functionalities/asan/TestAsan.py
> > URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/asan/TestAsan.py?rev=219545&view=auto
> >
> ==============================================================================
> > --- lldb/trunk/test/functionalities/asan/TestAsan.py (original)
> > +++ lldb/trunk/test/functionalities/asan/TestAsan.py (removed)
> > @@ -1,117 +0,0 @@
> > -"""
> > -Test that ASan memory history provider returns correct stack traces
> > -"""
> > -
> > -import os, time
> > -import unittest2
> > -import lldb
> > -from lldbtest import *
> > -import lldbutil
> > -
> > -class AsanTestCase(TestBase):
> > -
> > -    mydir = TestBase.compute_mydir(__file__)
> > -
> > -    # The default compiler ("clang") may not support Address Sanitizer
> or it
> > -    # may not have the debugging API which was recently added, so we're
> calling
> > -    # self.useBuiltClang() to use clang from the llvm-build directory
> instead
> > -
> > -    @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires
> Darwin")
> > -    @skipIfRemote
> > -    @dsym_test
> > -    def test_with_dsym (self):
> > -        compiler = self.findBuiltClang ()
> > -        self.buildDsym (None, compiler)
> > -        self.asan_tests ()
> > -
> > -    @skipIfFreeBSD # llvm.org/pr21136 runtimes not yet available by
> default
> > -    @skipIfRemote
> > -    @dwarf_test
> > -    def test_with_dwarf (self):
> > -        compiler = self.findBuiltClang ()
> > -        self.buildDwarf (None, compiler)
> > -        self.asan_tests ()
> > -
> > -    def setUp(self):
> > -        # Call super's setUp().
> > -        TestBase.setUp(self)
> > -        self.line_malloc = line_number('main.c', '// malloc line')
> > -        self.line_malloc2 = line_number('main.c', '// malloc2 line')
> > -        self.line_free = line_number('main.c', '// free line')
> > -        self.line_breakpoint = line_number('main.c', '// break line')
> > -
> > -    def asan_tests (self):
> > -        exe = os.path.join (os.getcwd(), "a.out")
> > -        self.expect("file " + exe, patterns = [ "Current executable set
> to .*a.out" ])
> > -
> > -        self.runCmd("breakpoint set -f main.c -l %d" %
> self.line_breakpoint)
> > -
> > -        # "memory history" command should not work without a process
> > -        self.expect("memory history 0",
> > -            error = True,
> > -            substrs = ["invalid process"])
> > -
> > -        self.runCmd("run")
> > -
> > -        # ASan will relaunch the process to insert its library.
> > -        self.expect("thread list", "Process should be stopped due to
> exec.",
> > -            substrs = ['stopped', 'stop reason = exec'])
> > -
> > -        self.runCmd("continue")
> > -
> > -        # the stop reason of the thread should be breakpoint.
> > -        self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
> > -            substrs = ['stopped', 'stop reason = breakpoint'])
> > -
> > -        # test that the ASan dylib is present
> > -        self.expect("image lookup -n __asan_describe_address",
> "__asan_describe_address should be present",
> > -            substrs = ['1 match found'])
> > -
> > -        # test the 'memory history' command
> > -        self.expect("memory history 'pointer'",
> > -            substrs = [
> > -                'Memory allocated at', 'a.out`f1', 'main.c:%d' %
> self.line_malloc,
> > -                'Memory deallocated at', 'a.out`f2', 'main.c:%d' %
> self.line_free])
> > -
> > -        # do the same using SB API
> > -        process = self.dbg.GetSelectedTarget().process
> > -        val =
> process.GetSelectedThread().GetSelectedFrame().EvaluateExpression("pointer")
> > -        addr = val.GetValueAsUnsigned()
> > -        threads = process.GetHistoryThreads(addr);
> > -        self.assertEqual(threads.GetSize(), 2)
> > -
> > -        history_thread = threads.GetThreadAtIndex(0)
> > -        self.assertTrue(history_thread.num_frames >= 2)
> > -
> self.assertEqual(history_thread.frames[1].GetLineEntry().GetFileSpec().GetFilename(),
> "main.c")
> > -
> self.assertEqual(history_thread.frames[1].GetLineEntry().GetLine(),
> self.line_malloc)
> > -
> > -        history_thread = threads.GetThreadAtIndex(1)
> > -        self.assertTrue(history_thread.num_frames >= 2)
> > -
> self.assertEqual(history_thread.frames[1].GetLineEntry().GetFileSpec().GetFilename(),
> "main.c")
> > -
> self.assertEqual(history_thread.frames[1].GetLineEntry().GetLine(),
> self.line_free)
> > -
> > -        # let's free the container (SBThreadCollection) and see if the
> SBThreads still live
> > -        threads = None
> > -        self.assertTrue(history_thread.num_frames >= 2)
> > -
> self.assertEqual(history_thread.frames[1].GetLineEntry().GetFileSpec().GetFilename(),
> "main.c")
> > -
> self.assertEqual(history_thread.frames[1].GetLineEntry().GetLine(),
> self.line_free)
> > -
> > -        # now let's break when an ASan report occurs and try the API
> then
> > -        self.runCmd("breakpoint set -n __asan_report_error")
> > -
> > -        self.runCmd("continue")
> > -
> > -        # the stop reason of the thread should be breakpoint.
> > -        self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
> > -            substrs = ['stopped', 'stop reason = breakpoint'])
> > -
> > -        # make sure the 'memory history' command still works even when
> we're generating a report now
> > -        self.expect("memory history 'another_pointer'",
> > -            substrs = [
> > -                'Memory allocated at', 'a.out`f1', 'main.c:%d' %
> self.line_malloc2])
> > -
> > -if __name__ == '__main__':
> > -    import atexit
> > -    lldb.SBDebugger.Initialize()
> > -    atexit.register(lambda: lldb.SBDebugger.Terminate())
> > -    unittest2.main()
> >
> > Added: lldb/trunk/test/functionalities/asan/TestReportData.py
> > URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/asan/TestReportData.py?rev=219546&view=auto
> >
> ==============================================================================
> > --- lldb/trunk/test/functionalities/asan/TestReportData.py (added)
> > +++ lldb/trunk/test/functionalities/asan/TestReportData.py Fri Oct 10
> 18:43:03 2014
> > @@ -0,0 +1,92 @@
> > +"""
> > +Test the AddressSanitizer runtime support for report breakpoint and
> data extraction.
> > +"""
> > +
> > +import os, time
> > +import unittest2
> > +import lldb
> > +from lldbtest import *
> > +import lldbutil
> > +import json
> > +
> > +class AsanTestReportDataCase(TestBase):
> > +
> > +    mydir = TestBase.compute_mydir(__file__)
> > +
> > +    # The default compiler ("clang") may not support Address Sanitizer
> or it
> > +    # may not have the debugging API which was recently added, so we're
> calling
> > +    # self.useBuiltClang() to use clang from the llvm-build directory
> instead
> > +
> > +    @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires
> Darwin")
> > +    @skipIfRemote
> > +    @dsym_test
> > +    def test_with_dsym (self):
> > +        compiler = self.findBuiltClang ()
> > +        self.buildDsym (None, compiler)
> > +        self.asan_tests ()
> > +
> > +    @skipIfRemote
> > +    @dwarf_test
> > +    def test_with_dwarf (self):
> > +        compiler = self.findBuiltClang ()
> > +        self.buildDwarf (None, compiler)
> > +        self.asan_tests ()
> > +
> > +    def setUp(self):
> > +        # Call super's setUp().
> > +        TestBase.setUp(self)
> > +        self.line_malloc = line_number('main.c', '// malloc line')
> > +        self.line_malloc2 = line_number('main.c', '// malloc2 line')
> > +        self.line_free = line_number('main.c', '// free line')
> > +        self.line_breakpoint = line_number('main.c', '// break line')
> > +        self.line_crash = line_number('main.c', '// BOOM line')
> > +
> > +    def asan_tests (self):
> > +        exe = os.path.join (os.getcwd(), "a.out")
> > +        self.expect("file " + exe, patterns = [ "Current executable set
> to .*a.out" ])
> > +        self.runCmd("run")
> > +
> > +        # ASan will relaunch the process to insert its library.
> > +        self.expect("thread list", "Process should be stopped due to
> exec.",
> > +            substrs = ['stopped', 'stop reason = exec'])
> > +
> > +        # no extended info when we have no ASan report
> > +        thread =
> self.dbg.GetSelectedTarget().process.GetSelectedThread()
> > +        s = lldb.SBStream()
> > +        self.assertFalse(thread.GetStopReasonExtendedInfoAsJSON(s))
> > +
> > +        self.runCmd("continue")
> > +
> > +        self.expect("thread list", "Process should be stopped due to
> ASan report",
> > +            substrs = ['stopped', 'stop reason = Use of deallocated
> memory detected'])
> > +
> > +
> self.assertEqual(self.dbg.GetSelectedTarget().process.GetSelectedThread().GetStopReason(),
> lldb.eStopReasonInstrumentation)
> > +
> > +        self.expect("bt", "The backtrace should show the crashing line",
> > +            substrs = ['main.c:%d' % self.line_crash])
> > +
> > +        self.expect("thread info -s", "The extended stop info should
> contain the ASan provided fields",
> > +            substrs = ["access_size", "access_type", "address", "pc",
> "description", "heap-use-after-free"])
> > +
> > +        output_lines = self.res.GetOutput().split('\n')
> > +        json_line = output_lines[2]
> > +        data = json.loads(json_line)
> > +        self.assertEqual(data["description"], "heap-use-after-free")
> > +        self.assertEqual(data["instrumentation_class"],
> "AddressSanitizer")
> > +        self.assertEqual(data["stop_type"], "fatal_error")
> > +
> > +        # now let's try the SB API
> > +        process = self.dbg.GetSelectedTarget().process
> > +        thread = process.GetSelectedThread()
> > +
> > +        s = lldb.SBStream()
> > +        self.assertTrue(thread.GetStopReasonExtendedInfoAsJSON(s))
> > +        s = s.GetData()
> > +        data2 = json.loads(s)
> > +        self.assertEqual(data, data2)
> > +
> > +if __name__ == '__main__':
> > +    import atexit
> > +    lldb.SBDebugger.Initialize()
> > +    atexit.register(lambda: lldb.SBDebugger.Terminate())
> > +    unittest2.main()
> >
> > Modified: lldb/trunk/test/functionalities/asan/main.c
> > URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/asan/main.c?rev=219546&r1=219545&r2=219546&view=diff
> >
> ==============================================================================
> > --- lldb/trunk/test/functionalities/asan/main.c (original)
> > +++ lldb/trunk/test/functionalities/asan/main.c Fri Oct 10 18:43:03 2014
> > @@ -28,7 +28,7 @@ int main (int argc, char const *argv[])
> >
> >      printf("Hello world!\n"); // break line
> >
> > -    pointer[0] = 'A'; // BOOM
> > +    pointer[0] = 'A'; // BOOM line
> >
> >      return 0;
> >  }
> >
> >
> > _______________________________________________
> > lldb-commits mailing list
> > lldb-commits at cs.uiuc.edu
> > http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20141010/71190eae/attachment.html>


More information about the lldb-commits mailing list