VirtualBox

Ignore:
Timestamp:
Jul 21, 2013 9:59:53 PM (11 years ago)
Author:
vboxsync
Message:

Fixes related to reading symbols from a 64-bit linux kernel (3.7).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/common/dbg/dbgmoddwarf.cpp

    r47057 r47290  
    388388typedef struct RTDWARFABBREV
    389389{
    390     /** Whether this entry is filled in or not. */
    391     bool                fFilled;
    392390    /** Whether there are children or not. */
    393391    bool                fChildren;
     
    396394    /** Offset into the abbrev section of the specification pairs. */
    397395    uint32_t            offSpec;
     396    /** The abbreviation table offset this is entry is valid for.
     397     * UINT32_MAX if not valid. */
     398    uint32_t            offAbbrev;
    398399} RTDWARFABBREV;
    399400/** Pointer to an abbreviation cache entry. */
     
    453454    /** The number of cached abbreviations we've allocated space for. */
    454455    uint32_t                cCachedAbbrevsAlloced;
    455     /** Used for range checking cache lookups. */
    456     uint32_t                cCachedAbbrevs;
    457456    /** Array of cached abbreviations, indexed by code. */
    458457    PRTDWARFABBREV          paCachedAbbrevs;
     
    28382837    if (pThis->cCachedAbbrevsAlloced < uCode)
    28392838    {
    2840         if (uCode > _64K)
     2839        if (uCode >= _64K)
    28412840            fFillCache = false;
    28422841        else
     
    28482847            else
    28492848            {
     2849                Log(("rtDwarfAbbrev_LookupMiss: Growing from %u to %u...\n", pThis->cCachedAbbrevsAlloced, cNew));
     2850                pThis->paCachedAbbrevs       = (PRTDWARFABBREV)pv;
     2851                for (uint32_t i = pThis->cCachedAbbrevsAlloced; i < cNew; i++)
     2852                    pThis->paCachedAbbrevs[i].offAbbrev = UINT32_MAX;
    28502853                pThis->cCachedAbbrevsAlloced = cNew;
    2851                 pThis->paCachedAbbrevs       = (PRTDWARFABBREV)pv;
    28522854            }
    28532855        }
     
    28672869        /*
    28682870         * Search for the entry and fill the cache while doing so.
     2871         * We assume that abbreviation codes for a unit will stop when we see
     2872         * zero code or when the code value drops.
    28692873         */
     2874        uint32_t uPrevCode = 0;
    28702875        for (;;)
    28712876        {
    28722877            /* Read the 'header'. Skipping zero code bytes. */
    2873             uint32_t const uCurCode  = rtDwarfCursor_GetULeb128AsU32(&Cursor, 0);
     2878            uint32_t const uCurCode = rtDwarfCursor_GetULeb128AsU32(&Cursor, 0);
     2879            if (pRet && (uCurCode == 0 || uCurCode < uPrevCode))
     2880                break; /* probably end of unit. */
    28742881            if (uCurCode != 0)
    28752882            {
     
    28892896                {
    28902897                    PRTDWARFABBREV pEntry = &pThis->paCachedAbbrevs[uCurCode - 1];
    2891                     while (pThis->cCachedAbbrevs < uCurCode)
     2898                    if (pEntry->offAbbrev != pThis->offCachedAbbrev)
    28922899                    {
    2893                         pThis->paCachedAbbrevs[pThis->cCachedAbbrevs].fFilled = false;
    2894                         pThis->cCachedAbbrevs++;
     2900                        pEntry->offAbbrev = pThis->offCachedAbbrev;
     2901                        pEntry->fChildren = RT_BOOL(uChildren);
     2902                        pEntry->uTag      = uCurTag;
     2903                        pEntry->offSpec   = rtDwarfCursor_CalcSectOffsetU32(&Cursor);
     2904
     2905                        if (uCurCode == uCode)
     2906                        {
     2907                            Assert(!pRet);
     2908                            pRet = pEntry;
     2909                            if (uCurCode == pThis->cCachedAbbrevsAlloced)
     2910                                break;
     2911                        }
    28952912                    }
    2896 
    2897                     pEntry->fFilled   = true;
    2898                     pEntry->fChildren = RT_BOOL(uChildren);
    2899                     pEntry->uTag      = uCurTag;
    2900                     pEntry->offSpec   = rtDwarfCursor_CalcSectOffsetU32(&Cursor);
    2901 
    2902                     if (uCurCode == uCode)
    2903                     {
    2904                         pRet = pEntry;
    2905                         if (uCurCode == pThis->cCachedAbbrevsAlloced)
    2906                             break;
    2907                     }
     2913                    else if (pRet)
     2914                        break; /* Next unit, don't cache more. */
     2915                    /* else: We're growing the cache and re-reading old data. */
    29082916                }
    29092917
     
    29492957            {
    29502958                pRet = &pThis->LookupAbbrev;
    2951                 pRet->fFilled   = true;
    29522959                pRet->fChildren = RT_BOOL(uChildren);
    29532960                pRet->uTag      = uCurTag;
    29542961                pRet->offSpec   = rtDwarfCursor_CalcSectOffsetU32(&Cursor);
     2962                pRet->offAbbrev = pThis->offCachedAbbrev;
    29552963                break;
    29562964            }
     
    29832991static PCRTDWARFABBREV rtDwarfAbbrev_Lookup(PRTDBGMODDWARF pThis, uint32_t uCode)
    29842992{
    2985     if (   uCode - 1 >= pThis->cCachedAbbrevs
    2986         || !pThis->paCachedAbbrevs[uCode - 1].fFilled)
     2993    if (   uCode - 1 >= pThis->cCachedAbbrevsAlloced
     2994        || pThis->paCachedAbbrevs[uCode - 1].offAbbrev != pThis->offCachedAbbrev)
    29872995        return rtDwarfAbbrev_LookupMiss(pThis, uCode);
    29882996    return &pThis->paCachedAbbrevs[uCode - 1];
     
    29933001 * Sets the abbreviation offset of the current unit.
    29943002 *
    2995  * This will flush the cached abbreviation entries if the offset differs from
    2996  * the previous unit.
    2997  *
    29983003 * @param   pThis               The DWARF instance.
    29993004 * @param   offAbbrev           The offset into the abbreviation section.
     
    30013006static void rtDwarfAbbrev_SetUnitOffset(PRTDBGMODDWARF pThis, uint32_t offAbbrev)
    30023007{
    3003     if (pThis->offCachedAbbrev != offAbbrev)
    3004     {
    3005         pThis->offCachedAbbrev = offAbbrev;
    3006         pThis->cCachedAbbrevs  = 0;
    3007     }
     3008    pThis->offCachedAbbrev = offAbbrev;
    30083009}
    30093010
     
    42844285        {
    42854286            /* End of siblings, up one level. (Is this correct?) */
    4286             pParentDie = pParentDie->pParent;
    4287             if (!pParentDie)
     4287            if (pParentDie->pParent)
    42884288            {
    4289                 /* Padding. */
    4290                 while (!rtDwarfCursor_IsAtEndOfUnit(pCursor))
    4291                 {
    4292                     uAbbrCode = rtDwarfCursor_GetULeb128AsU32(pCursor, UINT32_MAX);
    4293                     if (uAbbrCode)
    4294                     {
    4295                         Log(("%08x: End of DIE stack, but still more info to parse: uAbbrCode=%#x (+%u bytes).\n",
    4296                              offLog, uAbbrCode, pCursor->cbUnitLeft));
    4297                         return VERR_DWARF_BAD_INFO;
    4298                     }
    4299                 }
    4300                 break;
     4289                pParentDie = pParentDie->pParent;
     4290                cDepth--;
     4291                if (!fKeepDies && pParentDie->pParent)
     4292                    rtDwarfInfo_FreeChildren(pThis, pParentDie);
    43014293            }
    4302             cDepth--;
    4303             if (!fKeepDies && pParentDie->pParent)
    4304                 rtDwarfInfo_FreeChildren(pThis, pParentDie);
    43054294        }
    43064295        else
     
    43264315                pDieDesc = g_aTagDescs[0].pDesc;
    43274316            }
    4328             Log4(("%08x: %*stag=%s (%#x)%s\n", offLog, cDepth * 2, "", pszName,
    4329                   pAbbrev->uTag, pAbbrev->fChildren ? " has children" : ""));
     4317            Log4(("%08x: %*stag=%s (%#x, abbrev %u)%s\n", offLog, cDepth * 2, "", pszName,
     4318                  pAbbrev->uTag, uAbbrCode, pAbbrev->fChildren ? " has children" : ""));
    43304319
    43314320            /*
     
    47564745                     * Free the cached abbreviations and unload all sections.
    47574746                     */
    4758                     pThis->cCachedAbbrevs = pThis->cCachedAbbrevsAlloced = 0;
     4747                    pThis->cCachedAbbrevsAlloced = 0;
    47594748                    RTMemFree(pThis->paCachedAbbrevs);
     4749                    pThis->paCachedAbbrevs = NULL;
    47604750
    47614751                    for (unsigned iSect = 0; iSect < RT_ELEMENTS(pThis->aSections); iSect++)
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette