[haiku-commits] r43085 - in haiku/trunk: headers/private/kernel src/system/kernel/debug

  • From: ingo_weinhold@xxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Tue, 1 Nov 2011 23:22:14 +0100 (CET)

Author: bonefish
Date: 2011-11-01 23:22:14 +0100 (Tue, 01 Nov 2011)
New Revision: 43085
Changeset: https://dev.haiku-os.org/changeset/43085

Modified:
   haiku/trunk/headers/private/kernel/tracing.h
   haiku/trunk/src/system/kernel/debug/tracing.cpp
Log:
mmlr + bonefish:
* Add TraceOutput::PrintArgs(), a va_list version of Print().
* Move code of TraceOutput::Print() to new private template function
  print_stack_trace().
* Add public tracing_print_stack_trace().


Modified: haiku/trunk/headers/private/kernel/tracing.h
===================================================================
--- haiku/trunk/headers/private/kernel/tracing.h        2011-11-01 21:40:40 UTC 
(rev 43084)
+++ haiku/trunk/headers/private/kernel/tracing.h        2011-11-01 22:22:14 UTC 
(rev 43085)
@@ -10,6 +10,7 @@
 #include <SupportDefs.h>
 #include <KernelExport.h>
 
+#include <stdarg.h>
 #include <stdio.h>
 
 #include "tracing_config.h"
@@ -41,30 +42,31 @@
 
 
 class TraceOutput {
-       public:
-               TraceOutput(char* buffer, size_t bufferSize, uint32 flags);
+public:
+       TraceOutput(char* buffer, size_t bufferSize, uint32 flags);
 
-               void Clear();
-               void Print(const char* format,...)
-                       __attribute__ ((format (__printf__, 2, 3)));
-               void PrintStackTrace(tracing_stack_trace* stackTrace);
-               bool IsFull() const     { return fSize >= fCapacity; }
+       void Clear();
+       void Print(const char* format,...)
+               __attribute__ ((format (__printf__, 2, 3)));
+       void PrintArgs(const char* format, va_list args);
+       void PrintStackTrace(tracing_stack_trace* stackTrace);
+       bool IsFull() const     { return fSize >= fCapacity; }
 
-               char* Buffer() const    { return fBuffer; }
-               size_t Capacity() const { return fCapacity; }
-               size_t Size() const             { return fSize; }
+       char* Buffer() const    { return fBuffer; }
+       size_t Capacity() const { return fCapacity; }
+       size_t Size() const             { return fSize; }
 
-               uint32 Flags() const    { return fFlags; }
+       uint32 Flags() const    { return fFlags; }
 
-               void SetLastEntryTime(bigtime_t time);
-               bigtime_t LastEntryTime() const;
+       void SetLastEntryTime(bigtime_t time);
+       bigtime_t LastEntryTime() const;
 
-       private:
-               char*           fBuffer;
-               size_t          fCapacity;
-               size_t          fSize;
-               uint32          fFlags;
-               bigtime_t       fLastEntryTime;
+private:
+       char*           fBuffer;
+       size_t          fCapacity;
+       size_t          fSize;
+       uint32          fFlags;
+       bigtime_t       fLastEntryTime;
 };
 
 
@@ -251,6 +253,16 @@
 };
 
 
+inline void
+TraceOutput::Print(const char* format,...)
+{
+       va_list args;
+       va_start(args, format);
+       PrintArgs(format, args);
+       va_end(args);
+}
+
+
 int dump_tracing(int argc, char** argv, WrapperTraceFilter* wrapperFilter);
 
 bool tracing_is_entry_valid(TraceEntry* entry, bigtime_t entryTime);
@@ -272,6 +284,7 @@
 addr_t tracing_find_caller_in_stack_trace(
        struct tracing_stack_trace* stackTrace, const addr_t excludeRanges[],
        uint32 excludeRangeCount);
