ttHostLib.c
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:5k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* ttHostLib.c - Host based stack trace library */
  2. /* Copyright 1995 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 01b,13may95,p_m  store the parameters even when their number is unknown.
  8. 01a,02may95,p_m  written.
  9. */
  10. /*
  11. This module provides the Target side of the Tornado shell stack tracing. 
  12. It should be use in conjonction with the TCL based tt procedure.  It relies
  13. on the VxWorks trcStack routine to provide the stack trace information
  14. and store them at a well known location (ttCallStack) where the host
  15. will be able to read them.
  16. */
  17. #include "vxWorks.h"
  18. #include "taskLib.h"
  19. #include "string.h"
  20. #include "trcLib.h"
  21. #include "regs.h"
  22. /* defines */
  23. #define TT_STACK_DEPTH_MAX 40
  24. #define TT_DEFAULT_ARGS 6
  25. /* globals */
  26. UINT32 ttCallStack [TT_STACK_DEPTH_MAX][13]; /* call stack storage */
  27. /* 
  28.  * Current trace level needed by ttStoreCall. This make this code 
  29.  * non-reentrant.
  30.  */
  31. UINT32  ttCallLevel;
  32. /* forward declaration */
  33. static void ttStoreCall (INSTR * callAdrs, int funcAdrs, int nargs, 
  34.       UINT32 * args);
  35. /*******************************************************************************
  36. *
  37. * ttHost - print a stack trace of a task
  38. *
  39. * This routine prints a list of the nested routine calls that the specified
  40. * task is in.  Each routine call and its parameters are shown.
  41. *
  42. * If <task> is not specified or zero, the last task referenced is
  43. * assumed.  The tt() routine can only trace the stack of a task other than
  44. * itself.  For instance, when tt() is called from the shell, it cannot trace
  45. * the shell's stack.
  46. *
  47. * EXAMPLE
  48. * .CS
  49. *     -> tt "logTask"
  50. *      3ab92 _vxTaskEntry   +10 : _logTask (0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
  51. *       ee6e _logTask       +12 : _read (5, 3f8a10, 20)
  52. *       d460 _read          +10 : _iosRead (5, 3f8a10, 20)
  53. *       e234 _iosRead       +9c : _pipeRead (3fce1c, 3f8a10, 20)
  54. *      23978 _pipeRead      +24 : _semTake (3f8b78)
  55. *     value = 0 = 0x0
  56. * .CE
  57. * This indicates that logTask() is currently in semTake() (with
  58. * one parameter) and was called by pipeRead() (with three parameters),
  59. * which was called by iosRead() (with three parameters), and so on.
  60. *
  61. * INTERNAL
  62. * This higher-level symbolic stack trace is built on top of the
  63. * lower-level routines provided by trcLib.
  64. *
  65. * CAVEAT
  66. * In order to do the trace, some assumptions are made.  In general, the
  67. * trace will work for all C language routines and for assembly language
  68. * routines that start with a LINK instruction.  Some C compilers require
  69. * specific flags to generate the LINK first.  Most VxWorks assembly language
  70. * routines include LINK instructions for this reason.  The trace facility
  71. * may produce inaccurate results or fail completely if the routine is
  72. * written in a language other than C, the routine's entry point is
  73. * non-standard, or the task's stack is corrupted.  Also, all parameters are
  74. * assumed to be 32-bit quantities, so structures passed as parameters will
  75. * be displayed as f2longfP integers.
  76. *
  77. * RETURNS:
  78. * OK, or ERROR if the task does not exist.
  79. *
  80. * SEE ALSO:
  81. * .pG "Debugging"
  82. */
  83. STATUS ttHost 
  84.     (
  85.     int task            /* task whose stack is to be traced */
  86.     )
  87.     {
  88.     REG_SET regSet;
  89.     BOOL resumeIt = FALSE; /* flag to remember if */
  90.     int  tid;
  91. /* resuming is necessary */
  92.     /* clear trace table */
  93.     memset ((void *) ttCallStack, 0 , sizeof (ttCallStack));
  94.     tid = taskIdDefault (task); /* set default task id */
  95.     /* get caller task's id and make sure it is not the task to be traced */
  96.     if (tid == taskIdSelf () || tid == 0)
  97. {
  98. return (ERROR);
  99. }
  100.     /* make sure the task exists */
  101.     if (taskIdVerify (tid) != OK)
  102. {
  103. return (ERROR);
  104. }
  105.     /* if the task is not already suspended, suspend it while we trace it */
  106.     if (!taskIsSuspended (tid))
  107. {
  108. resumeIt = TRUE; /* we want to resume it later */
  109. taskSuspend (tid); /* suspend the task if need be */
  110. }
  111.     /* trace the stack */
  112.     ttCallLevel  = 0;
  113.     taskRegsGet (tid, &regSet);
  114.     trcStack (&regSet, (FUNCPTR) ttStoreCall, tid);
  115.     if (resumeIt)
  116. taskResume (tid); /* resume task if we suspended it */
  117.     return (OK);
  118.     }
  119. /*******************************************************************************
  120. *
  121. * ttStoreCall - print a stack frame
  122. *
  123. * This routine is called by trcStack to store each stack level entry 
  124. * information in the table ttCallStack[] where the host tool will be able
  125. * to get them.
  126. */
  127. void ttStoreCall 
  128.     (
  129.     INSTR * callAdrs,       /* address from which function was called */
  130.     int  funcAdrs,       /* address of function called */
  131.     int  nargs,          /* number of arguments in function call */
  132.     UINT32 * args /* pointer to function args */
  133.     )
  134.     {
  135.     int ix;
  136.     /* store call address and name of calling function plus offset */
  137.     ttCallStack [ttCallLevel][0] = (UINT32) callAdrs;
  138.     ttCallStack [ttCallLevel][1] = (UINT32) funcAdrs;
  139.     ttCallStack [ttCallLevel][2] = (UINT32) nargs;
  140.     /* set number of arguments to default if unknown */
  141.     if (nargs == 0)
  142. nargs = TT_DEFAULT_ARGS;
  143.     /* store args */
  144.     for (ix = 0; ix < nargs; ix++)
  145. {
  146. ttCallStack [ttCallLevel][ix+3] = args [ix];
  147. }
  148.     /* next call will be for next call level */
  149.     ttCallLevel++;
  150.     }