Ignore:
Timestamp:
Aug 25, 2007, 5:46:14 AM (18 years ago)
Author:
bird
Message:

errors and stuff.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/kStuff/kDbg/kDbgModule.cpp

    r3540 r3541  
    55
    66/*
    7  * Copyright (c) 2006-2007 knut st. osmundsen <bird-src-spam@anduin.net>
    8  *
    9  * This file is part of kLIBC.
    10  *
    11  * kLIBC is free software; you can redistribute it and/or modify
    12  * it under the terms of the GNU General Public License as published by
    13  * the Free Software Foundation; either version 2 of the License, or
     7 * Copyright (c) 2007 knut st. osmundsen <bird-src-spam@anduin.net>
     8 *
     9 *
     10 * This file is part of kStuff.
     11 *
     12 * kStuff is free software; you can redistribute it and/or modify
     13 * it under the terms of the GNU Lesser General Public License as published
     14 * by the Free Software Foundation; either version 2 of the License, or
    1415 * (at your option) any later version.
    1516 *
    16  * kLIBC is distributed in the hope that it will be useful,
     17 * kStuff is distributed in the hope that it will be useful,
    1718 * but WITHOUT ANY WARRANTY; without even the implied warranty of
    1819 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    19  * GNU General Public License for more details.
    20  *
    21  * You should have received a copy of the GNU General Public License
    22  * along with kLIBC; if not, write to the Free Software
     20 * GNU Lesser General Public License for more details.
     21 *
     22 * You should have received a copy of the GNU Lesser General Public License
     23 * along with kStuff; if not, write to the Free Software
    2324 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
    2425 *
    2526 */
     27
    2628
    2729
     
    2931*   Header Files                                                               *
    3032*******************************************************************************/
    31 #include "kLdr.h"
    3233#include <k/kDbg.h>
     34#include <k/kErrors.h>
     35#include <string.h>
    3336#include "kDbgInternal.h"
    34 #include <kLdrModMZ.h>
    3537
    3638
     
    3840*   Global Variables                                                           *
    3941*******************************************************************************/
    40 
    41 
    42 
    43 KDBG_DECL(int) kDbgModuleOpenFilePart(PKDBGHLPFILE pFile, int64_t off, int64_t cb, PKDBGMOD *ppDbgMod)
     42/**
     43 * The built-in debug module readers.
     44 */
     45static PCKDBGMODOPS const g_aBuiltIns[] =
    4446{
    4547#if K_OS == K_OS_WINDOWS
    46     /*
    47      * If we're on Windows, let DbgHelp have a go first.
    48      */
    49     if (!off)
     48    &g_kDbgModWinDbgHelpOpen,
     49#endif
     50    &g_kDbgModLdr,
     51    &g_kDbgModCv8,
     52    &g_kDbgModDwarf,
     53    &g_kDbgModHll,
     54    &g_kDbgModStabs,
     55    &g_kDbgModSym,
     56    &g_kDbgModMapILink,
     57    &g_kDbgModMapMSLink,
     58    &g_kDbgModMapNm,
     59    &g_kDbgModMapWLink
     60};
     61
     62/**
     63 * The debug module readers registered at runtime.
     64 */
     65static PKDBGMODOPS g_pHead = NULL;
     66
     67
     68/**
     69 * Register a debug module reader with the kDbgModule component.
     70 *
     71 * Dynamically registered readers are kept in FIFO order, and external
     72 * readers will be tried after the builtin ones.
     73 *
     74 * Like all other kDbg APIs serializing is left to the caller.
     75 *
     76 * @returns 0 on success.
     77 * @returns KERR_INVALID_POINTER if pOps is missing bits.
     78 * @returns KERR_INVALID_PARAMETER if pOps is already in the list.
     79 * @param   pOps        The reader method table, kDbg takes owner ship of
     80 *                      this. This must be writeable as the pNext pointer
     81 *                      will be update. It must also stick around for as
     82 *                      long as kDbg is in use.
     83 */
     84KDBG_DECL(int) kDbgModuleRegisterReader(PKDBGMODOPS pOps)
     85{
     86    /*
     87     * Validate input.
     88     */
     89    kDbgAssertPtrReturn(pOps, KERR_INVALID_POINTER);
     90    kDbgAssertPtrReturn(pOps->pszName, KERR_INVALID_POINTER);
     91    kDbgAssertPtrReturn(pOps->pfnOpen, KERR_INVALID_POINTER);
     92    kDbgAssertPtrReturn(pOps->pfnClose, KERR_INVALID_POINTER);
     93    kDbgAssertPtrReturn(pOps->pfnQuerySymbol, KERR_INVALID_POINTER);
     94    kDbgAssertPtrReturn(pOps->pfnQueryLine, KERR_INVALID_POINTER);
     95    kDbgAssertPtrReturn(pOps->pszName2, KERR_INVALID_POINTER);
     96    if (strcmp(pOps->pszName, pOps->pszName2))
     97        return KERR_INVALID_PARAMETER;
     98    kDbgAssertReturn(pOps->pNext == NULL, KERR_INVALID_PARAMETER);
     99
     100    /*
     101     * Link it into the list.
     102     */
     103    if (!g_pHead)
     104        g_pHead = pOps;
     105    else
    50106    {
    51         int rc = kdbgModWinDbgHelpOpen(pFile, ppDbgMod);
    52         if (!rc)
    53             return 0;
     107        PKDBGMODOPS pPrev = g_pHead;
     108        while (pPrev->pNext)
     109            pPrev = pPrev->pNext;
     110        kDbgAssertReturn(pPrev != pOps, KERR_INVALID_PARAMETER);
     111        pPrev->pNext = pOps;
    54112    }
    55 #endif
    56 
    57     /*
    58      * Probe the file for signatures we recognize.
    59      */
    60     int64_t offHdr = 0;
    61     union
     113    return 0;
     114}
     115
     116
     117/**
     118 * Deregister a debug module reader previously registered using
     119 * the kDbgModuleRegisterReader API.
     120 *
     121 * Deregistering a reader does not mean that non of its functions
     122 * will be called after successful return, it only means that it
     123 * will no longer be subjected to new module.
     124 *
     125 * @returns 0 on success.
     126 * @returns KERR_INVALID_POINTER if pOps isn't a valid pointer.
     127 * @returns KERR_INVALID_PARAMETER if pOps wasn't registered.
     128 * @param   pOps    The debug module method table to deregister.
     129 */
     130KDBG_DECL(int) kDbgModuleDeregisterReader(PKDBGMODOPS pOps)
     131{
     132    /*
     133     * Validate the pointer.
     134     */
     135    kDbgAssertPtrReturn(pOps, KERR_INVALID_POINTER);
     136
     137    /*
     138     * Find it in the list and unlink it.
     139     */
     140    if (g_pHead == pOps)
     141        g_pHead = pOps->pNext;
     142    else
    62143    {
    63         uint32_t    au32[4];
    64         uint16_t    au16[8];
    65         uint8_t     ab[16];
    66         char
    67     } Buf;
    68     rc = kDbgHlpReadAt(pFile, &Buf, sizeof(Buf), off);
    69 
    70 }
    71 
    72 
    73 KDBG_DECL(int) kDbgModuleOpenFile(PKDBGHLPFILE pFile, PKDBGMOD *ppDbgMod)
    74 {
    75     return kDbgModuleOpenFilePart(pFile, 0, INT64_MAX, ppDbgMod);
    76 }
    77 
    78 
    79 KDBG_DECL(int) kDbgModuleOpenkLdrMod(PKLDRMOD pLdrMod, PKDBGMOD *ppDbgMod)
    80 {
    81     /*
    82      * Enumerate the debug info, if nothing found check for a matching .pdb,
    83      * .dbg, .sym or .map file.
    84      */
    85 
     144        PKDBGMODOPS pPrev = g_pHead;
     145        while (pPrev && pPrev->pNext != pOps)
     146            pPrev = pPrev->pNext;
     147        if (!pPrev)
     148            return KERR_INVALID_PARAMETER;
     149        pPrev->pNext = pOps->pNext;
     150    }
     151    pOps->pNext = NULL;
     152    return 0;
     153}
     154
     155
     156/**
     157 * Opens a debug module reader for the specified file or file section
     158 *
     159 * @returns kStuff status code.
     160 * @param   ppDbgMod            Where to store the debug module reader handle.
     161 * @param   pFile               The file reader.
     162 * @param   off                 The offset of the file section. If the entire file, pass 0.
     163 * @param   cb                  The size of the file section. If the entire file, pass KFOFF_MAX.
     164 * @param   pLdrMod             Associated kLdr module that the kDbg component can use to
     165 *                              verify and suplement the debug info found in the file specified
     166 *                              by pszFilename. The module will be used by kDbg for as long as
     167 *                              the returned kDbg module remains open.
     168 *                              This is an optional parameter, pass NULL if no kLdr module at hand.
     169 */
     170KDBG_DECL(int) kDbgModuleOpenFilePart(PKDBGMOD *ppDbgMod, PKDBGHLPFILE pFile, KFOFF off, KFOFF cb, struct KLDRMOD *pLdrMod)
     171{
     172    /*
     173     * Validate input.
     174     */
     175    kDbgAssertPtrReturn(ppDbgMod, KERR_INVALID_POINTER);
     176    kDbgAssertPtrReturn(pFile, KERR_INVALID_POINTER);
     177    kDbgAssertPtrNullReturn(pLdrMod, KERR_INVALID_POINTER);
     178    kDbgAssertMsgReturn(off >= 0 && off < KFOFF_MAX, (KFOFF_PRI "\n", off), KERR_INVALID_OFFSET);
     179    kDbgAssertMsgReturn(cb >= 0 && cb <= KFOFF_MAX, (KFOFF_PRI "\n", cb), KERR_INVALID_SIZE);
     180    kDbgAssertMsgReturn(off + cb > off, ("off=" KFOFF_PRI " cb=" KFOFF_PRI "\n", off, cb), KERR_INVALID_RANGE);
     181    *ppDbgMod = NULL;
     182
     183    /*
     184     * Walk the built-in table and the list of registered readers
     185     * and let each of them have a go at the file. Stop and return
     186     * on the first one returning successfully.
     187     */
     188    int rc = KDBG_ERR_UNKOWN_FORMAT;
     189    for (KSIZE i = 0; i < K_ELEMENTS(g_aBuiltIns); i++)
     190        if (g_aBuiltIns[i]->pfnOpen)
     191        {
     192            int rc2 = g_aBuiltIns[i]->pfnOpen(ppDbgMod, pFile, off, cb, pLdrMod);
     193            if (!rc)
     194                return 0;
     195            if (rc2 != KDBG_ERR_UNKOWN_FORMAT && rc == KDBG_ERR_UNKOWN_FORMAT)
     196                rc = rc2;
     197        }
     198
     199    for (PKDBGMODOPS pCur = g_pHead; pCur; pCur = pCur->pNext)
     200        if (g_aBuiltIns[i]->pfnOpen)
     201        {
     202            int rc2 = g_aBuiltIns[i]->pfnOpen(ppDbgMod, pFile, off, cb, pLdrMod);
     203            if (!rc)
     204                return 0;
     205            if (rc2 != KDBG_ERR_UNKOWN_FORMAT && rc == KDBG_ERR_UNKOWN_FORMAT)
     206                rc = rc2;
     207        }
     208    return rc;
     209}
     210
     211
     212/**
     213 * Opens a debug module reader for the specified file.
     214 *
     215 * @returns kStuff status code.
     216 * @param   ppDbgMod            Where to store the debug module reader handle.
     217 * @param   pFile               The file reader.
     218 * @param   pLdrMod             Associated kLdr module that the kDbg component can use to
     219 *                              verify and suplement the debug info found in the file specified
     220 *                              by pszFilename. The module will be used by kDbg for as long as
     221 *                              the returned kDbg module remains open.
     222 *                              This is an optional parameter, pass NULL if no kLdr module at hand.
     223 */
     224KDBG_DECL(int) kDbgModuleOpenFile(PKDBGMOD *ppDbgMod, PKDBGHLPFILE pFile, struct KLDRMOD *pLdrMod)
     225{
     226    return kDbgModuleOpenFilePart(ppDbgMod, pFile, 0, KFOFF_MAX, pLdrMod);
    86227}
    87228
     
    90231 * Opens the debug info for a specified executable module.
    91232 *
    92  * @returns IPRT status code.
    93  * @param   pszModulePath       The path to the executable module.
     233 * @returns kStuff status code.
    94234 * @param   ppDbgMod            Where to store the debug module handle.
    95  */
    96 KDBG_DECL(int) kDbgModuleOpen(const char *pszModulePath, PKDBGMOD *ppDbgMod)
     235 * @param   pszFilename         The name of the file containing debug info and/or which
     236 *                              debug info is wanted.
     237 * @param   pLdrMod             Associated kLdr module that the kDbg component can use to
     238 *                              verify and suplement the debug info found in the file specified
     239 *                              by pszFilename. The module will be used by kDbg for as long as
     240 *                              the returned kDbg module remains open.
     241 *                              This is an optional parameter, pass NULL if no kLdr module at hand.
     242 */
     243KDBG_DECL(int) kDbgModuleOpen(PKDBGMOD *ppDbgMod, const char *pszFilename, struct KLDRMOD *pLdrMod)
    97244{
    98245    /*
    99246     * Validate input.
    100247     */
    101     kDbgAssertPtrReturn(pszModulePath, KDBG_ERR_INVALID_POINTER);
    102     kDbgAssertMsgReturn(*pszModulePath, ("%p\n", pszModulePath), KDBG_ERR_INVALID_PARAMETER);
    103     kDbgAssertPtrReturn(ppDbgMod, KDBG_ERR_INVALID_POINTER);
     248    kDbgAssertPtrReturn(ppDbgMod, KERR_INVALID_POINTER);
     249    kDbgAssertPtrReturn(pszFilename, KERR_INVALID_POINTER);
     250    kDbgAssertMsgReturn(*pszFilename, ("%p\n", pszFilename), KERR_INVALID_PARAMETER);
     251    kDbgAssertPtrNullReturn(pLdrMod, KERR_INVALID_POINTER);
    104252    *ppDbgMod = NULL;
    105253
     
    108256     */
    109257    PKDBGHLPFILE pFile;
    110     int rc = kDbgHlpOpenRO(pszModulePath, &pFile);
     258    int rc = kDbgHlpOpenRO(pszFilename, &pFile);
    111259    if (rc)
    112260        return rc;
    113     rc = kDbgModuleOpenFile(pFile, ppDbgMod);
     261    rc = kDbgModuleOpenFilePart(ppDbgMod, pFile, 0, KFOFF_MAX, pLdrMod);
    114262    if (rc)
    115     {
    116263        kDbgHlpClose(pFile);
    117 
    118         /*
    119          * Let kLdr have a shot at it, if it's a binary it may contain
    120          * some debug sections or a link to an external debug file.
    121          */
    122         PKLDRMOD pLdrMod;
    123         int rc2 = kLdrModOpen(pszModulePath, *pLdrMod);
    124         if (!rc2)
    125         {
    126             rc = kDbgModuleOpenkLdrMod(pLdrMod, ppDbgMod);
    127             if (rc)
    128                 kLdrModClose(pLdrMod);
    129         }
    130     }
    131 
    132264    return rc;
    133265}
     
    159291{
    160292    if (!kdbgModIsValid(pMod))
    161         return KDBG_ERR_INVALID_PARAMETER;
     293        return KERR_INVALID_PARAMETER;
    162294
    163295    int rc = pMod->pOps->pfnClose(pMod);
     
    184316{
    185317    if (!kdbgModIsValid(pMod))
    186         return KDBG_ERR_INVALID_PARAMETER;
    187     kDbgAssertPtrReturn(pSym, KDBG_ERR_INVALID_POINTER);
     318        return KERR_INVALID_PARAMETER;
     319    kDbgAssertPtrReturn(pSym, KERR_INVALID_POINTER);
    188320
    189321    return pMod->pOps->pfnQuerySymbol(pMod, iSegment, off, pSym);
     
    207339KDBG_DECL(int) kDbgModuleQuerySymbolA(PKDBGMOD pMod, int32_t iSegment, KDBGADDR off, PPKDBGSYMBOL ppSym)
    208340{
    209     kDbgAssertPtrReturn(ppSym, KDBG_ERR_INVALID_POINTER);
     341    kDbgAssertPtrReturn(ppSym, KERR_INVALID_POINTER);
    210342
    211343    KDBGSYMBOL Sym;
     
    215347        *ppSym = kDbgSymbolDup(&Sym);
    216348        if (!*ppSym)
    217             rc = KDBG_ERR_NO_MEMORY;
     349            rc = KERR_NO_MEMORY;
    218350    }
    219351    else
     
    239371{
    240372    if (!kdbgModIsValid(pMod))
    241         return KDBG_ERR_INVALID_PARAMETER;
    242     kDbgAssertPtrReturn(pLine, KDBG_ERR_INVALID_POINTER);
     373        return KERR_INVALID_PARAMETER;
     374    kDbgAssertPtrReturn(pLine, KERR_INVALID_POINTER);
    243375
    244376    return pMod->pOps->pfnQueryLine(pMod, iSegment, off, pLine);
     
    262394KDBG_DECL(int) kDbgModuleQueryLineA(PKDBGMOD pMod, int32_t iSegment, KDBGADDR off, PPKDBGLINE ppLine)
    263395{
    264     kDbgAssertPtrReturn(ppLine, KDBG_ERR_INVALID_POINTER);
     396    kDbgAssertPtrReturn(ppLine, KERR_INVALID_POINTER);
    265397
    266398    KDBGLINE Line;
     
    270402        *ppLine = kDbgLineDup(&Line);
    271403        if (!*ppLine)
    272             rc = KDBG_ERR_NO_MEMORY;
     404            rc = KERR_NO_MEMORY;
    273405    }
    274406    else
Note: See TracChangeset for help on using the changeset viewer.