From f97199edd3ead2cd14ce2a844fab290076a2ad54 Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Tue, 22 Apr 2008 14:52:48 +0000 Subject: [PATCH] Made dump_tracing() (the "traced" command function) available in the kernel and added a WrapperTraceFilter* parameter, which allows for additional filtering. This way other commands can print tracing output with special filtering. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@25094 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- headers/private/kernel/tracing.h | 43 ++++++++++++++ src/system/kernel/debug/tracing.cpp | 92 ++++++++++++++--------------- 2 files changed, 87 insertions(+), 48 deletions(-) diff --git a/headers/private/kernel/tracing.h b/headers/private/kernel/tracing.h index 3d0f8be8c5..59ecc3d394 100644 --- a/headers/private/kernel/tracing.h +++ b/headers/private/kernel/tracing.h @@ -88,6 +88,48 @@ class AbstractTraceEntry : public TraceEntry { bigtime_t fTime; }; +class LazyTraceOutput : public TraceOutput { +public: + LazyTraceOutput(char* buffer, size_t bufferSize, uint32 flags) + : TraceOutput(buffer, bufferSize, flags) + { + } + + const char* DumpEntry(const TraceEntry* entry) + { + if (Size() == 0) { + const_cast(entry)->Dump(*this); + // Dump() should probably be const + } + + return Buffer(); + } +}; + +class TraceFilter { +public: + virtual ~TraceFilter(); + + virtual bool Filter(const TraceEntry* entry, LazyTraceOutput& out); + +public: + union { + thread_id fThread; + team_id fTeam; + const char* fString; + uint64 fValue; + struct { + TraceFilter* first; + TraceFilter* second; + } fSubFilters; + }; +}; + +class WrapperTraceFilter : public TraceFilter { +public: + virtual void Init(TraceFilter* filter, int direction, bool continued) = 0; +}; + #endif // __cplusplus #ifdef __cplusplus @@ -98,6 +140,7 @@ uint8* alloc_tracing_buffer(size_t size); uint8* alloc_tracing_buffer_memcpy(const void* source, size_t size, bool user); char* alloc_tracing_buffer_strcpy(const char* source, size_t maxSize, bool user); +int dump_tracing(int argc, char** argv, WrapperTraceFilter* wrapperFilter); status_t tracing_init(void); void _user_ktrace_output(const char *message); diff --git a/src/system/kernel/debug/tracing.cpp b/src/system/kernel/debug/tracing.cpp index 08f1f14b88..c142826bb6 100644 --- a/src/system/kernel/debug/tracing.cpp +++ b/src/system/kernel/debug/tracing.cpp @@ -386,48 +386,17 @@ class UserTraceEntry : public AbstractTraceEntry { // #pragma mark - trace filters -class LazyTraceOutput : public TraceOutput { -public: - LazyTraceOutput(char* buffer, size_t bufferSize, uint32 flags) - : TraceOutput(buffer, bufferSize, flags) - { - } - - const char* DumpEntry(const TraceEntry* entry) - { - if (Size() == 0) { - const_cast(entry)->Dump(*this); - // Dump() should probably be const - } - - return Buffer(); - } -}; +TraceFilter::~TraceFilter() +{ +} -class TraceFilter { -public: - virtual ~TraceFilter() - { - } +bool +TraceFilter::Filter(const TraceEntry* entry, LazyTraceOutput& out) +{ + return false; +} - virtual bool Filter(const TraceEntry* entry, LazyTraceOutput& out) - { - return false; - } - -public: - union { - thread_id fThread; - team_id fTeam; - const char* fString; - uint64 fValue; - struct { - TraceFilter* first; - TraceFilter* second; - } fSubFilters; - }; -}; class ThreadTraceFilter : public TraceFilter { @@ -544,9 +513,9 @@ public: return fTokenIndex == fTokenCount && filter != NULL; } - bool Filter(const TraceEntry* entry, LazyTraceOutput& out) + TraceFilter* Filter() { - return fFilters[0].Filter(entry, out); + return &fFilters[0]; } private: @@ -782,7 +751,7 @@ private: int -dump_tracing(int argc, char** argv) +dump_tracing_internal(int argc, char** argv, WrapperTraceFilter* wrapperFilter) { int argi = 1; @@ -934,7 +903,16 @@ dump_tracing(int argc, char** argv) int32 firstToDump = firstToCheck; int32 lastToDump = lastToCheck; - if (direction < 0 && hasFilter && lastToCheck - firstToCheck >= count) { + TraceFilter* filter = NULL; + if (hasFilter) + filter = TraceFilterParser::Default()->Filter(); + + if (wrapperFilter != NULL) { + wrapperFilter->Init(filter, direction, cont != 0); + filter = wrapperFilter; + } + + if (direction < 0 && filter && lastToCheck - firstToCheck >= count) { // iteration direction is backwards markedMatching = true; @@ -952,7 +930,7 @@ dump_tracing(int argc, char** argv) TraceEntry* entry = iterator.Previous(); if ((entry->flags & ENTRY_INITIALIZED) != 0) { out.Clear(); - if (TraceFilterParser::Default()->Filter(entry, out)) { + if (filter->Filter(entry, out)) { entry->flags |= FILTER_MATCH; if (lastToDump == -1) lastToDump = iterator.Index(); @@ -994,9 +972,9 @@ dump_tracing(int argc, char** argv) if ((entry->flags & ENTRY_INITIALIZED) != 0) { out.Clear(); - if (hasFilter && (markedMatching + if (filter && (markedMatching ? (entry->flags & FILTER_MATCH) == 0 - : !TraceFilterParser::Default()->Filter(entry, out))) { + : !filter->Filter(entry, out))) { continue; } @@ -1007,7 +985,7 @@ dump_tracing(int argc, char** argv) len--; kprintf("%5ld. %.*s\n", index, len, dump); - } else if (!hasFilter) + } else if (!filter) kprintf("%5ld. ** uninitialized entry **\n", index); dumped++; @@ -1032,6 +1010,13 @@ dump_tracing(int argc, char** argv) } +static int +dump_tracing_command(int argc, char** argv) +{ + return dump_tracing_internal(argc, argv, NULL); +} + + #endif // ENABLE_TRACING @@ -1104,6 +1089,17 @@ alloc_tracing_buffer_strcpy(const char* source, size_t maxSize, bool user) } +int +dump_tracing(int argc, char** argv, WrapperTraceFilter* wrapperFilter) +{ +#if ENABLE_TRACING + return dump_tracing_internal(argc, argv, wrapperFilter); +#else + return 0; +#endif +} + + extern "C" status_t tracing_init(void) { @@ -1117,7 +1113,7 @@ tracing_init(void) sFirstEntry = sBuffer; sAfterLastEntry = sBuffer; - add_debugger_command_etc("traced", &dump_tracing, + add_debugger_command_etc("traced", &dump_tracing_command, "Dump recorded trace entries", "[ \"--printteam\" ] [ \"--difftime\" ] (\"forward\" | \"backward\") " "| ([ [ [ ] ] ] "