@@ -17,6 +17,60 @@ Copyright (C) 2011, Parsian Robotic Center (eew.aut.ac.ir/~parsian/grsim)
1717*/
1818
1919#include " pworld.h"
20+
21+ #include < cstdarg>
22+ #include < cstdio>
23+ #include < cstdlib>
24+
25+ #if defined(HAVE_LINUX) || defined(HAVE_MACOSX)
26+ #include < execinfo.h>
27+ #endif
28+
29+ namespace {
30+
31+ void printBacktrace () {
32+ #if defined(HAVE_LINUX) || defined(HAVE_MACOSX)
33+ void *frames[64 ];
34+ const int frameCount = backtrace (frames, 64 );
35+ std::fputs (" grSim: stack trace:\n " , stderr);
36+ backtrace_symbols_fd (frames, frameCount, fileno (stderr));
37+ #else
38+ std::fputs (" grSim: stack trace is not supported on this platform.\n " , stderr);
39+ #endif
40+ }
41+
42+ void printOdeMessage (const char *kind, int errnum, const char *msg, va_list ap) {
43+ std::fprintf (stderr, " grSim: ODE %s %d: " , kind, errnum);
44+ std::vfprintf (stderr, msg, ap);
45+ std::fputc (' \n ' , stderr);
46+ }
47+
48+ void odeErrorHandler (int errnum, const char *msg, va_list ap) {
49+ printOdeMessage (" ERROR" , errnum, msg, ap);
50+ printBacktrace ();
51+ std::fflush (stderr);
52+ std::abort ();
53+ }
54+
55+ void odeDebugHandler (int errnum, const char *msg, va_list ap) {
56+ printOdeMessage (" DEBUG" , errnum, msg, ap);
57+ printBacktrace ();
58+ std::fflush (stderr);
59+ std::abort ();
60+ }
61+
62+ void odeMessageHandler (int errnum, const char *msg, va_list ap) {
63+ printOdeMessage (" MESSAGE" , errnum, msg, ap);
64+ std::fflush (stderr);
65+ }
66+
67+ void installOdeHandlers () {
68+ dSetErrorHandler (&odeErrorHandler);
69+ dSetDebugHandler (&odeDebugHandler);
70+ dSetMessageHandler (&odeMessageHandler);
71+ }
72+
73+ } // namespace
2074PSurface::PSurface ()
2175{
2276 callback = NULL ;
@@ -39,6 +93,7 @@ void nearCallback (void *data, dGeomID o1, dGeomID o2)
3993PWorld::PWorld (dReal dt,dReal gravity,CGraphics* graphics, int _robot_count)
4094{
4195 robot_count = _robot_count;
96+ installOdeHandlers ();
4297 // dInitODE2(0);
4398 dInitODE ();
4499 world = dWorldCreate ();
@@ -187,4 +242,3 @@ void PWorld::glinit()
187242 for (int i=0 ;i<objects.count ();i++)
188243 objects[i]->glinit ();
189244}
190-
0 commit comments