dbgmodcontainer.cpp revision 044af0d1e6474076366759db86f101778c5f20cc
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync/*******************************************************************************
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync* Header Files *
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync*******************************************************************************/
de6e321f351aa489a6a62bed474390a0056e8093vboxsync/*******************************************************************************
de6e321f351aa489a6a62bed474390a0056e8093vboxsync* Structures and Typedefs *
de6e321f351aa489a6a62bed474390a0056e8093vboxsync*******************************************************************************/
de6e321f351aa489a6a62bed474390a0056e8093vboxsync * Symbol entry.
de6e321f351aa489a6a62bed474390a0056e8093vboxsync /** The address core. */
de6e321f351aa489a6a62bed474390a0056e8093vboxsync /** The name space core. */
044af0d1e6474076366759db86f101778c5f20ccvboxsync /** The ordinal number core. */
de6e321f351aa489a6a62bed474390a0056e8093vboxsync /** The segment index. */
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync /** The symbol flags. */
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync /** The symbol size.
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync * This may be zero while the range in AddrCore indicates 0. */
de6e321f351aa489a6a62bed474390a0056e8093vboxsync/** Pointer to a symbol entry in the debug info container. */
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync/** Pointer to a const symbol entry in the debug info container. */
044af0d1e6474076366759db86f101778c5f20ccvboxsynctypedef RTDBGMODCTNSYMBOL const *PCRTDBGMODCTNSYMBOL;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync * Line number entry.
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync /** The address core.
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync * The Key is the address of the line number. */
044af0d1e6474076366759db86f101778c5f20ccvboxsync /** The ordinal number core. */
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync /** Pointer to the file name (in string cache). */
044af0d1e6474076366759db86f101778c5f20ccvboxsync const char *pszFile;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync /** The line number. */
044af0d1e6474076366759db86f101778c5f20ccvboxsync /** The segment index. */
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync/** Pointer to a line number entry. */
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync/** Pointer to const a line number entry. */
de6e321f351aa489a6a62bed474390a0056e8093vboxsync * Segment entry.
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync /** The symbol address space tree. */
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync /** The line number address space tree. */
de6e321f351aa489a6a62bed474390a0056e8093vboxsync /** The segment offset. */
de6e321f351aa489a6a62bed474390a0056e8093vboxsync /** The segment size. */
de6e321f351aa489a6a62bed474390a0056e8093vboxsync /** The segment name. */
de6e321f351aa489a6a62bed474390a0056e8093vboxsync const char *pszName;
de6e321f351aa489a6a62bed474390a0056e8093vboxsync/** Pointer to a segment entry in the debug info container. */
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync/** Pointer to a const segment entry in the debug info container. */
044af0d1e6474076366759db86f101778c5f20ccvboxsynctypedef RTDBGMODCTNSEGMENT const *PCRTDBGMODCTNSEGMENT;
de6e321f351aa489a6a62bed474390a0056e8093vboxsync * Instance data.
044af0d1e6474076366759db86f101778c5f20ccvboxsynctypedef struct RTDBGMODCTN
de6e321f351aa489a6a62bed474390a0056e8093vboxsync /** The name space. */
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync /** Tree containing any absolute addresses. */
044af0d1e6474076366759db86f101778c5f20ccvboxsync /** Tree organizing the symbols by ordinal number. */
044af0d1e6474076366759db86f101778c5f20ccvboxsync /** Tree organizing the line numbers by ordinal number. */
de6e321f351aa489a6a62bed474390a0056e8093vboxsync /** Segment table. */
de6e321f351aa489a6a62bed474390a0056e8093vboxsync /** The number of segments in the segment table. */
de6e321f351aa489a6a62bed474390a0056e8093vboxsync /** The image size. 0 means unlimited. */
044af0d1e6474076366759db86f101778c5f20ccvboxsync /** The next symbol ordinal. */
044af0d1e6474076366759db86f101778c5f20ccvboxsync /** The next line number ordinal. */
de6e321f351aa489a6a62bed474390a0056e8093vboxsync/** Pointer to instance data for the debug info container. */
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync * Fills in a RTDBGSYMBOL structure.
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync * @returns VINF_SUCCESS.
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync * @param pMySym Our internal symbol representation.
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync * @param pExtSym The external symbol representation.
044af0d1e6474076366759db86f101778c5f20ccvboxsyncDECLINLINE(int) rtDbgModContainerReturnSymbol(PCRTDBGMODCTNSYMBOL pMySym, PRTDBGSYMBOL pExtSym)
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync Assert(pMySym->NameCore.cchString < sizeof(pExtSym->szName));
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync memcpy(pExtSym->szName, pMySym->NameCore.pszString, pMySym->NameCore.cchString + 1);
de6e321f351aa489a6a62bed474390a0056e8093vboxsync/** @copydoc RTDBGMODVTDBG::pfnLineByAddr */
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsyncstatic DECLCALLBACK(int) rtDbgModContainer_LineByAddr(PRTDBGMODINT pMod, RTDBGSEGIDX iSeg, RTUINTPTR off,
044af0d1e6474076366759db86f101778c5f20ccvboxsync PRTDBGMODCTN pThis = (PRTDBGMODCTN)pMod->pvDbgPriv;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync * Validate the input address.
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync ("off=%RTptr cbSeg=%RTptr\n", off, pThis->paSegs[iSeg].cb),
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync * Lookup the nearest line number with an address less or equal to the specified address.
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync PAVLUINTPTRNODECORE pAvlCore = RTAvlUIntPtrGetBestFit(&pThis->paSegs[iSeg].LineAddrTree, off, false /*fAbove*/);
044af0d1e6474076366759db86f101778c5f20ccvboxsync PCRTDBGMODCTNLINE pMyLine = RT_FROM_MEMBER(pAvlCore, RTDBGMODCTNLINE const, AddrCore);
044af0d1e6474076366759db86f101778c5f20ccvboxsync/** @copydoc RTDBGMODVTDBG::pfnLineByOrdinal */
044af0d1e6474076366759db86f101778c5f20ccvboxsyncstatic DECLCALLBACK(int) rtDbgModContainer_LineByOrdinal(PRTDBGMODINT pMod, uint32_t iOrdinal, PRTDBGLINE pLine)
044af0d1e6474076366759db86f101778c5f20ccvboxsync PRTDBGMODCTN pThis = (PRTDBGMODCTN)pMod->pvDbgPriv;
044af0d1e6474076366759db86f101778c5f20ccvboxsync * Look it up.
044af0d1e6474076366759db86f101778c5f20ccvboxsync PAVLU32NODECORE pAvlCore = RTAvlU32Get(&pThis->LineOrdinalTree, iOrdinal);
044af0d1e6474076366759db86f101778c5f20ccvboxsync PCRTDBGMODCTNLINE pMyLine = RT_FROM_MEMBER(pAvlCore, RTDBGMODCTNLINE const, OrdinalCore);
044af0d1e6474076366759db86f101778c5f20ccvboxsync/** @copydoc RTDBGMODVTDBG::pfnLineCount */
044af0d1e6474076366759db86f101778c5f20ccvboxsyncstatic DECLCALLBACK(uint32_t) rtDbgModContainer_LineCount(PRTDBGMODINT pMod)
044af0d1e6474076366759db86f101778c5f20ccvboxsync PRTDBGMODCTN pThis = (PRTDBGMODCTN)pMod->pvDbgPriv;
044af0d1e6474076366759db86f101778c5f20ccvboxsync /* Note! The ordinal numbers are 0-based. */
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync/** @copydoc RTDBGMODVTDBG::pfnLineAdd */
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsyncstatic DECLCALLBACK(int) rtDbgModContainer_LineAdd(PRTDBGMODINT pMod, const char *pszFile, size_t cchFile, uint32_t uLineNo,
044af0d1e6474076366759db86f101778c5f20ccvboxsync PRTDBGMODCTN pThis = (PRTDBGMODCTN)pMod->pvDbgPriv;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync * Validate the input address.
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync AssertMsgReturn(iSeg < pThis->cSegs, ("iSeg=%#x cSegs=%#x\n", pThis->cSegs),
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync AssertMsgReturn(pThis->paSegs[iSeg].cb < off, ("off=%RTptr cbSeg=%RTptr\n", off, pThis->paSegs[iSeg].cb),
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync * Create a new entry.
044af0d1e6474076366759db86f101778c5f20ccvboxsync PRTDBGMODCTNLINE pLine = (PRTDBGMODCTNLINE)RTMemAllocZ(sizeof(*pLine));
044af0d1e6474076366759db86f101778c5f20ccvboxsync pLine->pszFile = RTStrCacheEnterN(g_hDbgModStrCache, pszFile, cchFile);
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync if (RTAvlUIntPtrInsert(&pThis->paSegs[iSeg].LineAddrTree, &pLine->AddrCore))
044af0d1e6474076366759db86f101778c5f20ccvboxsync if (RTAvlU32Insert(&pThis->LineOrdinalTree, &pLine->OrdinalCore))
044af0d1e6474076366759db86f101778c5f20ccvboxsync RTAvlUIntPtrRemove(&pThis->paSegs[iSeg].LineAddrTree, pLine->AddrCore.Key);
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync /* bail out */
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync RTStrCacheRelease(g_hDbgModStrCache, pLine->pszFile);
de6e321f351aa489a6a62bed474390a0056e8093vboxsync/** @copydoc RTDBGMODVTDBG::pfnSymbolByAddr */
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsyncstatic DECLCALLBACK(int) rtDbgModContainer_SymbolByAddr(PRTDBGMODINT pMod, RTDBGSEGIDX iSeg, RTUINTPTR off,
044af0d1e6474076366759db86f101778c5f20ccvboxsync PRTDBGMODCTN pThis = (PRTDBGMODCTN)pMod->pvDbgPriv;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync * Validate the input address.
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync ("off=%RTptr cbSeg=%RTptr\n", off, pThis->paSegs[iSeg].cb),
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync * Lookup the nearest symbol with an address less or equal to the specified address.
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync PAVLRUINTPTRNODECORE pAvlCore = RTAvlrUIntPtrGetBestFit( iSeg == RTDBGSEGIDX_ABS
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync false /*fAbove*/);
044af0d1e6474076366759db86f101778c5f20ccvboxsync PCRTDBGMODCTNSYMBOL pMySym = RT_FROM_MEMBER(pAvlCore, RTDBGMODCTNSYMBOL const, AddrCore);
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync return rtDbgModContainerReturnSymbol(pMySym, pSymbol);
de6e321f351aa489a6a62bed474390a0056e8093vboxsync/** @copydoc RTDBGMODVTDBG::pfnSymbolByName */
de6e321f351aa489a6a62bed474390a0056e8093vboxsyncstatic DECLCALLBACK(int) rtDbgModContainer_SymbolByName(PRTDBGMODINT pMod, const char *pszSymbol, PRTDBGSYMBOL pSymbol)
044af0d1e6474076366759db86f101778c5f20ccvboxsync PRTDBGMODCTN pThis = (PRTDBGMODCTN)pMod->pvDbgPriv;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync * Look it up in the name space.
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync PRTSTRSPACECORE pStrCore = RTStrSpaceGet(&pThis->Names, pszSymbol);
044af0d1e6474076366759db86f101778c5f20ccvboxsync PCRTDBGMODCTNSYMBOL pMySym = RT_FROM_MEMBER(pStrCore, RTDBGMODCTNSYMBOL const, NameCore);
044af0d1e6474076366759db86f101778c5f20ccvboxsync return rtDbgModContainerReturnSymbol(pMySym, pSymbol);
044af0d1e6474076366759db86f101778c5f20ccvboxsync/** @copydoc RTDBGMODVTDBG::pfnSymbolByOrdinal */
044af0d1e6474076366759db86f101778c5f20ccvboxsyncstatic DECLCALLBACK(int) rtDbgModContainer_SymbolByOrdinal(PRTDBGMODINT pMod, uint32_t iOrdinal, PRTDBGSYMBOL pSymbol)
044af0d1e6474076366759db86f101778c5f20ccvboxsync PRTDBGMODCTN pThis = (PRTDBGMODCTN)pMod->pvDbgPriv;
044af0d1e6474076366759db86f101778c5f20ccvboxsync * Look it up in the ordinal tree.
044af0d1e6474076366759db86f101778c5f20ccvboxsync PAVLU32NODECORE pAvlCore = RTAvlU32Get(&pThis->SymbolOrdinalTree, iOrdinal);
044af0d1e6474076366759db86f101778c5f20ccvboxsync PCRTDBGMODCTNSYMBOL pMySym = RT_FROM_MEMBER(pAvlCore, RTDBGMODCTNSYMBOL const, OrdinalCore);
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync return rtDbgModContainerReturnSymbol(pMySym, pSymbol);
044af0d1e6474076366759db86f101778c5f20ccvboxsync/** @copydoc RTDBGMODVTDBG::pfnSymbolCount */
044af0d1e6474076366759db86f101778c5f20ccvboxsyncstatic DECLCALLBACK(uint32_t) rtDbgModContainer_SymbolCount(PRTDBGMODINT pMod)
044af0d1e6474076366759db86f101778c5f20ccvboxsync PRTDBGMODCTN pThis = (PRTDBGMODCTN)pMod->pvDbgPriv;
044af0d1e6474076366759db86f101778c5f20ccvboxsync /* Note! The ordinal numbers are 0-based. */
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync/** @copydoc RTDBGMODVTDBG::pfnSymbolAdd */
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsyncstatic DECLCALLBACK(int) rtDbgModContainer_SymbolAdd(PRTDBGMODINT pMod, const char *pszSymbol, size_t cchSymbol,
044af0d1e6474076366759db86f101778c5f20ccvboxsync RTDBGSEGIDX iSeg, RTUINTPTR off, RTUINTPTR cb, uint32_t fFlags,
044af0d1e6474076366759db86f101778c5f20ccvboxsync PRTDBGMODCTN pThis = (PRTDBGMODCTN)pMod->pvDbgPriv;
7af218a7441de38fc9e814919db04bae3e917664vboxsync * Address validation. The other arguments have already been validated.
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync ("off=%RTptr cb=%RTptr cbSeg=%RTptr\n", off, cb, pThis->paSegs[iSeg].cb),
7af218a7441de38fc9e814919db04bae3e917664vboxsync * Create a new entry.
044af0d1e6474076366759db86f101778c5f20ccvboxsync PRTDBGMODCTNSYMBOL pSymbol = (PRTDBGMODCTNSYMBOL)RTMemAllocZ(sizeof(*pSymbol));
044af0d1e6474076366759db86f101778c5f20ccvboxsync pSymbol->OrdinalCore.Key = pThis->iNextSymbolOrdinal;
7af218a7441de38fc9e814919db04bae3e917664vboxsync pSymbol->NameCore.pszString = RTStrCacheEnter(g_hDbgModStrCache, pszSymbol);
7af218a7441de38fc9e814919db04bae3e917664vboxsync if (RTStrSpaceInsert(&pThis->Names, &pSymbol->NameCore))
044af0d1e6474076366759db86f101778c5f20ccvboxsync PAVLRUINTPTRTREE pAddrTree = iSeg == RTDBGSEGIDX_ABS
044af0d1e6474076366759db86f101778c5f20ccvboxsync if (RTAvlrUIntPtrInsert(pAddrTree, &pSymbol->AddrCore))
044af0d1e6474076366759db86f101778c5f20ccvboxsync if (RTAvlU32Insert(&pThis->LineOrdinalTree, &pSymbol->OrdinalCore))
044af0d1e6474076366759db86f101778c5f20ccvboxsync /* bail out */
044af0d1e6474076366759db86f101778c5f20ccvboxsync RTAvlrUIntPtrRemove(pAddrTree, pSymbol->AddrCore.Key);
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync RTStrSpaceRemove(&pThis->Names, pSymbol->NameCore.pszString);
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync RTStrCacheRelease(g_hDbgModStrCache, pSymbol->NameCore.pszString);
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync/** @copydoc RTDBGMODVTDBG::pfnRvaToSegOff */
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsyncstatic DECLCALLBACK(RTDBGSEGIDX) rtDbgModContainer_RvaToSegOff(PRTDBGMODINT pMod, RTUINTPTR uRva, PRTUINTPTR poffSeg)
044af0d1e6474076366759db86f101778c5f20ccvboxsync PRTDBGMODCTN pThis = (PRTDBGMODCTN)pMod->pvDbgPriv;
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync * Linear search.
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync * Binary search.
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync /* advance */
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync /* between iFirst and iSeg. */
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync /* between iSeg and iLast. */
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync /* Invalid. */
de6e321f351aa489a6a62bed474390a0056e8093vboxsync/** Destroy a symbol node. */
de6e321f351aa489a6a62bed474390a0056e8093vboxsyncstatic DECLCALLBACK(int) rtDbgModContainer_DestroyTreeNode(PAVLRUINTPTRNODECORE pNode, void *pvUser)
044af0d1e6474076366759db86f101778c5f20ccvboxsync PRTDBGMODCTNSYMBOL pSym = RT_FROM_MEMBER(pNode, RTDBGMODCTNSYMBOL, AddrCore);
7af218a7441de38fc9e814919db04bae3e917664vboxsync RTStrCacheRelease(g_hDbgModStrCache, pSym->NameCore.pszString);
de6e321f351aa489a6a62bed474390a0056e8093vboxsync/** @copydoc RTDBGMODVTDBG::pfnClose */
de6e321f351aa489a6a62bed474390a0056e8093vboxsyncstatic DECLCALLBACK(int) rtDbgModContainer_Close(PRTDBGMODINT pMod)
044af0d1e6474076366759db86f101778c5f20ccvboxsync PRTDBGMODCTN pThis = (PRTDBGMODCTN)pMod->pvDbgPriv;
de6e321f351aa489a6a62bed474390a0056e8093vboxsync * Destroy the symbols and instance data.
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync for (uint32_t iSeg = 0; iSeg < pThis->cSegs; iSeg++)
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync RTAvlrUIntPtrDestroy(&pThis->paSegs[iSeg].SymAddrTree, rtDbgModContainer_DestroyTreeNode, NULL);
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync RTStrCacheRelease(g_hDbgModStrCache, pThis->paSegs[iSeg].pszName);
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync RTAvlrUIntPtrDestroy(&pThis->AbsAddrTree, rtDbgModContainer_DestroyTreeNode, NULL);
de6e321f351aa489a6a62bed474390a0056e8093vboxsync/** @copydoc RTDBGMODVTDBG::pfnTryOpen */
de6e321f351aa489a6a62bed474390a0056e8093vboxsyncstatic DECLCALLBACK(int) rtDbgModContainer_TryOpen(PRTDBGMODINT pMod)
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync/** Virtual function table for the debug info container. */
de6e321f351aa489a6a62bed474390a0056e8093vboxsyncstatic RTDBGMODVTDBG const g_rtDbgModVtDbgContainer =
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync /*.fSupports = */ 0, ///@todo iprt/types.h isn't up to date...
ca3da10d05961c339b5180fbd40a54587d6bad35vboxsync /*.pfnRvaToSegOff = */ rtDbgModContainer_RvaToSegOff,
044af0d1e6474076366759db86f101778c5f20ccvboxsync /*.pfnSegmentAdd = */ NULL,//rtDbgModContainer_SegmentAdd,
044af0d1e6474076366759db86f101778c5f20ccvboxsync /*.pfnSegmentCount = */ NULL,//rtDbgModContainer_SegmentCount,
044af0d1e6474076366759db86f101778c5f20ccvboxsync /*.pfnSegmentByIndex = */ NULL,//rtDbgModContainer_SegmentByIndex,
044af0d1e6474076366759db86f101778c5f20ccvboxsync /*.pfnSymbolCount = */ rtDbgModContainer_SymbolCount,
044af0d1e6474076366759db86f101778c5f20ccvboxsync /*.pfnSymbolByOrdinal = */ rtDbgModContainer_SymbolByOrdinal,
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync /*.pfnSymbolByName = */ rtDbgModContainer_SymbolByName,
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync /*.pfnSymbolByAddr = */ rtDbgModContainer_SymbolByAddr,
044af0d1e6474076366759db86f101778c5f20ccvboxsync /*.pfnLineByOrdinal = */ rtDbgModContainer_LineByOrdinal,
172ae196da38208e5f1e3485715a89f2d53c6880vboxsync /*.pfnLineByAddr = */ rtDbgModContainer_LineByAddr,
20593760b116c90f3e439552763eef632a3bbb17vboxsync * Creates a generic debug info container and associates it with the module.
de6e321f351aa489a6a62bed474390a0056e8093vboxsync * @returns IPRT status code.
de6e321f351aa489a6a62bed474390a0056e8093vboxsync * @param pMod The module instance.
de6e321f351aa489a6a62bed474390a0056e8093vboxsync * @param cb The module size.
de6e321f351aa489a6a62bed474390a0056e8093vboxsyncint rtDbgModContainerCreate(PRTDBGMODINT pMod, RTUINTPTR cb)
044af0d1e6474076366759db86f101778c5f20ccvboxsync PRTDBGMODCTN pThis = (PRTDBGMODCTN)RTMemAlloc(sizeof(*pThis));
044af0d1e6474076366759db86f101778c5f20ccvboxsync pThis->cb = cb; /** @todo the module size stuff doesn't quite make sense yet. Need to look at segments first, I guess. */