Skip to content

Commit 69e3d09

Browse files
committed
physics: print stack trace on ODE errors
1 parent cd3e5c0 commit 69e3d09

1 file changed

Lines changed: 55 additions & 1 deletion

File tree

src/physics/pworld.cpp

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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
2074
PSurface::PSurface()
2175
{
2276
callback = NULL;
@@ -39,6 +93,7 @@ void nearCallback (void *data, dGeomID o1, dGeomID o2)
3993
PWorld::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

Comments
 (0)