소스 검색

Kernel: Use kernelputstr instead of dbgln when printing backtraces

This will allow us to eventually switch dbgln in the kernel to an
allocation-free (although length-bounded) formatter.
Idan Horowitz 3 년 전
부모
커밋
309d71a66b
2개의 변경된 파일18개의 추가작업 그리고 4개의 파일을 삭제
  1. 9 2
      Kernel/Scheduler.cpp
  2. 9 2
      Kernel/Thread.cpp

+ 9 - 2
Kernel/Scheduler.cpp

@@ -18,6 +18,7 @@
 #include <Kernel/Scheduler.h>
 #include <Kernel/Sections.h>
 #include <Kernel/Time/TimeManagement.h>
+#include <Kernel/kstdio.h>
 
 // Remove this once SMP is stable and can be enabled by default
 #define SCHEDULE_ON_ALL_PROCESSORS 0
@@ -595,8 +596,14 @@ void dump_thread_list(bool with_stack_traces)
                 thread.times_scheduled());
             break;
         }
-        if (with_stack_traces)
-            dbgln("{}", thread.backtrace());
+        if (with_stack_traces) {
+            auto trace_or_error = thread.backtrace();
+            if (!trace_or_error.is_error()) {
+                auto trace = trace_or_error.release_value();
+                dbgln("Backtrace:");
+                kernelputstr(trace->characters(), trace->length());
+            }
+        }
         return IterationDecision::Continue;
     });
 }

+ 9 - 2
Kernel/Thread.cpp

@@ -27,6 +27,7 @@
 #include <Kernel/Thread.h>
 #include <Kernel/ThreadTracer.h>
 #include <Kernel/TimerQueue.h>
+#include <Kernel/kstdio.h>
 #include <LibC/signal_numbers.h>
 
 namespace Kernel {
@@ -501,8 +502,14 @@ void Thread::finalize()
         m_join_blocker_set.thread_finalizing();
     }
 
-    if (m_dump_backtrace_on_finalization)
-        dbgln("{}", backtrace());
+    if (m_dump_backtrace_on_finalization) {
+        auto trace_or_error = backtrace();
+        if (!trace_or_error.is_error()) {
+            auto trace = trace_or_error.release_value();
+            dbgln("Backtrace:");
+            kernelputstr(trace->characters(), trace->length());
+        }
+    }
 
     drop_thread_count(false);
 }