Make Linux stack walking code (DEBUG only) print library and offset information even when symbol is unavailable. b=174168 r=bbaetz sr=bzbarsky a=rjesup

This commit is contained in:
dbaron%fas.harvard.edu 2002-10-14 23:59:31 +00:00
Родитель bff3c166a9
Коммит 22cde85310
2 изменённых файлов: 24 добавлений и 26 удалений

Просмотреть файл

@ -1178,16 +1178,20 @@ nsTraceRefcnt::WalkTheStack(FILE* aStream)
if (--skip <= 0) { if (--skip <= 0) {
Dl_info info; Dl_info info;
int ok = dladdr((void*) pc, &info); int ok = dladdr((void*) pc, &info);
if (!ok) if (!ok) {
goto unknown; fprintf(aStream, "UNKNOWN %p\n", (void *)pc);
continue;
}
PRUint32 foff = (char*)pc - (char*)info.dli_fbase;
const char * symbol = info.dli_sname; const char * symbol = info.dli_sname;
if (!symbol) int len;
goto unknown; if (!symbol || !(len = strlen(symbol))) {
fprintf(aStream, "UNKNOWN [%s +0x%08X]\n",
int len = strlen(symbol); info.dli_fname, foff);
if (! len) continue;
goto unknown; }
char demangled[4096] = "\0"; char demangled[4096] = "\0";
@ -1199,14 +1203,9 @@ nsTraceRefcnt::WalkTheStack(FILE* aStream)
} }
PRUint32 off = (char*)pc - (char*)info.dli_saddr; PRUint32 off = (char*)pc - (char*)info.dli_saddr;
PRUint32 foff = (char*)pc - (char*)info.dli_fbase;
fprintf(aStream, "%s+0x%08X [%s +0x%08X]\n", fprintf(aStream, "%s+0x%08X [%s +0x%08X]\n",
symbol, off, info.dli_fname, foff); symbol, off, info.dli_fname, foff);
} }
continue;
unknown:
fprintf(aStream, "UNKNOWN %p\n", (void *)pc);
} }
} }
#elif defined(__sun) && (defined(__sparc) || defined(sparc) || defined(__i386) || defined(i386)) #elif defined(__sun) && (defined(__sparc) || defined(sparc) || defined(__i386) || defined(i386))

Просмотреть файл

@ -1178,16 +1178,20 @@ nsTraceRefcnt::WalkTheStack(FILE* aStream)
if (--skip <= 0) { if (--skip <= 0) {
Dl_info info; Dl_info info;
int ok = dladdr((void*) pc, &info); int ok = dladdr((void*) pc, &info);
if (!ok) if (!ok) {
goto unknown; fprintf(aStream, "UNKNOWN %p\n", (void *)pc);
continue;
}
PRUint32 foff = (char*)pc - (char*)info.dli_fbase;
const char * symbol = info.dli_sname; const char * symbol = info.dli_sname;
if (!symbol) int len;
goto unknown; if (!symbol || !(len = strlen(symbol))) {
fprintf(aStream, "UNKNOWN [%s +0x%08X]\n",
int len = strlen(symbol); info.dli_fname, foff);
if (! len) continue;
goto unknown; }
char demangled[4096] = "\0"; char demangled[4096] = "\0";
@ -1199,14 +1203,9 @@ nsTraceRefcnt::WalkTheStack(FILE* aStream)
} }
PRUint32 off = (char*)pc - (char*)info.dli_saddr; PRUint32 off = (char*)pc - (char*)info.dli_saddr;
PRUint32 foff = (char*)pc - (char*)info.dli_fbase;
fprintf(aStream, "%s+0x%08X [%s +0x%08X]\n", fprintf(aStream, "%s+0x%08X [%s +0x%08X]\n",
symbol, off, info.dli_fname, foff); symbol, off, info.dli_fname, foff);
} }
continue;
unknown:
fprintf(aStream, "UNKNOWN %p\n", (void *)pc);
} }
} }
#elif defined(__sun) && (defined(__sparc) || defined(sparc) || defined(__i386) || defined(i386)) #elif defined(__sun) && (defined(__sparc) || defined(sparc) || defined(__i386) || defined(i386))