X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/cd3f3a74f7399db378fc35f8d0cb458b737f8b1b..5cb7cb980986fe89da490d8d5c2a73b935844724:/lib/base/eerror.h diff --git a/lib/base/eerror.h b/lib/base/eerror.h index 91575878..6040565e 100644 --- a/lib/base/eerror.h +++ b/lib/base/eerror.h @@ -7,57 +7,21 @@ #include // to use memleak check change the following in configure.ac -// * add -rdynamic to LD_FLAGS -// * add -DMEMLEAK_CHECK to CPP_FLAGS +// * add -DMEMLEAK_CHECK and -rdynamic to CPP_FLAGS #ifdef MEMLEAK_CHECK #define BACKTRACE_DEPTH 5 -// when you have c++filt and corresponding libs on your platform -// then add -DHAVE_CPP_FILT to CPP_FLAGS in configure.ac #include #include #include #include #include -#endif // MEMLEAK_CHECK - -#ifndef NULL -#define NULL 0 -#endif - -#ifndef SWIG -#define CHECKFORMAT __attribute__ ((__format__(__printf__, 1, 2))) -#else -#define CHECKFORMAT -#endif - -void CHECKFORMAT eFatal(const char*, ...); - -enum { lvlDebug=1, lvlWarning=2, lvlFatal=4 }; - -#ifndef SWIG -extern Signal2 logOutput; -extern int logOutputConsole; -#endif - -#ifdef ASSERT -#undef ASSERT -#endif - -#ifdef DEBUG - void CHECKFORMAT eDebug(const char*, ...); - void CHECKFORMAT eDebugNoNewLine(const char*, ...); - void CHECKFORMAT eWarning(const char*, ...); -#ifndef SWIG - #define ASSERT(x) { if (!(x)) eFatal("%s:%d ASSERTION %s FAILED!", __FILE__, __LINE__, #x); } -#endif - -#ifdef MEMLEAK_CHECK +#include typedef struct { unsigned int address; unsigned int size; - char *file; + const char *file; void *backtrace[BACKTRACE_DEPTH]; unsigned char btcount; unsigned short line; @@ -77,11 +41,11 @@ static inline void AddTrack(unsigned int addr, unsigned int asize, const char allocList = new(AllocList); info.address = addr; - info.file = strdup(fname); + info.file = fname; info.line = lnum; info.size = asize; info.type = type; - info.btcount = backtrace( info.backtrace, BACKTRACE_DEPTH ); + info.btcount = 0; //backtrace( info.backtrace, BACKTRACE_DEPTH ); singleLock s(memLock); (*allocList)[addr]=info; }; @@ -98,14 +62,11 @@ static inline void RemoveTrack(unsigned int addr, unsigned int type) if ( i->second.type != type ) i->second.type=3; else - { - free(i->second.file); allocList->erase(i); - } } }; -inline void * operator new(unsigned int size, const char *file, int line) +inline void * operator new(size_t size, const char *file, int line) { void *ptr = (void *)malloc(size); AddTrack((unsigned int)ptr, size, file, line, 1); @@ -118,7 +79,7 @@ inline void operator delete(void *p) free(p); }; -inline void * operator new[](unsigned int size, const char *file, int line) +inline void * operator new[](size_t size, const char *file, int line) { void *ptr = (void *)malloc(size); AddTrack((unsigned int)ptr, size, file, line, 2); @@ -131,68 +92,35 @@ inline void operator delete[](void *p) free(p); }; -inline void DumpUnfreed() -{ - AllocList::iterator i; - unsigned int totalSize = 0; +void DumpUnfreed(); +#define new new(__FILE__, __LINE__) - if(!allocList) - return; +#endif // MEMLEAK_CHECK - for(i = allocList->begin(); i != allocList->end(); i++) - { - unsigned int tmp; - printf("%s\tLINE %d\tADDRESS %p\t%d unfreed\ttype %d\n", - i->second.file, i->second.line, (void*)i->second.address, i->second.size, i->second.type); - totalSize += i->second.size; - char **bt_string = backtrace_symbols( i->second.backtrace, i->second.btcount ); - for ( tmp=0; tmp < i->second.btcount; tmp++ ) - { - if ( bt_string[tmp] ) - { -#ifdef HAVE_CPP_FILT - char *beg = strchr(bt_string[tmp], '('); - if ( beg ) - { - std::string tmp1(beg+1); - int pos1=tmp1.find('+'), pos2=tmp1.find(')'); - std::string tmp2(tmp1.substr(pos1,(pos2-pos1)-1)); - std::string cmd="c++filt "; - cmd+=tmp1.substr(0,pos1); - FILE *f = popen(cmd.c_str(), "r"); - char buf[256]; - if (f) - { - size_t rd = fread(buf, 1, 255, f); - if ( rd > 0 ) - { - buf[rd-1]=0; - printf("%s %s\n", buf, tmp2.c_str() ); - } - else - printf("%s\n", tmp1.substr(0,pos1).c_str()); - fclose(f); - } - } - else -#endif // HAVE_CPP_FILT - printf("%s\n", bt_string[tmp]); - } - } - free(bt_string); - printf("\n"); - } +#ifndef NULL +#define NULL 0 +#endif - printf("-----------------------------------------------------------\n"); - printf("Total Unfreed: %d bytes\n", totalSize); - fflush(stdout); -}; -#define new new(__FILE__, __LINE__) +#ifdef ASSERT +#undef ASSERT +#endif -#endif // MEMLEAK_CHECK +#ifndef SWIG + +#define CHECKFORMAT __attribute__ ((__format__(__printf__, 1, 2))) + +extern Signal2 logOutput; +extern int logOutputConsole; +void CHECKFORMAT eFatal(const char*, ...); +enum { lvlDebug=1, lvlWarning=2, lvlFatal=4 }; -#else +#ifdef DEBUG + void CHECKFORMAT eDebug(const char*, ...); + void CHECKFORMAT eDebugNoNewLine(const char*, ...); + void CHECKFORMAT eWarning(const char*, ...); + #define ASSERT(x) { if (!(x)) eFatal("%s:%d ASSERTION %s FAILED!", __FILE__, __LINE__, #x); } +#else // DEBUG inline void eDebug(const char* fmt, ...) { } @@ -207,4 +135,10 @@ inline void DumpUnfreed() #define ASSERT(x) do { } while (0) #endif //DEBUG +void eWriteCrashdump(); + +#endif // SWIG + +void ePythonOutput(const char *); + #endif // __E_ERROR__