Correct the double-patch
--HG-- branch : bgschaidMac
This commit is contained in:
parent
2666365d71
commit
5aff331dee
1 changed files with 0 additions and 97 deletions
|
@ -291,103 +291,6 @@ void getSymbolForRaw
|
|||
os << "Uninterpreted: " << raw.c_str();
|
||||
}
|
||||
|
||||
#ifdef darwin
|
||||
|
||||
// Trying to emulate the original backtrace and backtrace_symbol from the glibc
|
||||
// After an idea published by Rush Manbert at http://lists.apple.com/archives/xcode-users/2006/Apr/msg00528.html
|
||||
|
||||
template<int level>
|
||||
void *getStackAddress()
|
||||
{
|
||||
const unsigned int stackLevel=level;
|
||||
return (
|
||||
__builtin_frame_address(level)
|
||||
? __builtin_return_address(stackLevel)
|
||||
: (void *)0
|
||||
);
|
||||
};
|
||||
|
||||
#define GET_STACK_ADDRESS(lvl) \
|
||||
case lvl: {return getStackAddress<lvl>(); break; }
|
||||
|
||||
// please don't laugh. For some reason this is necessary (the compiler won't accept it otherwise)
|
||||
void *getStackAddress(int level)
|
||||
{
|
||||
switch(level) {
|
||||
GET_STACK_ADDRESS(0);
|
||||
GET_STACK_ADDRESS(1);
|
||||
GET_STACK_ADDRESS(2);
|
||||
GET_STACK_ADDRESS(3);
|
||||
GET_STACK_ADDRESS(4);
|
||||
GET_STACK_ADDRESS(5);
|
||||
GET_STACK_ADDRESS(6);
|
||||
GET_STACK_ADDRESS(7);
|
||||
GET_STACK_ADDRESS(8);
|
||||
GET_STACK_ADDRESS(9);
|
||||
GET_STACK_ADDRESS(10);
|
||||
GET_STACK_ADDRESS(11);
|
||||
GET_STACK_ADDRESS(12);
|
||||
GET_STACK_ADDRESS(13);
|
||||
GET_STACK_ADDRESS(14);
|
||||
GET_STACK_ADDRESS(15);
|
||||
GET_STACK_ADDRESS(16);
|
||||
GET_STACK_ADDRESS(17);
|
||||
GET_STACK_ADDRESS(18);
|
||||
GET_STACK_ADDRESS(19);
|
||||
GET_STACK_ADDRESS(20);
|
||||
GET_STACK_ADDRESS(21);
|
||||
default:
|
||||
return (void *)0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
unsigned backtrace(void **bt, unsigned maxAddrs)
|
||||
{
|
||||
unsigned valid=0;
|
||||
bool ok=true;
|
||||
|
||||
for(int level=0;level<maxAddrs;level++) {
|
||||
if(ok) {
|
||||
bt[level]=getStackAddress(level);
|
||||
|
||||
if(bt[level]!=(void *)0) {
|
||||
valid=level;
|
||||
} else {
|
||||
ok=false;
|
||||
}
|
||||
} else {
|
||||
bt[level]=(void *)0;
|
||||
}
|
||||
}
|
||||
|
||||
return valid;
|
||||
}
|
||||
|
||||
// This function is a potential memory leak. But I don't care because the program is terminating anyway
|
||||
char **backtrace_symbols(void **bt,unsigned nr)
|
||||
{
|
||||
char **strings=(char **)malloc(sizeof(char *)*nr);
|
||||
|
||||
for(unsigned i=0;i<nr;i++) {
|
||||
Dl_info info;
|
||||
int result=dladdr(bt[i],&info);
|
||||
|
||||
char tmp[1000];
|
||||
# ifdef darwin
|
||||
sprintf(tmp,"%s(%s+%p) [%p]",info.dli_fname,info.dli_sname,(void *)((unsigned long)bt[i]-(unsigned long)info.dli_saddr),bt[i]);
|
||||
# else
|
||||
sprintf(tmp,"%s(%s+%p) [%p]",info.dli_fname,info.dli_sname,(void *)((unsigned int)bt[i]-(unsigned int)info.dli_saddr),bt[i]);
|
||||
# endif
|
||||
strings[i]=(char *)malloc(strlen(tmp)+1);
|
||||
strcpy(strings[i],tmp);
|
||||
}
|
||||
|
||||
return strings;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
void error::printStack(Ostream& os)
|
||||
{
|
||||
// Do not print anything if FOAM_ABORT is not set
|
||||
|
|
Reference in a new issue