|
|
|
@ -28,7 +28,7 @@
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#if NV_OS_LINUX && defined(HAVE_EXECINFO_H)
|
|
|
|
|
# include <execinfo.h>
|
|
|
|
|
# include <execinfo.h> // backtrace
|
|
|
|
|
# if NV_CC_GNUC // defined(HAVE_CXXABI_H)
|
|
|
|
|
# include <cxxabi.h>
|
|
|
|
|
# endif
|
|
|
|
@ -39,6 +39,13 @@
|
|
|
|
|
# include <sys/types.h>
|
|
|
|
|
# include <sys/sysctl.h> // sysctl
|
|
|
|
|
# include <ucontext.h>
|
|
|
|
|
# undef HAVE_EXECINFO_H
|
|
|
|
|
# if defined(HAVE_EXECINFO_H) // only after OSX 10.5
|
|
|
|
|
# include <execinfo.h> // backtrace
|
|
|
|
|
# if NV_CC_GNUC // defined(HAVE_CXXABI_H)
|
|
|
|
|
# include <cxxabi.h>
|
|
|
|
|
# endif
|
|
|
|
|
# endif
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#include <stdexcept> // std::runtime_error
|
|
|
|
@ -128,6 +135,10 @@ namespace
|
|
|
|
|
|
|
|
|
|
#if defined(HAVE_EXECINFO_H) // NV_OS_LINUX
|
|
|
|
|
|
|
|
|
|
static bool nvHasStackTrace() {
|
|
|
|
|
return backtrace != NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void nvPrintStackTrace(void * trace[], int size, int start=0) {
|
|
|
|
|
char ** string_array = backtrace_symbols(trace, size);
|
|
|
|
|
|
|
|
|
@ -228,17 +239,18 @@ namespace
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# if defined(HAVE_EXECINFO_H)
|
|
|
|
|
if (nvHasStackTrace()) // in case of weak linking
|
|
|
|
|
{
|
|
|
|
|
void * trace[64];
|
|
|
|
|
int size = backtrace(trace, 64);
|
|
|
|
|
|
|
|
|
|
void * trace[64];
|
|
|
|
|
int size = backtrace(trace, 64);
|
|
|
|
|
|
|
|
|
|
if (pnt != NULL) {
|
|
|
|
|
// Overwrite sigaction with caller's address.
|
|
|
|
|
trace[1] = pnt;
|
|
|
|
|
if (pnt != NULL) {
|
|
|
|
|
// Overwrite sigaction with caller's address.
|
|
|
|
|
trace[1] = pnt;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
nvPrintStackTrace(trace, size, 1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
nvPrintStackTrace(trace, size, 1);
|
|
|
|
|
|
|
|
|
|
# endif // defined(HAVE_EXECINFO_H)
|
|
|
|
|
|
|
|
|
|
exit(0);
|
|
|
|
@ -373,9 +385,12 @@ namespace
|
|
|
|
|
# endif
|
|
|
|
|
|
|
|
|
|
# if defined(HAVE_EXECINFO_H)
|
|
|
|
|
void * trace[64];
|
|
|
|
|
int size = backtrace(trace, 64);
|
|
|
|
|
nvPrintStackTrace(trace, size, 3);
|
|
|
|
|
if (nvHasStackTrace())
|
|
|
|
|
{
|
|
|
|
|
void * trace[64];
|
|
|
|
|
int size = backtrace(trace, 64);
|
|
|
|
|
nvPrintStackTrace(trace, size, 3);
|
|
|
|
|
}
|
|
|
|
|
# endif
|
|
|
|
|
|
|
|
|
|
// Exit cleanly.
|
|
|
|
@ -422,9 +437,12 @@ void NV_CDECL nvDebug(const char *msg, ...)
|
|
|
|
|
void debug::dumpInfo()
|
|
|
|
|
{
|
|
|
|
|
#if !NV_OS_WIN32 && defined(HAVE_SIGNAL_H) && defined(HAVE_EXECINFO_H)
|
|
|
|
|
void * trace[64];
|
|
|
|
|
int size = backtrace(trace, 64);
|
|
|
|
|
nvPrintStackTrace(trace, size, 1);
|
|
|
|
|
if (nvHasStackTrace())
|
|
|
|
|
{
|
|
|
|
|
void * trace[64];
|
|
|
|
|
int size = backtrace(trace, 64);
|
|
|
|
|
nvPrintStackTrace(trace, size, 1);
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|