VirtualBox

Changeset 46078 in vbox for trunk/src/VBox/Runtime/common


Ignore:
Timestamp:
May 14, 2013 6:22:53 PM (12 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
85754
Message:

More debugging fixes.

Location:
trunk/src/VBox/Runtime/common
Files:
3 edited

Legend:

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

    r46074 r46078  
    11601160    if (RT_SUCCESS(rc))
    11611161    {
    1162         if (   pThis->pfnLogCallback != NULL
    1163             && (  pfnCallback == NULL
    1164                 || pfnCallback == pThis->pfnLogCallback) )
     1162        if (   pThis->pfnLogCallback == NULL
     1163            || pfnCallback == NULL
     1164            || pfnCallback == pThis->pfnLogCallback)
    11651165        {
    11661166            pThis->pfnLogCallback = NULL;
  • trunk/src/VBox/Runtime/common/dbg/dbgmoddbghelp.cpp

    r46048 r46078  
    345345static DECLCALLBACK(int) rtDbgModDbgHelpAddSegmentsCallback(RTLDRMOD hLdrMod, PCRTLDRSEG pSeg, void *pvUser)
    346346{
    347     RTDBGMOD hCnt = (RTDBGMOD)pvUser;
     347    RTDBGMODBGHELPARGS *pArgs = (RTDBGMODBGHELPARGS *)pvUser;
    348348
    349349    Log(("Segment %.*s: LinkAddress=%#llx RVA=%#llx cb=%#llx\n",
    350350         pSeg->cchName, pSeg->pchName, (uint64_t)pSeg->LinkAddress, (uint64_t)pSeg->RVA, pSeg->cb));
     351
     352    if (!pSeg->RVA)
     353        pArgs->uModAddr = pSeg->LinkAddress;
     354
    351355    NOREF(hLdrMod);
    352356    char *pszName = (char *)pSeg->pchName;
     
    359363
    360364    RTLDRADDR cb = RT_MAX(pSeg->cb, pSeg->cbMapped);
    361     return RTDbgModSegmentAdd(hCnt, pSeg->RVA, cb, pszName, 0 /*fFlags*/, NULL);
     365    return RTDbgModSegmentAdd(pArgs->hCnt, pSeg->RVA, cb, pszName, 0 /*fFlags*/, NULL);
    362366}
    363367
     
    375379
    376380    /*
    377      * Try load the module into an empty address space.
     381     * Create a container for copying the information into.  We do this early
     382     * so we can determine the image base address.
    378383     */
    379     static uint32_t volatile s_uFakeHandle = 0x3940000;
    380     HANDLE hFake;
    381     do
    382         hFake = (HANDLE)(uintptr_t)ASMAtomicIncU32(&s_uFakeHandle);
    383     while (hFake == NULL || hFake == INVALID_HANDLE_VALUE);
    384 
    385     int rc;
    386     if (SymInitialize(hFake, NULL /*SearchPath*/, FALSE /*fInvalidProcess*/))
     384    RTDBGMOD hCnt;
     385    int rc = RTDbgModCreate(&hCnt, pMod->pszName, 0 /*cbSeg*/, 0 /*fFlags*/);
     386    if (RT_SUCCESS(rc))
    387387    {
    388         SymSetOptions(SYMOPT_LOAD_LINES | SymGetOptions());
    389 
    390         PRTUTF16 pwszDbgFile;
    391         rc = RTStrToUtf16(pMod->pszDbgFile, &pwszDbgFile);
     388        RTDBGMODBGHELPARGS Args;
     389        RT_ZERO(Args);
     390        Args.hCnt = hCnt;
     391        rc = pMod->pImgVt->pfnEnumSegments(pMod, rtDbgModDbgHelpAddSegmentsCallback, &Args);
    392392        if (RT_SUCCESS(rc))
    393393        {
    394             uint64_t uModAddr = SymLoadModuleExW(hFake, NULL /*hFile*/, pwszDbgFile, NULL /*pszModName*/,
    395                                                  0 /*uLoadAddr*/, 0 /*cbImage*/, NULL /*pModData*/, 0 /*fFlags*/);
    396             if (uModAddr != 0)
     394            uint32_t cbImage    = pMod->pImgVt->pfnImageSize(pMod);
     395            uint64_t uImageBase = Args.uModAddr ? Args.uModAddr : 0x4000000;
     396
     397            /*
     398             * Try load the module into an empty address space.
     399             */
     400            static uint32_t volatile s_uFakeHandle = 0x3940000;
     401            HANDLE hFake;
     402            do
     403                hFake = (HANDLE)(uintptr_t)ASMAtomicIncU32(&s_uFakeHandle);
     404            while (hFake == NULL || hFake == INVALID_HANDLE_VALUE);
     405
     406            if (SymInitialize(hFake, NULL /*SearchPath*/, FALSE /*fInvalidProcess*/))
    397407            {
    398                 /*
    399                  * Create a container for copying the information into.
    400                  */
    401                 RTDBGMOD hCnt;
    402                 rc = RTDbgModCreate(&hCnt, pMod->pszName, 0 /*cbSeg*/, 0 /*fFlags*/);
     408                SymSetOptions(SYMOPT_LOAD_LINES | SymGetOptions());
     409
     410                PRTUTF16 pwszDbgFile;
     411                rc = RTStrToUtf16(pMod->pszDbgFile, &pwszDbgFile);
    403412                if (RT_SUCCESS(rc))
    404413                {
    405                     rc = pMod->pImgVt->pfnEnumSegments(pMod, rtDbgModDbgHelpAddSegmentsCallback, hCnt);
    406                     if (RT_SUCCESS(rc))
     414                    uint64_t uModAddr = SymLoadModuleExW(hFake, NULL /*hFile*/, pwszDbgFile, NULL /*pszModName*/,
     415                                                         uImageBase, cbImage, NULL /*pModData*/, 0 /*fFlags*/);
     416                    if (uModAddr != 0)
     417                    {
    407418                        rc = rtDbgModDbgHelpCopySymbols(pMod, hCnt, hFake, uModAddr);
    408                     if (RT_SUCCESS(rc))
    409                         rc = rtDbgModDbgHelpCopyLineNumbers(pMod, hCnt, hFake, uModAddr);
    410                     if (RT_SUCCESS(rc))
    411                     {
    412                         pMod->pvDbgPriv = hCnt;
    413                         pMod->pDbgVt    = &g_rtDbgModVtDbgDbgHelp;
    414                         hCnt = NIL_RTDBGMOD;
     419                        if (RT_SUCCESS(rc))
     420                            rc = rtDbgModDbgHelpCopyLineNumbers(pMod, hCnt, hFake, uModAddr);
     421                        if (RT_SUCCESS(rc))
     422                        {
     423                            pMod->pvDbgPriv = hCnt;
     424                            pMod->pDbgVt    = &g_rtDbgModVtDbgDbgHelp;
     425                            hCnt = NIL_RTDBGMOD;
     426                        }
     427
     428                        SymUnloadModule64(hFake, uModAddr);
    415429                    }
    416                     RTDbgModRelease(hCnt);
     430                    else
     431                        rc = RTErrConvertFromWin32(GetLastError());
     432                    RTUtf16Free(pwszDbgFile);
    417433                }
    418434
    419                 SymUnloadModule64(hFake, uModAddr);
     435                BOOL fRc2 = SymCleanup(hFake); Assert(fRc2); NOREF(fRc2);
    420436            }
    421437            else
    422438                rc = RTErrConvertFromWin32(GetLastError());
    423             RTUtf16Free(pwszDbgFile);
    424439        }
    425 
    426         BOOL fRc2 = SymCleanup(hFake); Assert(fRc2); NOREF(fRc2);
     440        RTDbgModRelease(hCnt);
    427441    }
    428     else
    429         rc = RTErrConvertFromWin32(GetLastError());
    430442    return rc;
    431443}
  • trunk/src/VBox/Runtime/common/ldr/ldrPE.cpp

    r46048 r46078  
    942942    SegInfo.fProt       = RTMEM_PROT_READ;
    943943    SegInfo.Alignment   = 1;
    944     SegInfo.LinkAddress = 0;
    945     SegInfo.RVA         = SegInfo.LinkAddress;
     944    SegInfo.LinkAddress = pModPe->uImageBase;
     945    SegInfo.RVA         = 0;
    946946    SegInfo.offFile     = 0;
    947947    SegInfo.cb          = pModPe->cbHeaders;
     
    981981        else
    982982        {
    983             SegInfo.LinkAddress = pSh->VirtualAddress;
    984             SegInfo.RVA         = SegInfo.LinkAddress;
     983            SegInfo.LinkAddress = pSh->VirtualAddress + pModPe->uImageBase ;
     984            SegInfo.RVA         = pSh->VirtualAddress;
    985985            SegInfo.cbMapped    = RT_ALIGN(SegInfo.cb, SegInfo.Alignment);
    986986            if (i + 1 < pModPe->cSections && !(pSh[1].Characteristics & IMAGE_SCN_TYPE_NOLOAD))
     
    10121012    PRTLDRMODPE pModPe = (PRTLDRMODPE)pMod;
    10131013
    1014     /* Note! LinkAddress == RVA */
     1014    LinkAddress -= pModPe->uImageBase;
    10151015
    10161016    /* Special header segment. */
     
    10511051    PRTLDRMODPE pModPe = (PRTLDRMODPE)pMod;
    10521052
     1053    LinkAddress -= pModPe->uImageBase;
    10531054    if (LinkAddress > pModPe->cbImage)
    10541055        return VERR_LDR_INVALID_LINK_ADDRESS;
    10551056    *pRva = LinkAddress;
     1057
    10561058    return VINF_SUCCESS;
    10571059}
     
    10821084                                                uint32_t *piSeg, PRTLDRADDR poffSeg)
    10831085{
    1084     int rc = rtldrPE_LinkAddressToSegOffset(pMod, Rva, piSeg, poffSeg);
     1086    PRTLDRMODPE pModPe = (PRTLDRMODPE)pMod;
     1087    int rc = rtldrPE_LinkAddressToSegOffset(pMod, Rva + pModPe->uImageBase, piSeg, poffSeg);
    10851088    if (RT_FAILURE(rc))
    10861089        rc = VERR_LDR_INVALID_RVA;
Note: See TracChangeset for help on using the changeset viewer.

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