uwx(3X)uwx(3X)NAMEuwx() - Unwind Express Library
SYNOPSIS
[flag... ] file... [library] ...
DESCRIPTION
The Unwind Express Library is a lightweight library for unwinding a
process stack on Integrity systems. It may be used for "self-unwind‐
ing," where a thread traces back through its own stack, or for "cross-
unwinding," where a debugger or other tool can examine the stack of
another target thread or process.
To use the Unwind Express Library, link your application with the
option on the compiler or linker command line. All source code should
include the header file Source code that uses the library for self-
unwinding should also include the header file
The Unwind Express Library maintains its entire state within a single
unwind environment structure. To unwind a stack, the client applica‐
tion provides an initial context to the unwind environment, then
unwinds the stack one frame at a time. After reaching the bottom of
the stack, the unwind environment may be reused for a subsequent unwind
operation simply by providing a new initial context, or it may be dis‐
carded, freeing the memory it was using.
A client application may create any number of separate unwind environ‐
ments, and each one will operate independently of and completely unaf‐
fected by the others.
The Unwind Express Library consists of a core unwind engine that can be
adapted to specific environments through the use of callback routines.
For self-unwinding, a set of standard callback routines are provided as
part of the library. For cross-unwinding, the client must supply call‐
back routines to interface the unwind engine to the target thread or
process.
Self-Unwinding
To prepare for self-unwinding, a client application must perform the
following steps to create and initialize a new unwind environment:
1. Call to create a new unwind environment. The return value is a
pointer to the unwind environment.
2. Call to initialize the standard callback environment. The return
value is a pointer to the callback info structure.
3. Call to register the standard callbacks: and
The steps above may be performed at any time in advance of performing a
stack unwind. The resulting unwind environment can then be used
repeatedly.
To perform a stack unwind from some point in the application, the
client must perform the following steps:
1. Call to provide the current thread's context as a starting point
for unwinding. The stack frame for the caller of this function
becomes the current frame.
2. Call to step back one frame in the call stack. After each step,
the new frame becomes the current frame, and the client may call
to obtain values from the reconstructed context for the new frame.
This step can be repeated until the process reaches the bottom of
the stack or a signal context frame.
3. When a signal context frame is reached, the client may call to
provide a new starting point for unwinding based on the context at
the point of interruption. The stack frame for the function
interrupted by the signal becomes the current frame. Subsequent
calls to will proceed from there.
Cross-Unwinding
To prepare for cross-unwinding, a client application must perform the
following steps to create and initialize a new unwind environment:
1. Call to create a new unwind environment. The return value is a
pointer to the unwind environment.
2. Call to setup the unwind environment for cross unwinding. This
call also allows the client to specify the byte order (little-
endian or big-endian) of the target process.
3. Call to register the client-provided callback functions. See
uwx_register_callbacks(3X) for information on writing callback
routines.
The steps above may be performed at any time in advance of performing a
stack unwind. The resulting unwind environment can then be used
repeatedly.
To perform a stack unwind, the client must perform the following steps:
1. Call to provide the basic initial context as a starting point for
unwinding. This initial context consists of the values of ip
(instruction pointer), sp (stack pointer), bsp (backing store
pointer), and cfm (current frame marker). The frame described by
these values becomes the current frame. If the unwind engine
needs values from additional registers in the target thread's con‐
text, it will request them as needed through the callback inter‐
face.
2. Call to step back one frame in the call stack. After each step,
the new frame becomes the current frame, and the client may call
to obtain values from the reconstructed context for the new frame.
This step can be repeated until the process reaches the bottom of
the stack or a signal context frame.
3. When a signal context frame is reached, the client may call to
obtain the abi and context parameters recorded in the unwind
descriptors for the frame. This routine returns the two values in
a single int as ((abi << 8) | context). It should then call again
to provide a new starting point for unwinding based on the context
at the point of interruption. The stack frame for the function
interrupted by the signal becomes the current frame. Subsequent
calls to will proceed from there.
Obtaining Information From the Current Frame's Context
Registers from the current frame may be read using and
The starting address of the current function may be obtained by calling
Symbolic information may be obtained, if available, for the current
frame's IP by calling and
ERRORS
For the APIs that return pointer values, a NULL pointer indicates a
memory allocation error; otherwise a pointer to an opaque object is
returned.
For other APIs, an integer status code is returned. These codes are
listed here.
Request successfully completed.
hit a signal context frame.
hit bottom of stack.
The cached information returned by the lookup-ip callback was invalid.
The "Lookup IP" callback returned an invalid key in the result vector.
The register id is invalid.
The unwind information block contains an invalid descriptor.
The unwind engine is unable to unwind from the current frame
because of an unsupported descriptor.
There was an error reading a value from the memory stack.
There was an error reading a register from the initial context.
There was an error reading a value from the register stack backing
store.
There was an error reading the unwind information block.
There was an error reading the unwind table.
No module information was found for the current frame's IP.
The "Lookup IP" callback encountered an error.
No callback routines have been registered.
No initial context has been supplied.
The env parameter is NULL.
An attempt to allocate additional memory failed.
No symbolic information was found.
An unwind information block was found, but it does not describe the
current frame's IP.
No unwind information block was found for the current frame's IP.
The unwind information block is invalid -- the nesting of prologue
regions is not balanced.
An unidentified error was received from the
uc_access(3) library.
The unwind information block is invalid -- an undefined label is refer‐
enced.
EXAMPLES
The following code fragment performs a stack unwind in the current
thread:
LIMITATIONS
The Unwind Express Library currently does not recognize X-format unwind
descriptors. These are not currently used by HP compilers.
AUTHOR
The Unwind Express Library was developed by Hewlett-Packard.
SEE ALSOuc_access(3), uwx_add_to_bsp(3X), uwx_find_source_info(3X),
uwx_find_symbol(3X), uwx_free(3X), uwx_get_abi_context_code(3X),
uwx_get_funcstart(3X), uwx_get_module_info(3X), uwx_get_nat(3X),
uwx_get_reg(3X), uwx_get_source_info(3X), uwx_get_sym_info(3X),
uwx_init(3X), uwx_init_context(3X), uwx_register_alloc_cb(3X), uwx_reg‐
ister_callbacks(3X), uwx_release_symbol_cache(3X), uwx_self_do_con‐
text_frame(3X), uwx_self_free_info(3X), uwx_self_init_context(3X),
uwx_self_init_info(3X), uwx_set_nofr(3X), uwx_set_remote(3X),
uwx_step(3X), uwx_step_inline(3X).
Integrity Systems Only uwx(3X)