From fe8f0f4601874527071ef066e8550e07323f9f51 Mon Sep 17 00:00:00 2001 From: Michael Lotz Date: Mon, 31 Oct 2011 21:37:39 +0000 Subject: [PATCH] bonefish+mmlr: * Add an AbstractTraceEntryWithStackTrace that includes stack trace handling. * Add a selector macro/template combo to conveniently select the right base class depending on whether stack traces are enabled or not. * Minor style cleanups. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@43045 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- headers/private/kernel/tracing.h | 71 ++++++++++++++++++++++++----- src/system/kernel/debug/tracing.cpp | 43 ++++++++++++----- 2 files changed, 91 insertions(+), 23 deletions(-) diff --git a/headers/private/kernel/tracing.h b/headers/private/kernel/tracing.h index 71a8b30d65..52f0cf5c93 100644 --- a/headers/private/kernel/tracing.h +++ b/headers/private/kernel/tracing.h @@ -92,25 +92,72 @@ class TraceEntry { class AbstractTraceEntry : public TraceEntry { - public: - AbstractTraceEntry(); - virtual ~AbstractTraceEntry(); +public: + AbstractTraceEntry() + { + _Init(); + } - virtual void Dump(TraceOutput& out); + // dummy, ignores all arguments + AbstractTraceEntry(size_t, size_t, bool) + { + _Init(); + } - virtual void AddDump(TraceOutput& out); + virtual ~AbstractTraceEntry(); - thread_id ThreadID() const { return fThread; } - thread_id TeamID() const { return fTeam; } - bigtime_t Time() const { return fTime; } + virtual void Dump(TraceOutput& out); - protected: - thread_id fThread; - team_id fTeam; - bigtime_t fTime; + virtual void AddDump(TraceOutput& out); + + thread_id ThreadID() const { return fThread; } + thread_id TeamID() const { return fTeam; } + bigtime_t Time() const { return fTime; } + +protected: + typedef AbstractTraceEntry TraceEntryBase; + +private: + void _Init(); + +protected: + thread_id fThread; + team_id fTeam; + bigtime_t fTime; }; +class AbstractTraceEntryWithStackTrace : public AbstractTraceEntry { +public: + AbstractTraceEntryWithStackTrace(size_t stackTraceDepth, + size_t skipFrames, bool kernelOnly); + + virtual void DumpStackTrace(TraceOutput& out); + +protected: + typedef AbstractTraceEntryWithStackTrace TraceEntryBase; + +private: + tracing_stack_trace* fStackTrace; +}; + + +template +struct AbstractTraceEntrySelector { + typedef AbstractTraceEntryWithStackTrace Type; +}; + + +template<> +struct AbstractTraceEntrySelector<0> { + typedef AbstractTraceEntry Type; +}; + + +#define TRACE_ENTRY_SELECTOR(stackTraceDepth) \ + AbstractTraceEntrySelector::Type + + class LazyTraceOutput : public TraceOutput { public: LazyTraceOutput(char* buffer, size_t bufferSize, uint32 flags) diff --git a/src/system/kernel/debug/tracing.cpp b/src/system/kernel/debug/tracing.cpp index 75cd8b771e..7d487f5e11 100644 --- a/src/system/kernel/debug/tracing.cpp +++ b/src/system/kernel/debug/tracing.cpp @@ -737,17 +737,6 @@ TraceEntry::operator new(size_t size, const std::nothrow_t&) throw() // #pragma mark - -AbstractTraceEntry::AbstractTraceEntry() -{ - Thread* thread = thread_get_current_thread(); - if (thread != NULL) { - fThread = thread->id; - if (thread->team) - fTeam = thread->team->id; - } - fTime = system_time(); -} - AbstractTraceEntry::~AbstractTraceEntry() { } @@ -777,6 +766,38 @@ AbstractTraceEntry::AddDump(TraceOutput& out) } +void +AbstractTraceEntry::_Init() +{ + Thread* thread = thread_get_current_thread(); + if (thread != NULL) { + fThread = thread->id; + if (thread->team) + fTeam = thread->team->id; + } + fTime = system_time(); +} + + +// #pragma mark - AbstractTraceEntryWithStackTrace + + + +AbstractTraceEntryWithStackTrace::AbstractTraceEntryWithStackTrace( + size_t stackTraceDepth, size_t skipFrames, bool kernelOnly) +{ + fStackTrace = capture_tracing_stack_trace(stackTraceDepth, skipFrames + 1, + kernelOnly); +} + + +void +AbstractTraceEntryWithStackTrace::DumpStackTrace(TraceOutput& out) +{ + out.PrintStackTrace(fStackTrace); +} + + // #pragma mark -