Changeset 3541 for trunk/kStuff/kDbg/kDbgModule.cpp
- Timestamp:
- Aug 25, 2007, 5:46:14 AM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/kStuff/kDbg/kDbgModule.cpp
r3540 r3541 5 5 6 6 /* 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 14 15 * (at your option) any later version. 15 16 * 16 * k LIBCis distributed in the hope that it will be useful,17 * kStuff is distributed in the hope that it will be useful, 17 18 * but WITHOUT ANY WARRANTY; without even the implied warranty of 18 19 * 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 License22 * along with k LIBC; if not, write to the Free Software20 * 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 23 24 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 24 25 * 25 26 */ 27 26 28 27 29 … … 29 31 * Header Files * 30 32 *******************************************************************************/ 31 #include "kLdr.h"32 33 #include <k/kDbg.h> 34 #include <k/kErrors.h> 35 #include <string.h> 33 36 #include "kDbgInternal.h" 34 #include <kLdrModMZ.h>35 37 36 38 … … 38 40 * Global Variables * 39 41 *******************************************************************************/ 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 */ 45 static PCKDBGMODOPS const g_aBuiltIns[] = 44 46 { 45 47 #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 */ 65 static 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 */ 84 KDBG_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 50 106 { 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; 54 112 } 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 */ 130 KDBG_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 62 143 { 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 */ 170 KDBG_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 */ 224 KDBG_DECL(int) kDbgModuleOpenFile(PKDBGMOD *ppDbgMod, PKDBGHLPFILE pFile, struct KLDRMOD *pLdrMod) 225 { 226 return kDbgModuleOpenFilePart(ppDbgMod, pFile, 0, KFOFF_MAX, pLdrMod); 86 227 } 87 228 … … 90 231 * Opens the debug info for a specified executable module. 91 232 * 92 * @returns IPRT status code. 93 * @param pszModulePath The path to the executable module. 233 * @returns kStuff status code. 94 234 * @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 */ 243 KDBG_DECL(int) kDbgModuleOpen(PKDBGMOD *ppDbgMod, const char *pszFilename, struct KLDRMOD *pLdrMod) 97 244 { 98 245 /* 99 246 * Validate input. 100 247 */ 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); 104 252 *ppDbgMod = NULL; 105 253 … … 108 256 */ 109 257 PKDBGHLPFILE pFile; 110 int rc = kDbgHlpOpenRO(psz ModulePath, &pFile);258 int rc = kDbgHlpOpenRO(pszFilename, &pFile); 111 259 if (rc) 112 260 return rc; 113 rc = kDbgModuleOpenFile (pFile, ppDbgMod);261 rc = kDbgModuleOpenFilePart(ppDbgMod, pFile, 0, KFOFF_MAX, pLdrMod); 114 262 if (rc) 115 {116 263 kDbgHlpClose(pFile); 117 118 /*119 * Let kLdr have a shot at it, if it's a binary it may contain120 * 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 132 264 return rc; 133 265 } … … 159 291 { 160 292 if (!kdbgModIsValid(pMod)) 161 return K DBG_ERR_INVALID_PARAMETER;293 return KERR_INVALID_PARAMETER; 162 294 163 295 int rc = pMod->pOps->pfnClose(pMod); … … 184 316 { 185 317 if (!kdbgModIsValid(pMod)) 186 return K DBG_ERR_INVALID_PARAMETER;187 kDbgAssertPtrReturn(pSym, K DBG_ERR_INVALID_POINTER);318 return KERR_INVALID_PARAMETER; 319 kDbgAssertPtrReturn(pSym, KERR_INVALID_POINTER); 188 320 189 321 return pMod->pOps->pfnQuerySymbol(pMod, iSegment, off, pSym); … … 207 339 KDBG_DECL(int) kDbgModuleQuerySymbolA(PKDBGMOD pMod, int32_t iSegment, KDBGADDR off, PPKDBGSYMBOL ppSym) 208 340 { 209 kDbgAssertPtrReturn(ppSym, K DBG_ERR_INVALID_POINTER);341 kDbgAssertPtrReturn(ppSym, KERR_INVALID_POINTER); 210 342 211 343 KDBGSYMBOL Sym; … … 215 347 *ppSym = kDbgSymbolDup(&Sym); 216 348 if (!*ppSym) 217 rc = K DBG_ERR_NO_MEMORY;349 rc = KERR_NO_MEMORY; 218 350 } 219 351 else … … 239 371 { 240 372 if (!kdbgModIsValid(pMod)) 241 return K DBG_ERR_INVALID_PARAMETER;242 kDbgAssertPtrReturn(pLine, K DBG_ERR_INVALID_POINTER);373 return KERR_INVALID_PARAMETER; 374 kDbgAssertPtrReturn(pLine, KERR_INVALID_POINTER); 243 375 244 376 return pMod->pOps->pfnQueryLine(pMod, iSegment, off, pLine); … … 262 394 KDBG_DECL(int) kDbgModuleQueryLineA(PKDBGMOD pMod, int32_t iSegment, KDBGADDR off, PPKDBGLINE ppLine) 263 395 { 264 kDbgAssertPtrReturn(ppLine, K DBG_ERR_INVALID_POINTER);396 kDbgAssertPtrReturn(ppLine, KERR_INVALID_POINTER); 265 397 266 398 KDBGLINE Line; … … 270 402 *ppLine = kDbgLineDup(&Line); 271 403 if (!*ppLine) 272 rc = K DBG_ERR_NO_MEMORY;404 rc = KERR_NO_MEMORY; 273 405 } 274 406 else
Note:
See TracChangeset
for help on using the changeset viewer.