dbgmodcontainer.cpp revision ca3da10d05961c339b5180fbd40a54587d6bad35
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync/*******************************************************************************
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync* Header Files *
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync*******************************************************************************/
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync#include <iprt/dbg.h>
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync#include <iprt/avl.h>
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync#include <iprt/err.h>
de6e321f351aa489a6a62bed474390a0056e8093vboxsync#include <iprt/mem.h>
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync#include <iprt/string.h>
7af218a7441de38fc9e814919db04bae3e917664vboxsync#include <iprt/strcache.h>
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync#include "internal/dbgmod.h"
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync
de6e321f351aa489a6a62bed474390a0056e8093vboxsync/*******************************************************************************
de6e321f351aa489a6a62bed474390a0056e8093vboxsync* Structures and Typedefs *
de6e321f351aa489a6a62bed474390a0056e8093vboxsync*******************************************************************************/
de6e321f351aa489a6a62bed474390a0056e8093vboxsync/**
de6e321f351aa489a6a62bed474390a0056e8093vboxsync * Symbol entry.
de6e321f351aa489a6a62bed474390a0056e8093vboxsync */
de6e321f351aa489a6a62bed474390a0056e8093vboxsynctypedef struct RTDBGMODCONTAINERSYMBOL
de6e321f351aa489a6a62bed474390a0056e8093vboxsync{
de6e321f351aa489a6a62bed474390a0056e8093vboxsync /** The address core. */
de6e321f351aa489a6a62bed474390a0056e8093vboxsync AVLRUINTPTRNODECORE AddrCore;
de6e321f351aa489a6a62bed474390a0056e8093vboxsync /** The name space core. */
de6e321f351aa489a6a62bed474390a0056e8093vboxsync RTSTRSPACECORE NameCore;
de6e321f351aa489a6a62bed474390a0056e8093vboxsync /** The segment index. */
de6e321f351aa489a6a62bed474390a0056e8093vboxsync RTDBGSEGIDX iSeg;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync /** The symbol flags. */
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync uint32_t fFlags;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync /** The symbol size.
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync * This may be zero while the range in AddrCore indicates 0. */
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync RTUINTPTR cb;
de6e321f351aa489a6a62bed474390a0056e8093vboxsync} RTDBGMODCONTAINERSYMBOL;
de6e321f351aa489a6a62bed474390a0056e8093vboxsync/** Pointer to a symbol entry in the debug info container. */
de6e321f351aa489a6a62bed474390a0056e8093vboxsynctypedef RTDBGMODCONTAINERSYMBOL *PRTDBGMODCONTAINERSYMBOL;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync/** Pointer to a const symbol entry in the debug info container. */
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsynctypedef RTDBGMODCONTAINERSYMBOL const *PCRTDBGMODCONTAINERSYMBOL;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync/**
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync * Line number entry.
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync */
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsynctypedef struct RTDBGMODCONTAINERLINE
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync{
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync /** The address core.
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync * The Key is the address of the line number. */
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync AVLUINTPTRNODECORE AddrCore;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync /** Pointer to the file name (in string cache). */
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync const char *pszFile;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync /** The line number. */
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync uint32_t uLineNo;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync} RTDBGMODCONTAINERLINE;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync/** Pointer to a line number entry. */
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsynctypedef RTDBGMODCONTAINERLINE *PRTDBGMODCONTAINERLINE;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync/** Pointer to const a line number entry. */
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsynctypedef RTDBGMODCONTAINERLINE const *PCRTDBGMODCONTAINERLINE;
de6e321f351aa489a6a62bed474390a0056e8093vboxsync
de6e321f351aa489a6a62bed474390a0056e8093vboxsync/**
de6e321f351aa489a6a62bed474390a0056e8093vboxsync * Segment entry.
de6e321f351aa489a6a62bed474390a0056e8093vboxsync */
de6e321f351aa489a6a62bed474390a0056e8093vboxsynctypedef struct RTDBGMODCONTAINERSEGMENT
de6e321f351aa489a6a62bed474390a0056e8093vboxsync{
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync /** The symbol address space tree. */
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync AVLRUINTPTRTREE SymAddrTree;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync /** The line number address space tree. */
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync AVLUINTPTRTREE LineAddrTree;
de6e321f351aa489a6a62bed474390a0056e8093vboxsync /** The segment offset. */
de6e321f351aa489a6a62bed474390a0056e8093vboxsync RTUINTPTR off;
de6e321f351aa489a6a62bed474390a0056e8093vboxsync /** The segment size. */
de6e321f351aa489a6a62bed474390a0056e8093vboxsync RTUINTPTR cb;
de6e321f351aa489a6a62bed474390a0056e8093vboxsync /** The segment name. */
de6e321f351aa489a6a62bed474390a0056e8093vboxsync const char *pszName;
de6e321f351aa489a6a62bed474390a0056e8093vboxsync} RTDBGMODCONTAINERSEGMENT;
de6e321f351aa489a6a62bed474390a0056e8093vboxsync/** Pointer to a segment entry in the debug info container. */
de6e321f351aa489a6a62bed474390a0056e8093vboxsynctypedef RTDBGMODCONTAINERSEGMENT *PRTDBGMODCONTAINERSEGMENT;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync/** Pointer to a const segment entry in the debug info container. */
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsynctypedef RTDBGMODCONTAINERSEGMENT const *PCRTDBGMODCONTAINERSEGMENT;
de6e321f351aa489a6a62bed474390a0056e8093vboxsync
de6e321f351aa489a6a62bed474390a0056e8093vboxsync/**
de6e321f351aa489a6a62bed474390a0056e8093vboxsync * Instance data.
de6e321f351aa489a6a62bed474390a0056e8093vboxsync */
de6e321f351aa489a6a62bed474390a0056e8093vboxsynctypedef struct RTDBGMODCONTAINER
de6e321f351aa489a6a62bed474390a0056e8093vboxsync{
de6e321f351aa489a6a62bed474390a0056e8093vboxsync /** The name space. */
de6e321f351aa489a6a62bed474390a0056e8093vboxsync RTSTRSPACE Names;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync /** Tree containing any absolute addresses. */
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync AVLRUINTPTRTREE AbsAddrTree;
de6e321f351aa489a6a62bed474390a0056e8093vboxsync /** Segment table. */
de6e321f351aa489a6a62bed474390a0056e8093vboxsync PRTDBGMODCONTAINERSEGMENT paSegs;
de6e321f351aa489a6a62bed474390a0056e8093vboxsync /** The number of segments in the segment table. */
de6e321f351aa489a6a62bed474390a0056e8093vboxsync RTDBGSEGIDX cSegs;
de6e321f351aa489a6a62bed474390a0056e8093vboxsync /** The image size. 0 means unlimited. */
de6e321f351aa489a6a62bed474390a0056e8093vboxsync RTUINTPTR cb;
de6e321f351aa489a6a62bed474390a0056e8093vboxsync} RTDBGMODCONTAINER;
de6e321f351aa489a6a62bed474390a0056e8093vboxsync/** Pointer to instance data for the debug info container. */
de6e321f351aa489a6a62bed474390a0056e8093vboxsynctypedef RTDBGMODCONTAINER *PRTDBGMODCONTAINER;
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync
de6e321f351aa489a6a62bed474390a0056e8093vboxsync
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync/**
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync * Fills in a RTDBGSYMBOL structure.
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync *
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync * @returns VINF_SUCCESS.
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync * @param pMySym Our internal symbol representation.
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync * @param pExtSym The external symbol representation.
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync */
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsyncDECLINLINE(int) rtDbgModContainerReturnSymbol(PCRTDBGMODCONTAINERSYMBOL pMySym, PRTDBGSYMBOL pExtSym)
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync{
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync pExtSym->Value = pMySym->AddrCore.Key;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync pExtSym->offSeg = pMySym->AddrCore.Key;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync pExtSym->iSeg = pMySym->iSeg;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync pExtSym->fFlags = pMySym->fFlags;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync pExtSym->cb = pMySym->cb;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync Assert(pMySym->NameCore.cchString < sizeof(pExtSym->szName));
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync memcpy(pExtSym->szName, pMySym->NameCore.pszString, pMySym->NameCore.cchString + 1);
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync return VINF_SUCCESS;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync}
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync
de6e321f351aa489a6a62bed474390a0056e8093vboxsync
de6e321f351aa489a6a62bed474390a0056e8093vboxsync/** @copydoc RTDBGMODVTDBG::pfnLineByAddr */
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsyncstatic DECLCALLBACK(int) rtDbgModContainer_LineByAddr(PRTDBGMODINT pMod, RTDBGSEGIDX iSeg, RTUINTPTR off,
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync PRTINTPTR poffDisp, PRTDBGLINE pLine)
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync{
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync PRTDBGMODCONTAINER pThis = (PRTDBGMODCONTAINER)pMod->pvDbgPriv;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync /*
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync * Validate the input address.
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync */
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync AssertMsgReturn(iSeg < pThis->cSegs,
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync ("iSeg=%#x cSegs=%#x\n", pThis->cSegs),
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync VERR_DBG_INVALID_SEGMENT_INDEX);
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync AssertMsgReturn(pThis->paSegs[iSeg].cb < off,
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync ("off=%RTptr cbSeg=%RTptr\n", off, pThis->paSegs[iSeg].cb),
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync VERR_DBG_INVALID_SEGMENT_OFFSET);
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync /*
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync * Lookup the nearest line number with an address less or equal to the specified address.
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync */
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync PAVLUINTPTRNODECORE pAvlCore = RTAvlUIntPtrGetBestFit(&pThis->paSegs[iSeg].LineAddrTree, off, false /*fAbove*/);
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync if (!pAvlCore)
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync return VERR_SYMBOL_NOT_FOUND;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync PCRTDBGMODCONTAINERLINE pMyLine = RT_FROM_MEMBER(pAvlCore, RTDBGMODCONTAINERLINE const, AddrCore);
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync if (poffDisp)
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync *poffDisp = off - pMyLine->AddrCore.Key;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync pLine->Address = pMyLine->AddrCore.Key;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync pLine->offSeg = pMyLine->AddrCore.Key;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync pLine->iSeg = iSeg;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync pLine->uLineNo = pMyLine->uLineNo;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync strcpy(pLine->szFilename, pMyLine->pszFile);
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync return VINF_SUCCESS;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync}
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync/** @copydoc RTDBGMODVTDBG::pfnLineAdd */
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsyncstatic DECLCALLBACK(int) rtDbgModContainer_LineAdd(PRTDBGMODINT pMod, const char *pszFile, size_t cchFile, uint32_t uLineNo,
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync uint32_t iSeg, RTUINTPTR off)
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync{
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync PRTDBGMODCONTAINER pThis = (PRTDBGMODCONTAINER)pMod->pvDbgPriv;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync /*
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync * Validate the input address.
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync */
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync AssertMsgReturn(iSeg < pThis->cSegs, ("iSeg=%#x cSegs=%#x\n", pThis->cSegs),
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync VERR_DBG_INVALID_SEGMENT_INDEX);
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync AssertMsgReturn(pThis->paSegs[iSeg].cb < off, ("off=%RTptr cbSeg=%RTptr\n", off, pThis->paSegs[iSeg].cb),
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync VERR_DBG_INVALID_SEGMENT_OFFSET);
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync /*
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync * Create a new entry.
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync */
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync PRTDBGMODCONTAINERLINE pLine = (PRTDBGMODCONTAINERLINE)RTMemAllocZ(sizeof(*pLine));
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync if (!pLine)
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync return VERR_NO_MEMORY;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync pLine->AddrCore.Key = off;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync pLine->uLineNo = uLineNo;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync pLine->pszFile = RTStrCacheEnterN(g_hDbgModStrCache, pszFile, cchFile);
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync int rc;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync if (pLine->pszFile)
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync {
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync if (RTAvlUIntPtrInsert(&pThis->paSegs[iSeg].LineAddrTree, &pLine->AddrCore))
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync return VINF_SUCCESS;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync /* bail out */
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync rc = VERR_DBG_ADDRESS_CONFLICT;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync RTStrCacheRelease(g_hDbgModStrCache, pLine->pszFile);
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync }
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync else
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync rc = VERR_NO_MEMORY;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync RTMemFree(pLine);
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync return rc;
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync}
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync
de6e321f351aa489a6a62bed474390a0056e8093vboxsync/** @copydoc RTDBGMODVTDBG::pfnSymbolByAddr */
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsyncstatic DECLCALLBACK(int) rtDbgModContainer_SymbolByAddr(PRTDBGMODINT pMod, RTDBGSEGIDX iSeg, RTUINTPTR off,
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync PRTINTPTR poffDisp, PRTDBGSYMBOL pSymbol)
de6e321f351aa489a6a62bed474390a0056e8093vboxsync{
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync PRTDBGMODCONTAINER pThis = (PRTDBGMODCONTAINER)pMod->pvDbgPriv;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync /*
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync * Validate the input address.
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync */
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync AssertMsgReturn( iSeg == RTDBGSEGIDX_ABS
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync || iSeg < pThis->cSegs,
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync ("iSeg=%#x cSegs=%#x\n", pThis->cSegs),
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync VERR_DBG_INVALID_SEGMENT_INDEX);
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync AssertMsgReturn( iSeg >= RTDBGSEGIDX_SPECIAL_FIRST
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync || pThis->paSegs[iSeg].cb <= off,
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync ("off=%RTptr cbSeg=%RTptr\n", off, pThis->paSegs[iSeg].cb),
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync VERR_DBG_INVALID_SEGMENT_OFFSET);
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync /*
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync * Lookup the nearest symbol with an address less or equal to the specified address.
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync */
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync PAVLRUINTPTRNODECORE pAvlCore = RTAvlrUIntPtrGetBestFit( iSeg == RTDBGSEGIDX_ABS
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync ? &pThis->AbsAddrTree
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync : &pThis->paSegs[iSeg].SymAddrTree,
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync off,
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync false /*fAbove*/);
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync if (!pAvlCore)
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync return VERR_SYMBOL_NOT_FOUND;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync PCRTDBGMODCONTAINERSYMBOL pMySym = RT_FROM_MEMBER(pAvlCore, RTDBGMODCONTAINERSYMBOL const, AddrCore);
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync if (poffDisp)
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync *poffDisp = off - pMySym->AddrCore.Key;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync return rtDbgModContainerReturnSymbol(pMySym, pSymbol);
de6e321f351aa489a6a62bed474390a0056e8093vboxsync}
de6e321f351aa489a6a62bed474390a0056e8093vboxsync
de6e321f351aa489a6a62bed474390a0056e8093vboxsync
de6e321f351aa489a6a62bed474390a0056e8093vboxsync/** @copydoc RTDBGMODVTDBG::pfnSymbolByName */
de6e321f351aa489a6a62bed474390a0056e8093vboxsyncstatic DECLCALLBACK(int) rtDbgModContainer_SymbolByName(PRTDBGMODINT pMod, const char *pszSymbol, PRTDBGSYMBOL pSymbol)
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync{
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync PRTDBGMODCONTAINER pThis = (PRTDBGMODCONTAINER)pMod->pvDbgPriv;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync /*
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync * Look it up in the name space.
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync */
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync PRTSTRSPACECORE pStrCore = RTStrSpaceGet(&pThis->Names, pszSymbol);
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync if (!pStrCore)
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync return VERR_SYMBOL_NOT_FOUND;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync PCRTDBGMODCONTAINERSYMBOL pMySym = RT_FROM_MEMBER(pStrCore, RTDBGMODCONTAINERSYMBOL const, NameCore);
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync return rtDbgModContainerReturnSymbol(pMySym, pSymbol);
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync}
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync/** @copydoc RTDBGMODVTDBG::pfnSymbolAdd */
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsyncstatic DECLCALLBACK(int) rtDbgModContainer_SymbolAdd(PRTDBGMODINT pMod, const char *pszSymbol, size_t cchSymbol,
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync RTDBGSEGIDX iSeg, RTUINTPTR off, RTUINTPTR cb, uint32_t fFlags)
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync{
7af218a7441de38fc9e814919db04bae3e917664vboxsync PRTDBGMODCONTAINER pThis = (PRTDBGMODCONTAINER)pMod->pvDbgPriv;
7af218a7441de38fc9e814919db04bae3e917664vboxsync
7af218a7441de38fc9e814919db04bae3e917664vboxsync /*
7af218a7441de38fc9e814919db04bae3e917664vboxsync * Address validation. The other arguments have already been validated.
7af218a7441de38fc9e814919db04bae3e917664vboxsync */
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync AssertMsgReturn( iSeg == RTDBGSEGIDX_ABS
7af218a7441de38fc9e814919db04bae3e917664vboxsync || iSeg < pThis->cSegs,
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync ("iSeg=%#x cSegs=%#x\n", pThis->cSegs),
7af218a7441de38fc9e814919db04bae3e917664vboxsync VERR_DBG_INVALID_SEGMENT_INDEX);
7af218a7441de38fc9e814919db04bae3e917664vboxsync AssertMsgReturn( iSeg >= RTDBGSEGIDX_SPECIAL_FIRST
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync || pThis->paSegs[iSeg].cb <= off + cb,
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync ("off=%RTptr cb=%RTptr cbSeg=%RTptr\n", off, cb, pThis->paSegs[iSeg].cb),
7af218a7441de38fc9e814919db04bae3e917664vboxsync VERR_DBG_INVALID_SEGMENT_OFFSET);
7af218a7441de38fc9e814919db04bae3e917664vboxsync
7af218a7441de38fc9e814919db04bae3e917664vboxsync /*
7af218a7441de38fc9e814919db04bae3e917664vboxsync * Create a new entry.
7af218a7441de38fc9e814919db04bae3e917664vboxsync */
7af218a7441de38fc9e814919db04bae3e917664vboxsync PRTDBGMODCONTAINERSYMBOL pSymbol = (PRTDBGMODCONTAINERSYMBOL)RTMemAllocZ(sizeof(*pSymbol));
7af218a7441de38fc9e814919db04bae3e917664vboxsync if (!pSymbol)
7af218a7441de38fc9e814919db04bae3e917664vboxsync return VERR_NO_MEMORY;
7af218a7441de38fc9e814919db04bae3e917664vboxsync
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync pSymbol->AddrCore.Key = off;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync pSymbol->AddrCore.KeyLast = off + RT_MIN(cb, 1);
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync pSymbol->iSeg = iSeg;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync pSymbol->cb = cb;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync pSymbol->fFlags = fFlags;
7af218a7441de38fc9e814919db04bae3e917664vboxsync pSymbol->NameCore.pszString = RTStrCacheEnter(g_hDbgModStrCache, pszSymbol);
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync int rc;
7af218a7441de38fc9e814919db04bae3e917664vboxsync if (pSymbol->NameCore.pszString)
7af218a7441de38fc9e814919db04bae3e917664vboxsync {
7af218a7441de38fc9e814919db04bae3e917664vboxsync if (RTStrSpaceInsert(&pThis->Names, &pSymbol->NameCore))
7af218a7441de38fc9e814919db04bae3e917664vboxsync {
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync if (RTAvlrUIntPtrInsert( iSeg == RTDBGSEGIDX_ABS
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync ? &pThis->AbsAddrTree
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync : &pThis->paSegs[iSeg].SymAddrTree,
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync &pSymbol->AddrCore))
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync return VINF_SUCCESS;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync /* bail out */
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync rc = VERR_DBG_ADDRESS_CONFLICT;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync RTStrSpaceRemove(&pThis->Names, pSymbol->NameCore.pszString);
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync }
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync else
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync rc = VERR_DBG_DUPLICATE_SYMBOL;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync RTStrCacheRelease(g_hDbgModStrCache, pSymbol->NameCore.pszString);
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync }
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync else
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync rc = VERR_NO_MEMORY;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync RTMemFree(pSymbol);
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync return rc;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync}
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync/** @copydoc RTDBGMODVTDBG::pfnRvaToSegOff */
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsyncstatic DECLCALLBACK(RTDBGSEGIDX) rtDbgModContainer_RvaToSegOff(PRTDBGMODINT pMod, RTUINTPTR uRva, PRTUINTPTR poffSeg)
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync{
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync PRTDBGMODCONTAINER pThis = (PRTDBGMODCONTAINER)pMod->pvDbgPriv;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync PCRTDBGMODCONTAINERSEGMENT paSeg = pThis->paSegs;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync uint32_t const cSegs = pThis->cSegs;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync if (cSegs <= 7)
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync {
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync /*
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync * Linear search.
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync */
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync for (uint32_t iSeg = 0; iSeg < cSegs; iSeg++)
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync {
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync RTUINTPTR offSeg = uRva - paSeg[iSeg].off;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync if (offSeg < paSeg[iSeg].cb)
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync {
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync if (poffSeg)
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync *poffSeg = offSeg;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync return iSeg;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync }
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync }
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync }
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync else
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync {
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync /*
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync * Binary search.
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync */
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync uint32_t iFirst = 0;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync uint32_t iLast = cSegs - 1;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync for (;;)
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync {
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync uint32_t iSeg = iFirst + (iFirst - iLast) / 2;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync RTUINTPTR offSeg = uRva - paSeg[iSeg].off;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync if (offSeg < paSeg[iSeg].cb)
7af218a7441de38fc9e814919db04bae3e917664vboxsync {
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync if (poffSeg)
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync *poffSeg = offSeg;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync return iSeg;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync }
7af218a7441de38fc9e814919db04bae3e917664vboxsync
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync /* advance */
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync if (uRva < paSeg[iSeg].off)
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync {
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync /* between iFirst and iSeg. */
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync if (iSeg == iFirst)
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync break;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync iLast = iSeg - 1;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync }
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync else
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync {
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync /* between iSeg and iLast. */
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync if (iSeg == iLast)
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync break;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync iFirst = iSeg + 1;
7af218a7441de38fc9e814919db04bae3e917664vboxsync }
7af218a7441de38fc9e814919db04bae3e917664vboxsync }
7af218a7441de38fc9e814919db04bae3e917664vboxsync }
7af218a7441de38fc9e814919db04bae3e917664vboxsync
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync /* Invalid. */
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync return NIL_RTDBGSEGIDX;
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync}
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync
de6e321f351aa489a6a62bed474390a0056e8093vboxsync/** Destroy a symbol node. */
de6e321f351aa489a6a62bed474390a0056e8093vboxsyncstatic DECLCALLBACK(int) rtDbgModContainer_DestroyTreeNode(PAVLRUINTPTRNODECORE pNode, void *pvUser)
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync{
de6e321f351aa489a6a62bed474390a0056e8093vboxsync PRTDBGMODCONTAINERSYMBOL pSym = RT_FROM_MEMBER(pNode, RTDBGMODCONTAINERSYMBOL, AddrCore);
7af218a7441de38fc9e814919db04bae3e917664vboxsync RTStrCacheRelease(g_hDbgModStrCache, pSym->NameCore.pszString);
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync pSym->NameCore.pszString = NULL;
de6e321f351aa489a6a62bed474390a0056e8093vboxsync RTMemFree(pSym);
de6e321f351aa489a6a62bed474390a0056e8093vboxsync return 0;
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync}
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync
de6e321f351aa489a6a62bed474390a0056e8093vboxsync/** @copydoc RTDBGMODVTDBG::pfnClose */
de6e321f351aa489a6a62bed474390a0056e8093vboxsyncstatic DECLCALLBACK(int) rtDbgModContainer_Close(PRTDBGMODINT pMod)
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync{
de6e321f351aa489a6a62bed474390a0056e8093vboxsync PRTDBGMODCONTAINER pThis = (PRTDBGMODCONTAINER)pMod->pvDbgPriv;
de6e321f351aa489a6a62bed474390a0056e8093vboxsync
de6e321f351aa489a6a62bed474390a0056e8093vboxsync /*
de6e321f351aa489a6a62bed474390a0056e8093vboxsync * Destroy the symbols and instance data.
de6e321f351aa489a6a62bed474390a0056e8093vboxsync */
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync for (uint32_t iSeg = 0; iSeg < pThis->cSegs; iSeg++)
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync {
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync RTAvlrUIntPtrDestroy(&pThis->paSegs[iSeg].SymAddrTree, rtDbgModContainer_DestroyTreeNode, NULL);
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync RTStrCacheRelease(g_hDbgModStrCache, pThis->paSegs[iSeg].pszName);
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync pThis->paSegs[iSeg].pszName = NULL;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync }
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync RTAvlrUIntPtrDestroy(&pThis->AbsAddrTree, rtDbgModContainer_DestroyTreeNode, NULL);
de6e321f351aa489a6a62bed474390a0056e8093vboxsync pThis->Names = NULL;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync
de6e321f351aa489a6a62bed474390a0056e8093vboxsync RTMemFree(pThis->paSegs);
de6e321f351aa489a6a62bed474390a0056e8093vboxsync pThis->paSegs = NULL;
de6e321f351aa489a6a62bed474390a0056e8093vboxsync RTMemFree(pThis);
de6e321f351aa489a6a62bed474390a0056e8093vboxsync
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync return VINF_SUCCESS;
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync}
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync
de6e321f351aa489a6a62bed474390a0056e8093vboxsync/** @copydoc RTDBGMODVTDBG::pfnTryOpen */
de6e321f351aa489a6a62bed474390a0056e8093vboxsyncstatic DECLCALLBACK(int) rtDbgModContainer_TryOpen(PRTDBGMODINT pMod)
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync{
de6e321f351aa489a6a62bed474390a0056e8093vboxsync return VERR_INTERNAL_ERROR_5;
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync}
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync
de6e321f351aa489a6a62bed474390a0056e8093vboxsync
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync/** Virtual function table for the debug info container. */
de6e321f351aa489a6a62bed474390a0056e8093vboxsyncstatic RTDBGMODVTDBG const g_rtDbgModVtDbgContainer =
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync{
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync /*.u32Magic = */ RTDBGMODVTDBG_MAGIC,
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync /*.fSupports = */ 0, ///@todo iprt/types.h isn't up to date...
de6e321f351aa489a6a62bed474390a0056e8093vboxsync /*.pszName = */ "container",
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync /*.pfnTryOpen = */ rtDbgModContainer_TryOpen,
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync /*.pfnClose = */ rtDbgModContainer_Close,
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync /*.pfnRvaToSegOff = */ rtDbgModContainer_RvaToSegOff,
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync /*.pfnSymbolAdd = */ rtDbgModContainer_SymbolAdd,
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync /*.pfnSymbolByName = */ rtDbgModContainer_SymbolByName,
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync /*.pfnSymbolByAddr = */ rtDbgModContainer_SymbolByAddr,
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync /*.pfnLineAdd = */ rtDbgModContainer_LineAdd,
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync /*.pfnLineByAddr = */ rtDbgModContainer_LineByAddr,
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync /*.u32EndMagic = */ RTDBGMODVTDBG_MAGIC
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync};
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync
de6e321f351aa489a6a62bed474390a0056e8093vboxsync
de6e321f351aa489a6a62bed474390a0056e8093vboxsync
de6e321f351aa489a6a62bed474390a0056e8093vboxsync/**
20593760b116c90f3e439552763eef632a3bbb17vboxsync * Creates a generic debug info container and associates it with the module.
de6e321f351aa489a6a62bed474390a0056e8093vboxsync *
de6e321f351aa489a6a62bed474390a0056e8093vboxsync * @returns IPRT status code.
de6e321f351aa489a6a62bed474390a0056e8093vboxsync * @param pMod The module instance.
de6e321f351aa489a6a62bed474390a0056e8093vboxsync * @param cb The module size.
de6e321f351aa489a6a62bed474390a0056e8093vboxsync */
de6e321f351aa489a6a62bed474390a0056e8093vboxsyncint rtDbgModContainerCreate(PRTDBGMODINT pMod, RTUINTPTR cb)
de6e321f351aa489a6a62bed474390a0056e8093vboxsync{
de6e321f351aa489a6a62bed474390a0056e8093vboxsync PRTDBGMODCONTAINER pThis = (PRTDBGMODCONTAINER)RTMemAlloc(sizeof(*pThis));
de6e321f351aa489a6a62bed474390a0056e8093vboxsync if (!pThis)
de6e321f351aa489a6a62bed474390a0056e8093vboxsync return VERR_NO_MEMORY;
de6e321f351aa489a6a62bed474390a0056e8093vboxsync
de6e321f351aa489a6a62bed474390a0056e8093vboxsync pThis->Names = NULL;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync pThis->AbsAddrTree = NULL;
de6e321f351aa489a6a62bed474390a0056e8093vboxsync pThis->paSegs = NULL;
de6e321f351aa489a6a62bed474390a0056e8093vboxsync pThis->cSegs = 0;
de6e321f351aa489a6a62bed474390a0056e8093vboxsync pThis->cb = cb;
de6e321f351aa489a6a62bed474390a0056e8093vboxsync
de6e321f351aa489a6a62bed474390a0056e8093vboxsync pMod->pDbgVt = &g_rtDbgModVtDbgContainer;
de6e321f351aa489a6a62bed474390a0056e8093vboxsync pMod->pvDbgPriv = pThis;
de6e321f351aa489a6a62bed474390a0056e8093vboxsync return VINF_SUCCESS;
de6e321f351aa489a6a62bed474390a0056e8093vboxsync}
de6e321f351aa489a6a62bed474390a0056e8093vboxsync