- Timestamp:
- Apr 7, 2011, 2:28:29 AM (14 years ago)
- Location:
- trunk/src/kernel32
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kernel32/exceptions.cpp
r21568 r21610 116 116 static void sprintfException(PEXCEPTIONREPORTRECORD pERepRec, PEXCEPTIONREGISTRATIONRECORD pERegRec, PCONTEXTRECORD pCtxRec, PVOID p, PSZ szTrapDump); 117 117 118 static char szTrapDump[2048] = {0};119 120 118 #ifdef DEBUG 121 119 void PrintWin32ExceptionChain(PWINEXCEPTION_FRAME pframe); … … 709 707 PSZ szTrapDump) 710 708 { 711 // @@VP20040507: This function uses a static buffer szTrapDump, therefore712 // any local buffers also can be made static to save713 // stack space and possibly avoid out of stack exception.714 709 if(pERepRec->ExceptionNum == XCPT_GUARD_PAGE_VIOLATION) 715 710 { … … 727 722 ULONG ulModule; /* module number */ 728 723 ULONG ulObject; /* object number within the module */ 729 staticCHAR szModule[260]; /* buffer for the module name */724 CHAR szModule[260]; /* buffer for the module name */ 730 725 ULONG ulOffset; /* offset within the object within the module */ 731 static char szLineException[128];732 staticchar szLineExceptionType[128];726 char szLineException[512]; 727 char szLineExceptionType[128]; 733 728 734 729 szLineException[0] = 0; /* initialize */ … … 952 947 sprintf(szTrapDump + strlen(szTrapDump), " %s\n", szLineExceptionType); 953 948 949 sprintf(szLineException, " Exception Address = %08x ", pERepRec->ExceptionAddress); 950 strcat(szTrapDump, szLineException); 951 954 952 rc = DosQueryModFromEIP(&ulModule, &ulObject, sizeof(szModule), 955 953 szModule, &ulOffset, (ULONG)pERepRec->ExceptionAddress); 956 954 957 sprintf(szLineException, " Exception Address = %08x ", pERepRec->ExceptionAddress);958 strcat(szTrapDump, szLineException);959 960 955 if(rc == NO_ERROR && ulObject != -1) 961 956 { 962 sprintf(szLineException, "<% .*s> (#%u) obj #%u:%08x", 64, szModule, ulModule, ulObject, ulOffset);957 sprintf(szLineException, "<%8.8s> (%04X) obj %04X:%08X", szModule, ulModule, ulObject + 1, ulOffset); 963 958 #ifdef RAS 964 static char szSYMInfo[260]; 965 static char Name[260]; 966 967 DosQueryModuleName(ulModule, sizeof(Name), Name); 968 969 int namelen = strlen(Name); 959 char szSYMInfo[260]; 960 961 DosQueryModuleName(ulModule, sizeof(szModule), szModule); 962 963 int namelen = strlen(szModule); 970 964 if(namelen > 3) 971 965 { 972 strcpy(Name + namelen - 3, "SYM"); 973 dbgGetSYMInfo(Name, ulObject, ulOffset, szSYMInfo, sizeof (szSYMInfo)); 974 strcat(szLineException, " "); 975 strcat(szLineException, szSYMInfo); 976 } 966 strcpy(szModule + namelen - 3, "SYM"); 967 dbgGetSYMInfo(szModule, ulObject, ulOffset, szSYMInfo, sizeof (szSYMInfo), 968 FALSE); 969 strcat(szLineException, " "); 970 strcat(szLineException, szSYMInfo); 971 } 977 972 #else 978 973 strcat(szLineException, "\n"); … … 993 988 ulObject = 0xFF; 994 989 ulOffset = (ULONG)pERepRec->ExceptionAddress - (ULONG)pMod->getInstanceHandle(); 995 sprintf(szLineException, "<% .*s> (#%u) obj #%u:%08x\n", 64, szModule, ulModule, ulObject, ulOffset);990 sprintf(szLineException, "<%8.8s> (%04X) obj %04X:%08X", szModule, ulModule, ulObject, ulOffset); 996 991 } 997 992 else sprintf(szLineException, "<unknown win32 module>\n"); … … 1079 1074 PVOID p) 1080 1075 { 1076 char szTrapDump[2048]; 1077 szTrapDump[0] = '\0'; 1081 1078 sprintfException(pERepRec, pERegRec, pCtxRec, p, szTrapDump); 1082 1079 #ifdef RAS … … 1154 1151 DosWrite(hFile, lpszTime, strlen(lpszTime), &ulBytesWritten); 1155 1152 } 1153 1154 char szTrapDump[2048]; 1155 szTrapDump[0] = '\0'; 1156 1156 sprintfException(pERepRec, pERegRec, pCtxRec, p, szTrapDump); 1157 1157 #ifdef RAS … … 1757 1757 PEXCEPTIONREGISTRATIONRECORD pExceptRec = (PEXCEPTIONREGISTRATIONRECORD)QueryExceptionChain(); 1758 1758 1759 dprintf(("Exception chain list:")); 1760 while(pExceptRec != 0 && (ULONG)pExceptRec != -1) { 1761 dprintf(("record %x", pExceptRec)); 1759 dprintf(("OS/2 Exception chain:")); 1760 while(pExceptRec != 0 && (ULONG)pExceptRec != -1) 1761 { 1762 char szBuf[512]; 1763 ULONG ulModule; 1764 ULONG ulObject, ulOffset; 1765 CHAR szModule[260]; 1766 1767 *szBuf = '\0'; 1768 APIRET rc = DosQueryModFromEIP(&ulModule, &ulObject, sizeof(szModule), 1769 szModule, &ulOffset, (ULONG)pExceptRec->ExceptionHandler); 1770 if(rc == NO_ERROR && ulObject != -1) 1771 { 1772 sprintf(szBuf, " <%8.8s> (%04X) obj %04X:%08X", szModule, ulModule, ulObject + 1, ulOffset); 1773 #ifdef RAS 1774 char szSYMInfo[260]; 1775 1776 DosQueryModuleName(ulModule, sizeof(szModule), szModule); 1777 1778 int namelen = strlen(szModule); 1779 if(namelen > 3) 1780 { 1781 strcpy(szModule + namelen - 3, "SYM"); 1782 dbgGetSYMInfo(szModule, ulObject, ulOffset, 1783 szSYMInfo, sizeof (szSYMInfo), TRUE); 1784 strcat(szBuf, " "); 1785 strcat(szBuf, szSYMInfo); 1786 // remove trailing \n or space 1787 szBuf[strlen(szBuf) - 1] = '\0'; 1788 } 1789 #endif 1790 } 1791 else 1792 { 1793 *szBuf = '\0'; 1794 } 1795 1796 dprintf((" record %08X, prev %08X, handler %08X%s", 1797 pExceptRec, pExceptRec->prev_structure, pExceptRec->ExceptionHandler, 1798 szBuf)); 1799 1762 1800 pExceptRec = pExceptRec->prev_structure; 1763 1801 } 1802 dprintf(("END of OS/2 Exception chain.")); 1764 1803 SetFS(sel); 1765 1804 } … … 1770 1809 dprintf(("Win32 exception chain:")); 1771 1810 while ((pframe != NULL) && ((ULONG)pframe != 0xFFFFFFFF)) { 1772 dprintf((" Record at %08X, Prev at %08X, handler at %08X", pframe, pframe->Prev, pframe->Handler));1811 dprintf((" Record at %08X, Prev at %08X, handler at %08X", pframe, pframe->Prev, pframe->Handler)); 1773 1812 if (pframe == pframe->Prev) { 1774 1813 dprintf(("Chain corrupted! Record at %08X pointing to itself!", pframe)); … … 1777 1816 pframe = pframe->Prev; 1778 1817 } 1818 dprintf(("END of Win32 exception chain.")); 1779 1819 } 1780 1820 -
trunk/src/kernel32/exceptstackdump.cpp
r21302 r21610 71 71 */ 72 72 73 BOOL dbgGetSYMInfo(CHAR * SymFileName, ULONG Object, ULONG TrapOffset, CHAR *Info, ULONG cbInfo) 73 BOOL dbgGetSYMInfo(CHAR * SymFileName, ULONG Object, ULONG TrapOffset, 74 CHAR *Info, ULONG cbInfo, BOOL fExactMatch) 74 75 { 75 staticFILE *SymFile;76 staticMAPDEF MapDef;77 staticSEGDEF SegDef;78 staticSEGDEF *pSegDef;79 staticSYMDEF32 SymDef32;80 staticSYMDEF16 SymDef16;81 staticchar Buffer[256];82 staticint SegNum, SymNum, LastVal;83 staticunsigned long int SegOffset,76 FILE *SymFile; 77 MAPDEF MapDef; 78 SEGDEF SegDef; 79 SEGDEF *pSegDef; 80 SYMDEF32 SymDef32; 81 SYMDEF16 SymDef16; 82 char Buffer[256]; 83 int SegNum, SymNum, LastVal; 84 unsigned long int SegOffset, 84 85 SymOffset, SymPtrOffset; 85 86 int rc = FALSE; … … 90 91 { 91 92 // dprintf(("Could not open symbol file %s", SymFileName)); 92 93 goto endofprintsym; 93 94 } // endif 94 95 … … 128 129 // extract symbol by symbol from the file instead of using 129 130 // symbol table that is far further 64K fence. 130 131 131 132 // Offset of first symbol 132 133 SymOffset = sizeof (SEGDEF) - 1 + SegDef.cbSegName; … … 150 151 // 32-bit symbol: 151 152 fread(&SymDef32, sizeof(SYMDEF32), 1, SymFile); 152 #if 0 153 if (SymDef32.wSymVal == TrapOffset) 154 { 155 Buffer[0] = SymDef32.achSymName[0]; 156 fread(&Buffer[1], 1, SymDef32.cbSymName, SymFile); 157 Buffer[SymDef32.cbSymName] = 0x00; 158 // dprintf(("%s\n", Buffer)); 159 strcpy (Info, Buffer); 160 rc = TRUE; 161 break; 162 } 163 #endif 164 //SvL: If it's an exact match, then the app put a procedure 165 // address on the stack; ignore that 166 if (LastVal == TrapOffset) { 167 break; 168 } 153 154 if (fExactMatch) 155 { 156 if (SymDef32.wSymVal == TrapOffset) 157 { 158 Buffer[0] = SymDef32.achSymName[0]; 159 fread(&Buffer[1], 1, SymDef32.cbSymName, SymFile); 160 Buffer[SymDef32.cbSymName] = 0x00; 161 // dprintf(("%s\n", Buffer)); 162 #ifdef RAS 163 strncpy(Info, Buffer, cbInfo); 164 #else 165 strcpy (Info, Buffer); 166 #endif 167 rc = TRUE; 168 break; 169 } 170 } 171 else 172 { 173 //SvL: If it's an exact match, then the app put a procedure 174 // address on the stack; ignore that 175 if (LastVal == TrapOffset) { 176 break; 177 } 178 } 179 169 180 if (SymDef32.wSymVal > TrapOffset) 170 181 { … … 185 196 // symbol found, as above 186 197 #ifdef RAS 187 snprintf(&Info[strlen(Info)], cbInfo - strlen(Info), " 188 #else 189 sprintf(&Info[strlen(Info)], " 190 #endif 191 198 snprintf(&Info[strlen(Info)], cbInfo - strlen(Info), " and %s - 0x%X\n", Buffer, LastVal - TrapOffset); 199 #else 200 sprintf(&Info[strlen(Info)], " and %s - 0x%X\n", Buffer, LastVal - TrapOffset); 201 #endif 202 rc = TRUE; 192 203 break; 193 204 } 194 205 /*printf("32 Bit Symbol <%s> Address %p",Buffer,SymDef32.wSymVal); */ 195 206 #ifdef FIX64KLIMIT … … 202 213 fread(&SymDef16, sizeof(SYMDEF16), 1, SymFile); 203 214 204 //SvL: If it's an exact match, then the app put a procedure 205 // address on the stack; ignore that 206 if (LastVal == TrapOffset) { 207 break; 208 } 215 if (fExactMatch) 216 { 217 if (SymDef16.wSymVal == TrapOffset) 218 { 219 Buffer[0] = SymDef16.achSymName[0]; 220 fread(&Buffer[1], 1, SymDef16.cbSymName, SymFile); 221 Buffer[SymDef16.cbSymName] = 0x00; 222 // dprintf(("%s\n", Buffer)); 223 #ifdef RAS 224 strncpy(Info, Buffer, cbInfo); 225 #else 226 strcpy (Info, Buffer); 227 #endif 228 rc = TRUE; 229 break; 230 } 231 } 232 else 233 { 234 //SvL: If it's an exact match, then the app put a procedure 235 // address on the stack; ignore that 236 if (LastVal == TrapOffset) { 237 break; 238 } 239 } 209 240 210 241 if (SymDef16.wSymVal > TrapOffset) … … 223 254 { 224 255 #ifdef RAS 225 snprintf(&Info[strlen(Info)], cbInfo - strlen(Info), " 226 #else 227 sprintf(&Info[strlen(Info)], " 228 #endif 229 256 snprintf(&Info[strlen(Info)], cbInfo - strlen(Info), " and %s - 0x%X\n", Buffer, LastVal - TrapOffset); 257 #else 258 sprintf(&Info[strlen(Info)], " and %s - 0x%X\n", Buffer, LastVal - TrapOffset); 259 #endif 260 rc = TRUE; 230 261 break; 231 262 } … … 253 284 return rc; 254 285 } 255 BOOL dbgPrintSYMInfo(CHAR * SymFileName, ULONG Object, ULONG TrapOffset) 286 BOOL dbgPrintSYMInfo(CHAR * SymFileName, ULONG Object, ULONG TrapOffset, 287 BOOL fExactMatch) 256 288 { 257 289 static char szInfo[256]; 258 BOOL rc = dbgGetSYMInfo (SymFileName, Object, TrapOffset, szInfo, sizeof (szInfo)); 290 BOOL rc = dbgGetSYMInfo (SymFileName, Object, TrapOffset, 291 szInfo, sizeof (szInfo), fExactMatch); 259 292 dprintf(("%s", szInfo)); 260 293 return rc; … … 299 332 300 333 dprintf(("** BEGIN STACK DUMP **\n")); 301 while(stacktop > stackbase) 334 while(stacktop > stackbase) 302 335 { 303 336 Size = 10; … … 355 388 356 389 strcpy(Name + namelen - 3, "SYM"); 357 dbgPrintSYMInfo(Name, ObjNum, Offset );390 dbgPrintSYMInfo(Name, ObjNum, Offset, FALSE); 358 391 } 359 392 } … … 381 414 } //while 382 415 383 addr = pCtxRec->ctx_RegEip; 416 addr = pCtxRec->ctx_RegEip; 384 417 if(WinExe && WinExe->insideModule(addr) && WinExe->insideModuleCode(addr)) { 385 418 sprintf(Name, "%s", WinExe->getModuleName()); -
trunk/src/kernel32/exceptstackdump.h
r21302 r21610 541 541 #pragma pack() 542 542 543 BOOL dbgGetSYMInfo(CHAR * SymFileName, ULONG Object, ULONG TrapOffset, char *Info, ULONG cbInfo); 544 BOOL dbgPrintSYMInfo(CHAR * SymFileName, ULONG Object, ULONG TrapOffset); 545 543 BOOL dbgGetSYMInfo(CHAR * SymFileName, ULONG Object, ULONG TrapOffset, 544 CHAR *Info, ULONG cbInfo, BOOL fExactMatch); 545 BOOL dbgPrintSYMInfo(CHAR * SymFileName, ULONG Object, ULONG TrapOffset, 546 BOOL fExactMatch); 547 546 548 /* 547 549 * dbgPrintStack:
Note:
See TracChangeset
for help on using the changeset viewer.