1 .\"
   2 .\" This file and its contents are supplied under the terms of the
   3 .\" Common Development and Distribution License ("CDDL"), version 1.0.
   4 .\" You may only use this file in accordance with the terms of version
   5 .\" 1.0 of the CDDL.
   6 .\"
   7 .\" A full copy of the text of the CDDL should have accompanied this
   8 .\" source.  A copy of the CDDL is also available via the Internet at
   9 .\" http://www.illumos.org/license/CDDL.
  10 .\"
  11 .\"
  12 .\" Copyright 2015 Joyent, Inc.
  13 .\"
  14 .Dd May 11, 2016
  15 .Dt PSTACK_ITER 3PROC
  16 .Os
  17 .Sh NAME
  18 .Nm Pstack_iter
  19 .Nd iterate process stack frames
  20 .Sh SYNOPSIS
  21 .Lb libproc
  22 .In libproc.h
  23 .Ft int
  24 .Fo Pstack_iter
  25 .Fa "struct ps_prochandle *P"
  26 .Fa "const prgregset_t regs"
  27 .Fa "proc_stack_f *func"
  28 .Fa "void *data"
  29 .Fc
  30 .Sh DESCRIPTION
  31 The
  32 .Fn Pstack_iter
  33 function iterates over the stack frames in the process
  34 .Fa P
  35 starting at the point defined by
  36 .Fa regs .
  37 .Pp
  38 For each valid stack frame encountered, the callback function
  39 .Fa func
  40 is invoked with
  41 .Fa data
  42 passed as argument.
  43 The full signature of
  44 .Ft proc_stack_f
  45 is defined in
  46 .Xr libproc 3LIB .
  47 With each callback, a register set, argument set, and argument count
  48 will be provided.
  49 In that register set, only a subset of the registers will be valid, which
  50 include the frame pointer, program counter, and on SPARC systems, the next
  51 program counter.
  52 These registers can be accessed with the constants
  53 .Sy R_FP ,
  54 .Sy R_PC ,
  55 and
  56 .Sy R_nPC
  57 respectively.
  58 These correspond to the registers
  59 .Em %ebp
  60 and
  61 .Em %eip
  62 on i386,
  63 .Em %rbp
  64 and
  65 .Em %rip
  66 on amd64,
  67 .Em %fp ,
  68 .Em %pc ,
  69 and
  70 .Em %npc
  71 on both SPARC and SPARCv9.
  72 .Pp
  73 Callers will receive a callback for the first stack frame indicated by
  74 .Fa regs
  75 and then will receive a subsequent callback for each caller of that
  76 frame until no such frame can be found.
  77 Stack frames that logically come after the frame indicated by
  78 .Fa regs
  79 will not receive callbacks.
  80 .Pp
  81 The compiler can either facilitate or stymie the iteration of the stack.
  82 Programs that have been compiled in such a way as to omit the frame pointer will
  83 result in truncated stacks.
  84 Similarly, if the initial set of registers passed in via
  85 .Fa regs
  86 is invalid, then the ability to iterate the stack will be limited.
  87 The return value of
  88 .Fa func
  89 controls whether or not iteration continues.
  90 If
  91 .Fa func
  92 returns
  93 .Sy 0
  94 then iteration continues.
  95 However, if
  96 .Fa func
  97 returns non-zero, then iteration will halt and that value will be used
  98 as the return value of the
  99 .Fn Pstack_iter
 100 function.
 101 Because
 102 .Fn Pstack_iter
 103 returns
 104 .Sy -1
 105 on internal failure it is recommended the callback function not return
 106 .Sy -1
 107 to indicate an error.
 108 Thus the caller may distinguish between the failure of the callback function and
 109 the failure of the
 110 .Fn Pstack_iter
 111 function.
 112 .Sh RETURN VALUES
 113 Upon successful completion, the
 114 .Fn Pstack_iter
 115 function returns
 116 .Sy 0.
 117 If there was an internal error then
 118 .Sy -1
 119 is returned.
 120 Otherwise, if the callback function
 121 .Fa func
 122 returns non-zero, then its return value will be returned instead.
 123 .Sh INTERFACE STABILITY
 124 .Sy Uncommitted
 125 .Sh MT-LEVEL
 126 See
 127 .Sy LOCKING
 128 in
 129 .Xr libproc 3LIB .
 130 .Sh SEE ALSO
 131 .Xr libproc 3LIB ,
 132 .Xr proc 4