base: add the FmtStackTrace debug option
authorCiro Santilli <ciro.santilli@arm.com>
Mon, 14 Oct 2019 10:42:54 +0000 (11:42 +0100)
committerCiro Santilli <ciro.santilli@arm.com>
Tue, 3 Dec 2019 11:19:33 +0000 (11:19 +0000)
If given, a stack trace is printed after every debug message.

This helps to localize where debug messages are being called from,
which is often the critical information needed to debug certain
problems.

Change-Id: I82b8990c0d286393d5bdab05f718be3e89eadc40
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/22003
Reviewed-by: Brandon Potter <Brandon.Potter@amd.com>
Reviewed-by: Jason Lowe-Power <jason@lowepower.com>
Maintainer: Jason Lowe-Power <jason@lowepower.com>
Tested-by: kokoro <noreply+kokoro@google.com>
src/base/SConscript
src/base/trace.cc

index 548fda7e345ad72c06b5b4ab08ec08f3688b3429..e2a3215d0f8b127da25c52ee0262c66c48119665 100644 (file)
@@ -112,6 +112,8 @@ DebugFlag('Annotate', "State machine annotation debugging")
 DebugFlag('AnnotateQ', "State machine annotation queue debugging")
 DebugFlag('AnnotateVerbose', "Dump all state machine annotation details")
 DebugFlag('FmtFlag', "Show the --debug-flag that enabled each debug message")
+DebugFlag('FmtStackTrace',
+    "Print a stack trace after every debug message")
 DebugFlag('FmtTicksOff', "Don't show tick count on debug messages")
 DebugFlag('GDBAcc', "Remote debugger accesses")
 DebugFlag('GDBExtra', "Dump extra information on reads and writes")
index 6b18787c287b5242cfd5000e4b55397255c55feb..70d81a1eaa495350dc8919ba179e755f02c19480 100644 (file)
 #include <sstream>
 #include <string>
 
+#include "base/atomicio.hh"
 #include "base/debug.hh"
 #include "base/logging.hh"
 #include "base/output.hh"
 #include "base/str.hh"
 #include "debug/FmtFlag.hh"
+#include "debug/FmtStackTrace.hh"
 #include "debug/FmtTicksOff.hh"
+#include "sim/backtrace.hh"
 
 const std::string &name()
 {
@@ -162,6 +165,11 @@ OstreamLogger::logMessage(Tick when, const std::string &name,
 
     stream << message;
     stream.flush();
+
+    if (DTRACE(FmtStackTrace)) {
+        print_backtrace();
+        STATIC_ERR("\n");
+    }
 }
 
 } // namespace Trace