From dc1a7867e072c21ab7a95ea50d3ab9c1e16c3677 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Wed, 26 Mar 2008 16:08:28 +0000 Subject: [PATCH] * Added new pattern filters d#, x#, and s# which set the actual pattern as "%d", "%x", and "%s" of the expression after '#' respectively. They are very slow, though. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@24591 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/system/kernel/debug/tracing.cpp | 52 +++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/src/system/kernel/debug/tracing.cpp b/src/system/kernel/debug/tracing.cpp index 5e6f1d9986..9677e508d6 100644 --- a/src/system/kernel/debug/tracing.cpp +++ b/src/system/kernel/debug/tracing.cpp @@ -419,6 +419,7 @@ public: thread_id fThread; team_id fTeam; const char* fString; + uint64 fValue; struct { TraceFilter* first; TraceFilter* second; @@ -458,6 +459,42 @@ public: }; +class DecimalPatternTraceFilter : public TraceFilter { +public: + virtual bool Filter(const TraceEntry* entry, LazyTraceOutput& out) + { + // TODO: this is *very* slow + char buffer[64]; + snprintf(buffer, sizeof(buffer), "%Ld", fValue); + return strstr(out.DumpEntry(entry), buffer) != NULL; + } +}; + +class HexPatternTraceFilter : public TraceFilter { +public: + virtual bool Filter(const TraceEntry* entry, LazyTraceOutput& out) + { + // TODO: this is *very* slow + char buffer[64]; + snprintf(buffer, sizeof(buffer), "%Lx", fValue); + return strstr(out.DumpEntry(entry), buffer) != NULL; + } +}; + +class StringPatternTraceFilter : public TraceFilter { +public: + virtual bool Filter(const TraceEntry* entry, LazyTraceOutput& out) + { + if (IS_KERNEL_ADDRESS(fValue)) + return strstr(out.DumpEntry(entry), (const char*)fValue) != NULL; + + // TODO: this is *very* slow + char buffer[64]; + user_strlcpy(buffer, (const char*)fValue, sizeof(buffer)); + return strstr(out.DumpEntry(entry), buffer) != NULL; + } +}; + class NotTraceFilter : public TraceFilter { public: virtual bool Filter(const TraceEntry* entry, LazyTraceOutput& out) @@ -529,6 +566,21 @@ private: PatternTraceFilter; filter->fString = token + 1; return filter; + } else if (token[0] == 'd' && token[1] == '#') { + TraceFilter* filter = new(&fFilters[fFilterCount++]) + DecimalPatternTraceFilter; + filter->fValue = parse_expression(token + 2); + return filter; + } else if (token[0] == 'x' && token[1] == '#') { + TraceFilter* filter = new(&fFilters[fFilterCount++]) + HexPatternTraceFilter; + filter->fValue = parse_expression(token + 2); + return filter; + } else if (token[0] == 's' && token[1] == '#') { + TraceFilter* filter = new(&fFilters[fFilterCount++]) + StringPatternTraceFilter; + filter->fValue = parse_expression(token + 2); + return filter; } else if (strcmp(token, "not") == 0) { TraceFilter* filter = new(&fFilters[fFilterCount++]) NotTraceFilter; if ((filter->fSubFilters.first = _ParseExpression()) != NULL)