home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / sd386v50.zip / sd386src.zip / LOG.C < prev    next >
Text File  |  1995-11-02  |  10KB  |  290 lines

  1. /*****************************************************************************/
  2. /* File:                                             IBM INTERNAL USE ONLY   */
  3. /*   log.c                                                                822*/
  4. /*                                                                           */
  5. /* Description:                                                              */
  6. /*                                                                           */
  7. /*  Where the DosDebug calls are really made. They come here                 */
  8. /*  so that we can implement the logging of DosDebug traffic.                */
  9. /*                                                                           */
  10. /* History:                                                                  */
  11. /*                                                                           */
  12. /*   02/02/94 Created.                                                       */
  13. /*                                                                           */
  14. /*****************************************************************************/
  15. #include "all.h"
  16. #undef DosDebug
  17.  
  18. /*****************************************************************************/
  19. /* Dump DosDebug Registers.                                                  */
  20. /*****************************************************************************/
  21. char    *DbgCmds[32] = {
  22.    "DBG_C_Null",
  23.    "DBG_C_ReadMem_I",
  24.    "DBG_C_ReadMem_D",
  25.    "DBG_C_ReadReg",
  26.    "DBG_C_WriteMem_I",
  27.    "DBG_C_WriteMem_D",
  28.    "DBG_C_WriteReg",
  29.    "DBG_C_Go",
  30.    "DBG_C_Term",
  31.    "DBG_C_SStep",
  32.    "DBG_C_Stop",
  33.    "DBG_C_Freeze",
  34.    "DBG_C_Resume",
  35.    "DBG_C_NumToAddr",
  36.    "DBG_C_ReadCoRegs",
  37.    "DBG_C_WriteCoRegs",
  38.    "Reserved ***",
  39.    "DBG_C_ThrdStat",
  40.    "DBG_C_MapROAlias",
  41.    "DBG_C_MapRWAlias",
  42.    "DBG_C_UnMapAlias",
  43.    "DBG_C_Connect",
  44.    "DBG_C_ReadMemBuf",
  45.    "DBG_C_WriteMemBuf",
  46.    "DBG_C_SetWatch",
  47.    "DBG_C_ClearWatch",
  48.    "DBG_C_RangeStep",
  49.    "DBG_C_Continue",
  50.    "DBG_C_AddrToObject",
  51.    "DBG_C_XchgOpcode",
  52.    "DBG_C_LinToSel",
  53.    "DBG_C_SelToLin"
  54. };
  55.  
  56. char    *DBG_Notif[18] = {
  57.    "DBG_N_Success",
  58.    "DBG_N_Error",
  59.    "Invalid Notification",
  60.    "Invalid Notification",
  61.    "Invalid Notification",
  62.    "Invalid Notification",
  63.    "DBG_N_ProcTerm",
  64.    "DBG_N_Exception",
  65.    "DBG_N_ModuleLoad",
  66.    "DBG_N_CoError",
  67.    "DBG_N_ThreadTerm",
  68.    "DBG_N_AsyncStop",
  69.    "DBG_N_NewProc",
  70.    "DBG_N_AliasFree",
  71.    "DBG_N_Watchpoint",
  72.    "DBG_N_ThreadCreate",
  73.    "DBG_N_ModuleFree",
  74.    "DBG_N_RangeStep"
  75. };
  76.  
  77. /*****************************************************************************/
  78. /* Table of exceptions                                                       */
  79. /*****************************************************************************/
  80. typedef struct
  81. {
  82.   uint  XcptNum;
  83.   char *pXcptName;
  84. } XCPTTABLEENTRY;
  85.  
  86. #define MAX_EXCEPTIONS 29
  87. XCPTTABLEENTRY XcptTable[MAX_EXCEPTIONS] =                       /* current  */
  88. {                                                                /* values   */
  89.  XCPT_GUARD_PAGE_VIOLATION    , "XCPT_GUARD_PAGE_VIOLATION"     ,/*0x80000001*/
  90.  XCPT_UNABLE_TO_GROW_STACK    , "XCPT_UNABLE_TO_GROW_STACK"     ,/*0x80010001*/
  91.  XCPT_DATATYPE_MISALIGNMENT   , "XCPT_DATATYPE_MISALIGNMENT"    ,/*0xC000009E*/
  92.  XCPT_BREAKPOINT              , "XCPT_BREAKPOINT"               ,/*0xC000009F*/
  93.  XCPT_SINGLE_STEP             , "XCPT_SINGLE_STEP"              ,/*0xC00000A0*/
  94.  XCPT_ACCESS_VIOLATION        , "XCPT_ACCESS_VIOLATION"         ,/*0xC0000005*/
  95.  XCPT_ILLEGAL_INSTRUCTION     , "XCPT_ILLEGAL_INSTRUCTION"      ,/*0xC000001C*/
  96.  XCPT_FLOAT_DENORMAL_OPERAND  , "XCPT_FLOAT_DENORMAL_OPERAND"   ,/*0xC0000094*/
  97.  XCPT_FLOAT_DIVIDE_BY_ZERO    , "XCPT_FLOAT_DIVIDE_BY_ZERO"     ,/*0xC0000095*/
  98.  XCPT_FLOAT_INEXACT_RESULT    , "XCPT_FLOAT_INEXACT_RESULT"     ,/*0xC0000096*/
  99.  XCPT_FLOAT_INVALID_OPERATION , "XCPT_FLOAT_INVALID_OPERATION"  ,/*0xC0000097*/
  100.  XCPT_FLOAT_OVERFLOW          , "XCPT_FLOAT_OVERFLOW"           ,/*0xC0000098*/
  101.  XCPT_FLOAT_STACK_CHECK       , "XCPT_FLOAT_STACK_CHECK"        ,/*0xC0000099*/
  102.  XCPT_FLOAT_UNDERFLOW         , "XCPT_FLOAT_UNDERFLOW"          ,/*0xC000009A*/
  103.  XCPT_INTEGER_DIVIDE_BY_ZERO  , "XCPT_INTEGER_DIVIDE_BY_ZERO"   ,/*0xC000009B*/
  104.  XCPT_INTEGER_OVERFLOW        , "XCPT_INTEGER_OVERFLOW"         ,/*0xC000009C*/
  105.  XCPT_PRIVILEGED_INSTRUCTION  , "XCPT_PRIVILEGED_INSTRUCTION"   ,/*0xC000009D*/
  106.  XCPT_IN_PAGE_ERROR           , "XCPT_IN_PAGE_ERROR"            ,/*0xC0000006*/
  107.  XCPT_PROCESS_TERMINATE       , "XCPT_PROCESS_TERMINATE"        ,/*0xC0010001*/
  108.  XCPT_ASYNC_PROCESS_TERMINATE , "XCPT_ASYNC_PROCESS_TERMINATE " ,/*0xC0010002*/
  109.  XCPT_NONCONTINUABLE_EXCEPTION, "XCPT_NONCONTINUABLE_EXCEPTION" ,/*0xC0000024*/
  110.  XCPT_INVALID_DISPOSITION     , "XCPT_INVALID_DISPOSITION"      ,/*0xC0000025*/
  111.  XCPT_INVALID_LOCK_SEQUENCE   , "XCPT_INVALID_LOCK_SEQUENCE"    ,/*0xC000001D*/
  112.  XCPT_ARRAY_BOUNDS_EXCEEDED   , "XCPT_ARRAY_BOUNDS_EXCEEDED"    ,/*0xC0000093*/
  113.  XCPT_B1NPX_ERRATA_02         , "XCPT_B1NPX_ERRATA_02"          ,/*0xC0010004*/
  114.  XCPT_UNWIND                  , "XCPT_UNWIND"                   ,/*0xC0000026*/
  115.  XCPT_BAD_STACK               , "XCPT_BAD_STACK"                ,/*0xC0000027*/
  116.  XCPT_INVALID_UNWIND_TARGET   , "XCPT_INVALID_UNWIND_TARGET"    ,/*0xC0000028*/
  117.  XCPT_SIGNAL                  , "XCPT_SIGNAL"                    /*0xC0010003*/
  118. };
  119.  
  120. static int DbgTrace = FALSE;
  121. static int AlreadyOpen = FALSE;
  122.  
  123. APIRET Dbg(PtraceBuffer *p)
  124. {
  125.   ULONG  rc;
  126.   FILE  *dmp = NULL;
  127.  
  128.   if( DbgTrace == FALSE )
  129.    return(DosDebug( p ));
  130.  
  131.   if( AlreadyOpen == FALSE )
  132.   {
  133.    dmp = fopen("log.dat","w");
  134.    AlreadyOpen = TRUE;
  135.   }
  136.   else
  137.    dmp = fopen("log.dat","a");
  138.  
  139.   fprintf( dmp,"\nDosDebug Command is %s...Cmd=%d",DbgCmds[p->Cmd],p->Cmd);
  140.   if (p->Cmd == 27)
  141.   {
  142.     switch((ULONG)(p->Value))
  143.     {
  144.       case XCPT_CONTINUE_SEARCH :
  145.         fprintf( dmp,"\n  Value is        XCPT_CONTINUE_SEARCH");
  146.         break;
  147.       case XCPT_CONTINUE_EXECUTION :
  148.         fprintf( dmp,"\n  Value is        XCPT_CONTINUE_EXECUTION");
  149.         break;
  150.       case XCPT_CONTINUE_STOP :
  151.         fprintf( dmp,"\n  Value is        XCPT_CONTINUE_STOP");
  152.         break;
  153.     }
  154.   }
  155.  
  156.   DumpPtraceBuffer( dmp,p);
  157.  
  158.   rc = DosDebug( p );
  159.  
  160.   fprintf( dmp,"\nDosDebug Notification is %s...Cmd=%d",DBG_Notif[abs(p->Cmd)],p->Cmd);
  161.   if( p->Cmd == DBG_N_ModuleLoad )
  162.   {
  163.     char modname[256];
  164.     DosQueryModuleName( p->Value, 256, modname );
  165.     fprintf( dmp,"\n  Dll name is %s",modname);
  166.   }
  167.   DumpPtraceBuffer(dmp,p);
  168.  
  169.   if( p->Cmd == DBG_N_Exception  )
  170.   {
  171.    if (p->Buffer == XCPT_BREAKPOINT)
  172.    {
  173.      fprintf(dmp,"\n Exception is XCPT_BREAKPOINT\n" );
  174.      fprintf(dmp," Exception Address = %x\n",p->Addr);
  175.      fprintf(dmp," Exception Number  = %x\n",p->Buffer);
  176.      fprintf(dmp," Exception Chance  = %d\n",p->Value);
  177.    }
  178.    else if (p->Buffer == XCPT_SINGLE_STEP)
  179.    {
  180.      fprintf(dmp,"\n Exception is XCPT_SINGLE_STEP\n" );
  181.      fprintf(dmp," Exception Address   = %x\n",p->Addr);
  182.      fprintf(dmp," Exception Number    = %x\n",p->Buffer);
  183.      fprintf(dmp," Exception Chance    = %d\n",p->Value);
  184.    }
  185.    else
  186.    {
  187.     char         *pXcptName;
  188.     ULONG         XcptNumber;
  189.     ULONG         XcptAddr;
  190.  
  191.     XcptAddr = 0;
  192.     pXcptName = NULL;
  193.     XcptNumber = DbgResolveException( p , &XcptAddr, &pXcptName );
  194.  
  195.     fprintf(dmp,"\n Exception is      = %s\n" , pXcptName );
  196.     fprintf(dmp," Exception Address = %x\n" , XcptAddr);
  197.     fprintf(dmp," Exception Number  = %x\n" , XcptNumber );
  198.     fprintf(dmp," Exception Chance  = %d\n" , p->Value  );
  199.    }
  200.  
  201.   }
  202.  
  203.   fflush( dmp );
  204.   fclose(dmp);
  205.   return(rc);
  206. }
  207.  
  208. void DumpPtraceBuffer( FILE *dmp,PtraceBuffer *p)
  209. {
  210.  
  211.  fprintf( dmp,"\n Pid   = %-8u Tid   = %-8u Mte   = %08X Value = %08X\n",
  212.                   p->Pid,      p->Tid,      p->MTE,      p->Value);
  213.  
  214.  fprintf( dmp," Addr  = %08X Buffer= %08X Len   = %08X Index = %08X\n",
  215.                 p->Addr,     p->Buffer,   p->Len,      p->Index );
  216.  
  217.  fprintf( dmp," EAX   = %08X EBX   = %08X ECX   = %08X EDX   = %08X\n",
  218.                 p->EAX,      p->EBX,      p->ECX,      p->EDX );
  219.  
  220.  fprintf( dmp," ESI   = %08X EDI   = %08X EBP   = %08X ESP   = %08X\n",
  221.                 p->ESI,      p->EDI,      p->EBP,      p->ESP );
  222.  
  223.  fprintf( dmp," EIP   = %08X\n",
  224.                 p->EIP);
  225.  
  226.  fprintf( dmp," CS    = %-08.4X DS    = %-08.4X ES    = %-08.4X SS    = %-08.4X\n",
  227.                 p->CS,       p->DS,             p->ES,          p->SS );
  228.  
  229.  fprintf( dmp," CSLim = %08X DSLim = %08X ESLim = %08X SSLim = %08X\n",
  230.                 p->CSLim,    p->DSLim,    p->ESLim,    p->SSLim );
  231.  
  232.  fprintf( dmp," CSBase= %08X DSBase= %08X ESBase= %08X SSBase= %08X\n",
  233.                 p->CSBase,   p->DSBase,   p->ESBase,   p->SSBase );
  234.  
  235.  fprintf( dmp," CSAcc = %-08.2X DSAcc = %-08.2X ESAcc = %-08.2X SSAcc = %-08.2X\n",
  236.                 p->CSAcc,    p->DSAcc,    p->ESAcc,    p->SSAcc );
  237.  
  238.  fprintf( dmp," CSAtr = %-08.2X DSAtr = %-08.2X ESAtr = %-08.2X SSAtr = %-08.2X\n",
  239.                 p->CSAtr,    p->DSAtr,    p->ESAtr,    p->SSAtr );
  240.  
  241.  
  242. }
  243.  
  244. void EspSetDbgTrace( int TorF)
  245. {
  246.  DbgTrace = TorF;
  247. }
  248.  
  249. ULONG DbgResolveException(PtraceBuffer *pptb,ULONG *pXcptAddr,char **pXcptName)
  250. {
  251.  EXCEPTIONREPORTRECORD *pXcptReportRec;
  252.  uint                   XcptNumber;
  253.  uint                   rc;
  254.  uchar                 *p;
  255.  PtraceBuffer           ptb;
  256.  uint                   nbytes;
  257.  int                    i;
  258.  
  259.  nbytes = sizeof(EXCEPTIONREPORTRECORD);
  260.  p = (UCHAR*)Talloc( nbytes );
  261.  
  262.  ptb.Cmd    = DBG_C_ReadMemBuf;
  263.  ptb.Pid    = pptb->Pid;
  264.  ptb.Addr   = pptb->Buffer;/* -> to exception report record */
  265.  ptb.Buffer = (ULONG)p;
  266.  ptb.Len    = (ULONG)nbytes ;
  267.  
  268.  rc = DosDebug( &ptb );
  269.  if( (rc==0) && (ptb.Cmd==DBG_N_Success) )
  270.  {
  271.   pXcptReportRec = (EXCEPTIONREPORTRECORD *)p;
  272.   *pXcptAddr     = (ulong)pXcptReportRec->ExceptionAddress;
  273.   XcptNumber     = pXcptReportRec->ExceptionNum;
  274.  
  275.   i = 0;
  276.   while( i < MAX_EXCEPTIONS )
  277.   {
  278.     if( XcptNumber == XcptTable[i].XcptNum )
  279.     {
  280.       *pXcptName = XcptTable[i].pXcptName;
  281.       break;
  282.     }
  283.     i++;
  284.   }
  285.  }
  286.  
  287.  if(p)Tfree(p);
  288.  return(XcptNumber);
  289. }
  290.