Many programming languages allow for introspection of the current call stack environment. This can be for a variety of purposes such as enforcing security checks, debugging, or for getting access to the stack frame of callers.



Task

Print out (in a manner considered suitable for the platform) the current call stack.

The amount of information printed for each frame on the call stack is not constrained, but should include at least the name of the function or method at that level of the stack frame.

You may explicitly add a call to produce the stack trace to the (example) code being instrumented for examination.

The task should allow the program to continue after generating the stack trace.

The task report here must include the trace from a sample program.




 
'32bit x86
 
static string Report
 
 
macro ReportStack(n)
'===================
 
  '
  scope
  '
  static sys stack[0X100],stackptr,e
  '
  'CAPTURE IMAGE OF UP TO 256 ENTRIES
  '
  '
  mov eax,n
  cmp eax,0x100
  (
    jle exit
    mov eax,0x100 'UPPER LIMIT
  )
  mov e,eax
  mov stackptr,esp
  lea edx,stack
  mov ecx,e
  mov esi,esp
  (
    mov eax,[esi]
    mov [edx],eax
    add esi,4
    add edx,4
    dec ecx
    jg repeat
  )
  sys i
  string cr=chr(13)+chr(10), tab=chr(9)
  '
  for i=1 to e
    report+=hex(stackptr+(i-1)*4,8) tab hex(i-1,2) tab hex(stack[i],8) cr
  next
  '
  end scope
  '
end macro
 
'====
'TEST
'====
 
  function foo()
  '=============
 
  push 0x44556677
  push 0x33445566
  push 0x22334455
  push 0x11223344
  ReportStack(8)
 
  end function
 
Report+="Trace inside foo
"
foo()
print report
'putfile "s.txt",Report
 
/*
RESULT:
 
Trace inside foo
0017FE00	00	11223344
0017FE04	01	22334455
0017FE08	02	33445566
0017FE0C	03	44556677
0017FE10	04	005EAB1C
0017FE14	05	0017FE40
0017FE18	06	10002D5F
0017FE1C	07	00000000
*/
 