2 Copyright © 1995-2011, The AROS Development Team. All rights reserved.
10 #include <exec/execbase.h>
11 #include <exec/tasks.h>
12 #include <exec/rawfmt.h>
14 #include <proto/exec.h>
15 #include <proto/dos.h>
16 #include <proto/debug.h>
17 #include <proto/alib.h>
22 #define ARG_TEMPLATE "TASK/K,DEBUG/S"
28 static struct RDArgs
*MyArgs
;
29 static IPTR Args
[NUM_ARGS
];
31 static jmp_buf exit_buf
;
33 static UBYTE outbuffer
[20000];
34 static LONG outbuffer_size
;
36 static void Cleanup(char *msg
)
42 Printf("stacksnoop: %s\n",msg
);
48 if (MyArgs
) FreeArgs(MyArgs
);
51 longjmp(exit_buf
, rc
);
54 static void GetArguments(void)
56 if (!(MyArgs
= ReadArgs(ARG_TEMPLATE
,Args
,0)))
58 Fault(IoErr(),0,s
,255);
63 static int out (const UBYTE
* fmt
, ...)
70 VNewRawDoFmt(fmt
, RAWFMTFUNC_STRING
, &outbuffer
[outbuffer_size
], ap
);
71 result
= strlen(&outbuffer
[outbuffer_size
]);
74 KPutStr(&outbuffer
[outbuffer_size
]);
76 outbuffer_size
+= result
;
84 static void CheckTaskStack(struct Task
*task
)
86 UBYTE
*startcheck
, *endcheck
;
87 LONG stacksize
, stackinc
, unusedstack
= 0;
89 stacksize
= (LONG
)( ((UBYTE
*)task
->tc_SPUpper
) - ((UBYTE
*)task
->tc_SPLower
) );
91 #if AROS_STACK_GROWS_DOWNWARDS
92 startcheck
= (UBYTE
*)task
->tc_SPLower
;
93 endcheck
= ((UBYTE
*)task
->tc_SPUpper
) - 1;
96 startcheck
= ((UBYTE
*)task
->tc_SPUpper
) - 1;
97 endcheck
= (UBYTE
*)task
->tc_SPLower
;
101 for(; startcheck
!= endcheck
; startcheck
+= stackinc
)
103 if (*startcheck
!= 0xE1) break;
107 out("Task %x (%25s) Stack Size =%6d, Left =%6d, Used %s%6d%s\n",
109 task
->tc_Node
.ln_Name
? task
->tc_Node
.ln_Name
: "<NONAME>",
112 ((stacksize
- unusedstack
) < stacksize
) ? "=" : ">",
113 stacksize
- unusedstack
,
114 (unusedstack
< 512) ? ": Needs more stack!!!!!!!!!" : "");
117 static void Action(void)
124 out("\n------------------------------------------------------------------------------\n\n");
126 task
= (struct Task
*)SysBase
->TaskReady
.lh_Head
;
127 for(i
= 0; i
< 2;i
++)
129 while(task
->tc_Node
.ln_Succ
)
131 CheckTaskStack(task
);
133 task
= (struct Task
*)task
->tc_Node
.ln_Succ
;
134 } /* while(task->tc_Node.ln_Succ) */
136 task
= (struct Task
*)SysBase
->TaskWait
.lh_Head
;
138 } /* for(i = 0; i < 2;i++) */
140 CheckTaskStack(FindTask(NULL
));
141 out("\n------------------------------------------------------------------------------\n\n");
148 ULONG __nocommandline
= 1;
154 if ((rc
= setjmp(exit_buf
)) != 0)