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();
|
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)
|
void error::printStack(Ostream& os)
|
||||||
{
|
{
|
||||||
// Do not print anything if FOAM_ABORT is not set
|
// Do not print anything if FOAM_ABORT is not set
|
||||||
|
|
Reference in a new issue