167
167
/* make new symbol space node. */
168
PDBGFSYMSPACE pName = (PDBGFSYMSPACE)MMR3HeapAlloc(pVM, MM_TAG_DBGF_SYMBOL, sizeof(*pName) + cchName);
168
pName = (PDBGFSYMSPACE)MMR3HeapAlloc(pVM, MM_TAG_DBGF_SYMBOL, sizeof(*pName) + cchName);
171
171
pName->Core.pszString = (char *)memcpy(pName + 1, pszName, cchName);
230
230
static char *dbgfR3Strip(char *psz)
232
while (*psz && isspace(*psz))
232
while (*psz && RT_C_IS_SPACE(*psz))
234
234
char *psz2 = strchr(psz, '\0') - 1;
235
while (psz2 >= psz && isspace(*psz2))
235
while (psz2 >= psz && RT_C_IS_SPACE(*psz2))
454
454
|| strstr(szHead, "Linker script and memory map"))
455
455
return SYMFILETYPE_LD_MAP;
457
if ( isxdigit(szHead[0])
458
&& isxdigit(szHead[1])
459
&& isxdigit(szHead[2])
460
&& isxdigit(szHead[3])
461
&& isxdigit(szHead[4])
462
&& isxdigit(szHead[5])
463
&& isxdigit(szHead[6])
464
&& isxdigit(szHead[7])
457
if ( RT_C_IS_XDIGIT(szHead[0])
458
&& RT_C_IS_XDIGIT(szHead[1])
459
&& RT_C_IS_XDIGIT(szHead[2])
460
&& RT_C_IS_XDIGIT(szHead[3])
461
&& RT_C_IS_XDIGIT(szHead[4])
462
&& RT_C_IS_XDIGIT(szHead[5])
463
&& RT_C_IS_XDIGIT(szHead[6])
464
&& RT_C_IS_XDIGIT(szHead[7])
465
465
&& szHead[8] == ' '
466
&& isalpha(szHead[9])
466
&& RT_C_IS_ALPHA(szHead[9])
467
467
&& szHead[10] == ' '
468
&& (isalpha(szHead[11]) || szHead[11] == '_' || szHead[11] == '$')
468
&& (RT_C_IS_ALPHA(szHead[11]) || szHead[11] == '_' || szHead[11] == '$')
470
470
return SYMFILETYPE_LINUX_SYSTEM_MAP;
472
if ( isxdigit(szHead[0])
473
&& isxdigit(szHead[1])
474
&& isxdigit(szHead[2])
475
&& isxdigit(szHead[3])
476
&& isxdigit(szHead[4])
477
&& isxdigit(szHead[5])
478
&& isxdigit(szHead[6])
479
&& isxdigit(szHead[7])
480
&& isxdigit(szHead[8])
481
&& isxdigit(szHead[9])
482
&& isxdigit(szHead[10])
483
&& isxdigit(szHead[11])
484
&& isxdigit(szHead[12])
485
&& isxdigit(szHead[13])
486
&& isxdigit(szHead[14])
487
&& isxdigit(szHead[15])
472
if ( RT_C_IS_XDIGIT(szHead[0])
473
&& RT_C_IS_XDIGIT(szHead[1])
474
&& RT_C_IS_XDIGIT(szHead[2])
475
&& RT_C_IS_XDIGIT(szHead[3])
476
&& RT_C_IS_XDIGIT(szHead[4])
477
&& RT_C_IS_XDIGIT(szHead[5])
478
&& RT_C_IS_XDIGIT(szHead[6])
479
&& RT_C_IS_XDIGIT(szHead[7])
480
&& RT_C_IS_XDIGIT(szHead[8])
481
&& RT_C_IS_XDIGIT(szHead[9])
482
&& RT_C_IS_XDIGIT(szHead[10])
483
&& RT_C_IS_XDIGIT(szHead[11])
484
&& RT_C_IS_XDIGIT(szHead[12])
485
&& RT_C_IS_XDIGIT(szHead[13])
486
&& RT_C_IS_XDIGIT(szHead[14])
487
&& RT_C_IS_XDIGIT(szHead[15])
488
488
&& szHead[16] == ' '
489
&& isalpha(szHead[17])
489
&& RT_C_IS_ALPHA(szHead[17])
490
490
&& szHead[18] == ' '
491
&& (isalpha(szHead[19]) || szHead[19] == '_' || szHead[19] == '$')
491
&& (RT_C_IS_ALPHA(szHead[19]) || szHead[19] == '_' || szHead[19] == '$')
493
493
return SYMFILETYPE_LINUX_SYSTEM_MAP;
957
* Duplicates a symbol.
959
* @returns Pointer to the duplicated symbol.
960
* @param pVM The VM handle.
961
* @param pSymbol The symbol to duplicate.
963
static PDBGFSYMBOL dbgfR3SymbolDup(PVM pVM, PCDBGFSYMBOL pSymbol)
965
size_t cb = strlen(pSymbol->szName) + RT_OFFSETOF(DBGFSYMBOL, szName[1]);
966
PDBGFSYMBOL pDup = (PDBGFSYMBOL)MMR3HeapAlloc(pVM, MM_TAG_DBGF_SYMBOL_DUP, cb);
968
memcpy(pDup, pSymbol, cb);
974
* Find symbol by address (nearest), allocate return buffer.
976
* @returns Pointer to the symbol. Must be freed using DBGFR3SymbolFree().
977
* @returns NULL if the symbol was not found or if we're out of memory.
978
* @param pVM VM handle.
979
* @param Address Address.
980
* @param poffDisplacement Where to store the symbol displacement from Address.
982
VMMR3DECL(PDBGFSYMBOL) DBGFR3SymbolByAddrAlloc(PVM pVM, RTGCUINTPTR Address, PRTGCINTPTR poffDisplacement)
985
int rc = DBGFR3SymbolByAddr(pVM, Address, poffDisplacement, &Symbol);
988
return dbgfR3SymbolDup(pVM, &Symbol);
993
* Find symbol by name (first), allocate return buffer.
995
* @returns Pointer to the symbol. Must be freed using DBGFR3SymbolFree().
996
* @returns NULL if the symbol was not found or if we're out of memory.
997
* @param pVM VM handle.
998
* @param pszSymbol Symbol name.
1000
VMMR3DECL(PDBGFSYMBOL) DBGFR3SymbolByNameAlloc(PVM pVM, const char *pszSymbol)
1003
int rc = DBGFR3SymbolByName(pVM, pszSymbol, &Symbol);
1006
return dbgfR3SymbolDup(pVM, &Symbol);
1011
* Frees a symbol returned by DBGFR3SymbolbyNameAlloc() or DBGFR3SymbolByAddressAlloc().
1013
* @param pSymbol Pointer to the symbol.
1015
VMMR3DECL(void) DBGFR3SymbolFree(PDBGFSYMBOL pSymbol)
1018
MMR3HeapFree(pSymbol);
1023
957
* Find line by address (nearest).
1025
959
* @returns VBox status.