+void tracing_print_stack_trace(struct tracing_stack_trace* stackTrace);
 
 void lock_tracing_buffer();
 void unlock_tracing_buffer();

Modified: haiku/trunk/src/system/kernel/debug/tracing.cpp
===================================================================
--- haiku/trunk/src/system/kernel/debug/tracing.cpp     2011-11-01 21:40:40 UTC 
(rev 43084)
+++ haiku/trunk/src/system/kernel/debug/tracing.cpp     2011-11-01 22:22:14 UTC 
(rev 43085)
@@ -7,7 +7,6 @@
 
 #include <tracing.h>
 
-#include <stdarg.h>
 #include <stdlib.h>
 
 #include <algorithm>
@@ -59,6 +58,26 @@
        = ((1 << 13) - 1) * sizeof(trace_entry);
 
 
+struct TraceOutputPrint {
+       TraceOutputPrint(TraceOutput& output)
+               :
+               fOutput(output)
+       {
+       }
+
+       void operator()(const char* format,...) const
+       {
+               va_list args;
+               va_start(args, format);
+               fOutput.PrintArgs(format, args);
+               va_end(args);
+       }
+
+private:
+       TraceOutput&    fOutput;
+};
+
+
 class TracingMetaData {
 public:
        static  status_t                        Create(TracingMetaData*& 
_metaData);
@@ -112,6 +131,33 @@
 // #pragma mark -
 
 
+template<typename Print>
+static void
+print_stack_trace(struct tracing_stack_trace* stackTrace,
+       const Print& print)
+{
+       if (stackTrace == NULL || stackTrace->depth <= 0)
+               return;
+
+       for (int32 i = 0; i < stackTrace->depth; i++) {
+               addr_t address = stackTrace->return_addresses[i];
+
+               const char* symbol;
+               const char* imageName;
+               bool exactMatch;
+               addr_t baseAddress;
+
+               if (elf_debug_lookup_symbol_address(address, &baseAddress, 
&symbol,
+                               &imageName, &exactMatch) == B_OK) {
+                       print("  %p  %s + 0x%lx (%s)%s\n", (void*)address, 
symbol,
+                               address - baseAddress, imageName,
+                               exactMatch ? "" : " (nearest)");
+               } else
+                       print("  %p\n", (void*)address);
+       }
+}
+
+
 // #pragma mark - TracingMetaData
 
 
@@ -618,20 +664,14 @@
 
 
 void
-TraceOutput::Print(const char* format,...)
+TraceOutput::PrintArgs(const char* format, va_list args)
 {
 #if ENABLE_TRACING
        if (IsFull())
                return;
 
-       if (fSize < fCapacity) {
-               va_list args;
-               va_start(args, format);
-               size_t length = vsnprintf(fBuffer + fSize, fCapacity - fSize, 
format,
-                       args);
-               fSize += std::min(length, fCapacity - fSize - 1);
-               va_end(args);
-       }
+       size_t length = vsnprintf(fBuffer + fSize, fCapacity - fSize, format, 
args);
+       fSize += std::min(length, fCapacity - fSize - 1);
 #endif
 }
 
@@ -640,6 +680,7 @@
 TraceOutput::PrintStackTrace(tracing_stack_trace* stackTrace)
 {
 #if ENABLE_TRACING
+       print_stack_trace(stackTrace, TraceOutputPrint(*this));
        if (stackTrace == NULL || stackTrace->depth <= 0)
                return;
 
@@ -1634,6 +1675,13 @@
 }
 
 
+void
+tracing_print_stack_trace(struct tracing_stack_trace* stackTrace)
+{
+       print_stack_trace(stackTrace, kprintf);
+}
+
+
 int
 dump_tracing(int argc, char** argv, WrapperTraceFilter* wrapperFilter)
 {


Other related posts:

  • » [haiku-commits] r43085 - in haiku/trunk: headers/private/kernel src/system/kernel/debug - ingo_weinhold