diff --git a/symbol/symbol.cpp b/symbol/symbol.cpp index e30b5a3a4d27d519d7d3a75ae56f8aee670ec63a..699dca8ae437bbf0f0353fb52bdf6fc6a6968edb 100644 --- a/symbol/symbol.cpp +++ b/symbol/symbol.cpp @@ -79,7 +79,7 @@ void SymResolverDestroy() SymbolResolve::GetInstance()->Clear(); } -struct Stack* StackToHash(int pid, unsigned long* stack, int nr) +struct Stack* StackToHash(int pid, unsigned long* stack, int nr) { try { return SymbolResolve::GetInstance()->StackToHash(pid, stack, nr); diff --git a/symbol/symbol_resolve.cpp b/symbol/symbol_resolve.cpp index 504e526b43ae1ee80f55bbf3db1a3886eda13c0b..eb9042d54e1ebf465d188ab606882663e16db023 100644 --- a/symbol/symbol_resolve.cpp +++ b/symbol/symbol_resolve.cpp @@ -61,6 +61,7 @@ const std::string R_XP = "r-xp"; const std::string SLASH = "/"; const char DASH = '-'; const char EXE_TYPE = 'x'; +char* UNKNOWN = "UNKNOWN"; namespace { static inline void SetFalse(bool& flag) @@ -90,6 +91,16 @@ namespace { return str; } + static inline Symbol* InitializeSymbol(unsigned long addr) { + struct Symbol* symbol = new struct Symbol(); + symbol->module = UNKNOWN; + symbol->symbolName = UNKNOWN; + symbol->fileName = UNKNOWN; + symbol->addr = addr; + symbol->offset = 0; + return symbol; + } + static void ReadProcPidMap(std::ifstream& file, std::vector>& modVec) { char line[MAX_LINUX_SYMBOL_LEN]; @@ -269,15 +280,15 @@ namespace { void SymbolUtils::FreeSymbol(struct Symbol* symbol) { - if (symbol->symbolName) { + if (symbol->symbolName && symbol->symbolName != UNKNOWN) { delete[] symbol->symbolName; symbol->symbolName = nullptr; } - if (symbol->fileName) { + if (symbol->fileName && symbol->fileName != UNKNOWN) { delete[] symbol->fileName; symbol->fileName = nullptr; } - if (symbol->module) { + if (symbol->module && symbol->fileName != UNKNOWN) { delete[] symbol->module; symbol->module = nullptr; } @@ -815,7 +826,7 @@ struct Stack* SymbolResolve::StackToHash(int pid, unsigned long* stack, int nr) if (symbol != nullptr) { current->symbol = symbol; } else { - current->symbol = nullptr; + current->symbol = InitializeSymbol(stack[i]); } AddDoubleLinkedTail(&head, ¤t); }