VirtualBox

Ignore:
Timestamp:
May 24, 2013 7:23:08 PM (12 years ago)
Author:
vboxsync
Message:

dbgmoddwarf.cpp: Fixed leakes and adjustments for loading vmlinux.

File:
1 edited

Legend:

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

    r46205 r46260  
    14711471    }
    14721472
    1473     return pThis->pImgMod->pImgVt->pfnRvaToSegOffset(pThis->pImgMod, LinkAddress, piSeg, poffSeg);
    1474     //return pThis->pImgMod->pImgVt->pfnLinkAddressToSegOffset(pThis->pImgMod, LinkAddress, piSeg, poffSeg);
     1473    //return pThis->pImgMod->pImgVt->pfnRvaToSegOffset(pThis->pImgMod, LinkAddress, piSeg, poffSeg);
     1474    return pThis->pImgMod->pImgVt->pfnLinkAddressToSegOffset(pThis->pImgMod, LinkAddress, piSeg, poffSeg);
    14751475}
    14761476
     
    23352335        RTUINTPTR   offSeg;
    23362336        rc = rtDbgModDwarfLinkAddressToSegOffset(pLnState->pDwarfMod, pLnState->Regs.uSegment, pLnState->Regs.uAddress,
    2337                                                  &iSeg, &offSeg); AssertRC(rc);
     2337                                                 &iSeg, &offSeg); /*AssertRC(rc);*/
    23382338        if (RT_SUCCESS(rc))
    23392339        {
     
    37063706                                                                     pSubProgram->PcRange.uLowAddress,
    37073707                                                                     &iSeg, &offSeg);
    3708                             AssertRC(rc);
    37093708                            if (RT_SUCCESS(rc))
    37103709                            {
     
    37143713                                AssertMsg(RT_SUCCESS(rc) || rc == VERR_DBG_DUPLICATE_SYMBOL, ("%Rrc\n", rc));
    37153714                            }
     3715                            else if (   pSubProgram->PcRange.uLowAddress  == 0 /* see with vmlinux */
     3716                                     && pSubProgram->PcRange.uHighAddress == 0)
     3717                            {
     3718                                Log5(("rtDbgModDwarfLinkAddressToSegOffset: Ignoring empty range.\n"));
     3719                                rc = VINF_SUCCESS; /* ignore */
     3720                            }
    37163721                            else
     3722                            {
     3723                                AssertRC(rc);
    37173724                                Log5(("rtDbgModDwarfLinkAddressToSegOffset failed: %Rrc\n", rc));
     3725                            }
    37183726                        }
    37193727                    }
     
    38503858
    38513859/**
     3860 * Free all children of a DIE.
     3861 *
     3862 * @param   pThis               The DWARF instance.
     3863 * @param   pParent             The parent DIE.
     3864 */
     3865static void rtDwarfInfo_FreeChildren(PRTDBGMODDWARF pThis, PRTDWARFDIE pParentDie)
     3866{
     3867    PRTDWARFDIE pChild, pNextChild;
     3868    RTListForEachSafe(&pParentDie->ChildList, pChild, pNextChild, RTDWARFDIE, SiblingNode)
     3869    {
     3870        if (!RTListIsEmpty(&pChild->ChildList))
     3871            rtDwarfInfo_FreeChildren(pThis, pChild);
     3872        RTListNodeRemove(&pChild->SiblingNode);
     3873#ifdef RTDBGMODDWARF_WITH_MEM_CACHE
     3874        RTMemCacheFree(pThis->aDieAllocators[pChild->iAllocator].hMemCache, pChild);
     3875#else
     3876        RTMemFree(pChild);
     3877#endif
     3878    }
     3879}
     3880
     3881
     3882/**
     3883 * Free a DIE an all its children.
     3884 *
     3885 * @param   pThis               The DWARF instance.
     3886 * @param   pDie                The DIE to free.
     3887 */
     3888static void rtDwarfInfo_FreeDie(PRTDBGMODDWARF pThis, PRTDWARFDIE pDie)
     3889{
     3890    rtDwarfInfo_FreeChildren(pThis, pDie);
     3891    RTListNodeRemove(&pDie->SiblingNode);
     3892#ifdef RTDBGMODDWARF_WITH_MEM_CACHE
     3893    RTMemCacheFree(pThis->aDieAllocators[pDie->iAllocator].hMemCache, pDie);
     3894#else
     3895    RTMemFree(pChild);
     3896#endif
     3897}
     3898
     3899
     3900/**
    38523901 * Skips a form.
    38533902 * @returns IPRT status code
     
    41234172            }
    41244173            cDepth--;
    4125 
    4126             /* Unlink and free child DIEs if told to do so. */
    41274174            if (!fKeepDies && pParentDie->pParent)
    4128             {
    4129                 PRTDWARFDIE pChild, pNextChild;
    4130                 RTListForEachSafe(&pParentDie->ChildList, pChild, pNextChild, RTDWARFDIE, SiblingNode)
    4131                 {
    4132                     RTListNodeRemove(&pChild->SiblingNode);
    4133 #ifdef RTDBGMODDWARF_WITH_MEM_CACHE
    4134                     RTMemCacheFree(pThis->aDieAllocators[pChild->iAllocator].hMemCache, pChild);
    4135 #else
    4136                     RTMemFree(pChild);
    4137 #endif
    4138                 }
    4139             }
     4175                rtDwarfInfo_FreeChildren(pThis, pParentDie);
    41404176        }
    41414177        else
     
    41814217            if (RT_FAILURE(rc))
    41824218                return rc;
     4219
     4220            if (!fKeepDies && !pAbbrev->fChildren)
     4221                rtDwarfInfo_FreeDie(pThis, pNewDie);
    41834222        }
    41844223    } /* while more DIEs */
     4224
     4225
     4226    /* Unlink and free child DIEs if told to do so. */
     4227    if (!fKeepDies)
     4228        rtDwarfInfo_FreeChildren(pThis, &pUnit->Core);
    41854229
    41864230    return RT_SUCCESS(rc) ? pCursor->rc : rc;
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