bug #15906: added symbol_name parameter to GC_address_to_source, instead of relying on traceback table.

This commit is contained in:
beard%netscape.com 1999-11-15 03:26:03 +00:00
Родитель 0de8f74961
Коммит 1d48510a31
5 изменённых файлов: 27 добавлений и 42 удалений

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

@ -13,6 +13,7 @@ struct CodeLocation {
CodeLocation* mNext;
char* mCodeAddr;
UInt32 mFileOffset;
char mSymbolName[256];
char mFileName[256];
CodeLocation() : mNext(NULL), mCodeAddr(NULL), mFileOffset(0)
@ -31,7 +32,7 @@ struct CodeLocationCache {
CodeLocationCache();
CodeLocation* findLocation(char* codeAddr);
void saveLocation(char* codeAddr, char fileName[256], UInt32 fileOffset);
void saveLocation(char* codeAddr, char symbolName[256], char fileName[256], UInt32 fileOffset);
};
CodeLocationCache::CodeLocationCache()
@ -69,7 +70,7 @@ CodeLocation* CodeLocationCache::findLocation(char* codeAddr)
return NULL;
}
void CodeLocationCache::saveLocation(char* codeAddr, char fileName[256], UInt32 fileOffset)
void CodeLocationCache::saveLocation(char* codeAddr, char symbolName[256], char fileName[256], UInt32 fileOffset)
{
CodeLocation** link = mLastLink;
CodeLocation* location = *link;
@ -85,6 +86,7 @@ void CodeLocationCache::saveLocation(char* codeAddr, char fileName[256], UInt32
// save the specified location.
location->mCodeAddr = codeAddr;
location->mFileOffset = fileOffset;
::strcpy(location->mSymbolName, symbolName);
::strcpy(location->mFileName, fileName);
}
@ -182,7 +184,7 @@ void GC_unregister_fragment(char* dataStart, char* dataEnd,
GC_remove_roots(dataStart, dataEnd);
}
int GC_address_to_source(char* codeAddr, char fileName[256], UInt32* fileOffset)
int GC_address_to_source(char* codeAddr, char symbolName[256], char fileName[256], UInt32* fileOffset)
{
CodeFragment** link = find_fragment(codeAddr);
if (link != NULL) {
@ -196,15 +198,16 @@ int GC_address_to_source(char* codeAddr, char fileName[256], UInt32* fileOffset)
// see if this is a cached location.
CodeLocation* location = fragment->mLocations.findLocation(codeAddr);
if (location != NULL) {
::strcpy(symbolName, location->mSymbolName);
::strcpy(fileName, location->mFileName);
*fileOffset = location->mFileOffset;
return 1;
}
sym_file* symbols = fragment->mSymbols;
if (symbols != NULL) {
if (get_source(symbols, UInt32(codeAddr - fragment->mCodeStart), fileName, fileOffset)) {
if (get_source(symbols, UInt32(codeAddr - fragment->mCodeStart), symbolName, fileName, fileOffset)) {
// save this location in the per-fragment cache.
fragment->mLocations.saveLocation(codeAddr, fileName, *fileOffset);
fragment->mLocations.saveLocation(codeAddr, symbolName, fileName, *fileOffset);
return 1;
}
}

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

@ -1,26 +0,0 @@
/*
gc_fragments.h
*/
#pragma once
#ifndef __FILES__
#include <Files.h>
#endif
#ifdef __cplusplus
extern "C" {
#endif
void GC_register_fragment(char* dataStart, char* dataEnd,
char* codeStart, char* codeEnd,
const FSSpec* fragmentSpec);
void GC_unregister_fragment(char* dataStart, char* dataEnd,
char* codeStart, char* codeEnd);
int GC_address_to_source(char* codeAddr, char fileName[256], UInt32* fileOffset);
#ifdef __cplusplus
} /* extern "C" */
#endif

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

@ -807,23 +807,25 @@ static char* pc2name(word pc, char name[], long size)
}
extern void MWUnmangle(const char *mangled_name, char *unmangled_name, size_t buffersize);
extern int GC_address_to_source(char* codeAddr, char fileName[256], UInt32* fileOffset);
extern int GC_address_to_source(char* codeAddr, char symbolName[256], char fileName[256], UInt32* fileOffset);
void GC_print_callers(struct callinfo info[NFRAMES])
{
register int i;
UInt32 file_offset;
static char name[1024], unmangled_name[1024], file_name[256];
static char symbol_name[1024], unmangled_name[1024], file_name[256];
GC_err_printf0("Callers at location:\n");
for (i = 0; i < NFRAMES; i++) {
if (info[i].ci_pc == 0) break;
pc2name(info[i].ci_pc, name, sizeof(name));
MWUnmangle(name, unmangled_name, sizeof(unmangled_name));
if (GC_address_to_source((char*)info[i].ci_pc, file_name, &file_offset))
if (GC_address_to_source((char*)info[i].ci_pc, symbol_name, file_name, &file_offset)) {
MWUnmangle(symbol_name, unmangled_name, sizeof(unmangled_name));
GC_err_printf3("%s[%s,%ld]\n", unmangled_name, file_name, file_offset);
else
} else {
pc2name(info[i].ci_pc, symbol_name, sizeof(symbol_name));
MWUnmangle(symbol_name, unmangled_name, sizeof(unmangled_name));
GC_err_printf2("%s(%08X)\n", unmangled_name, info[i].ci_pc);
}
}
}

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

@ -249,7 +249,7 @@ inline UInt32 delta(UInt32 x, UInt32 y)
return (y - x);
}
int get_source(sym_file* symbols, UInt32 codeOffset, char fileName[256], UInt32* fileOffset)
int get_source(sym_file* symbols, UInt32 codeOffset, char symbolName[256], char fileName[256], UInt32* fileOffset)
{
const DiskSymbolHeaderBlock& header = symbols->mHeader;
const ResourceTableEntry& codeEntry = symbols->mCodeEntry;
@ -265,14 +265,20 @@ int get_source(sym_file* symbols, UInt32 codeOffset, char fileName[256], UInt32*
UInt32 moduleIndex = (i % modulesPerPage);
symbols->seek((header.dshb_mte.dti_first_page + modulePage) * header.dshb_page_size + moduleIndex * sizeof(ModulesTableEntry));
if (symbols->read(&moduleEntry, sizeof(moduleEntry)) == sizeof(moduleEntry)) {
const UInt8* moduleName = symbols->getName(moduleEntry.mte_nte_index);
// printf("module name = %#s\n", moduleName);
if (isMeatyModule(moduleEntry) && (codeOffset >= moduleEntry.mte_res_offset) && (codeOffset - moduleEntry.mte_res_offset) < moduleEntry.mte_size) {
FileReferenceTableEntry frte;
if (getFileReferenceTableEntry(symbols, moduleEntry.mte_imp_fref, &frte)) {
UInt32 length;
// get the name of the symbol.
const UInt8* moduleName = symbols->getName(moduleEntry.mte_nte_index);
// printf("module name = %#s\n", moduleName);
// trim off the leading "."
length = moduleName[0] - 1;
BlockMoveData(moduleName + 2, symbolName, length);
symbolName[length] = '\0';
// get the name of the file.
const UInt8* name = symbols->getName(frte.frte_fn.nte_index);
UInt32 length = name[0];
length = name[0];
BlockMoveData(name + 1, fileName, length);
fileName[length] = '\0';
// printf("file name = %s\n", fileName);

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

@ -49,7 +49,7 @@ typedef struct sym_file sym_file;
sym_file* open_sym_file(const FSSpec* symSpec);
void close_sym_file(sym_file* symbols);
int get_source(sym_file* symbols, UInt32 codeOffset, char fileName[256], UInt32* fileOffset);
int get_source(sym_file* symbols, UInt32 codeOffset, char symbolName[256], char fileName[256], UInt32* fileOffset);
#ifdef __cplusplus
} /* extern "C" */