summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Reinhardt <stever@eecs.umich.edu>2004-06-21 22:42:16 -0700
committerSteve Reinhardt <stever@eecs.umich.edu>2004-06-21 22:42:16 -0700
commitc1e58b6bf6b353f9355aafd8ed2cb86e6d00e32a (patch)
treee692c51f0b454d53034aad7cc63c605468dd7830
parent800445f4b814d2c6acc92c68d8fc7dee0bf4f8ae (diff)
downloadgem5-c1e58b6bf6b353f9355aafd8ed2cb86e6d00e32a.tar.xz
Handle SIGABRT a little more nicely.
base/misc.cc: Don't dump trace in panic(), SIGABRT handler will do it now. sim/main.cc: Add SIGABRT handler that prints curTick and dumps buffered trace (if any). This doesn't work as well as I would like since the buffered trace records often contain stale references to stack-resident temporary std::string objects. Someday we'll have to put in a fix for that. --HG-- extra : convert_revision : 67576efbf5c10e63e255fc9a9ec520326fd3567b
-rw-r--r--base/misc.cc5
-rw-r--r--sim/main.cc13
2 files changed, 13 insertions, 5 deletions
diff --git a/base/misc.cc b/base/misc.cc
index 5caf96d40..1304fb128 100644
--- a/base/misc.cc
+++ b/base/misc.cc
@@ -61,11 +61,6 @@ __panic(const string &format, cp::ArgList &args, const char *func,
delete &args;
-#if TRACING_ON
- // dump trace buffer, if there is one
- Trace::theLog.dump(cerr);
-#endif
-
abort();
}
diff --git a/sim/main.cc b/sim/main.cc
index 032a05668..c990d830b 100644
--- a/sim/main.cc
+++ b/sim/main.cc
@@ -90,6 +90,18 @@ exitNowHandler(int sigtype)
async_exit = true;
}
+/// Abort signal handler.
+void
+abortHandler(int sigtype)
+{
+ cerr << "Program aborted at cycle " << curTick << endl;
+
+#if TRACING_ON
+ // dump trace buffer, if there is one
+ Trace::theLog.dump(cerr);
+#endif
+}
+
/// Simulator executable name
const char *myProgName = "";
@@ -232,6 +244,7 @@ main(int argc, char **argv)
signal(SIGUSR1, dumpStatsHandler); // dump intermediate stats
signal(SIGUSR2, dumprstStatsHandler); // dump and reset stats
signal(SIGINT, exitNowHandler); // dump final stats and exit
+ signal(SIGABRT, abortHandler);
sayHello(cerr);