The walkcontext() function is typically used to obtain information about the call stack for error reporting, performance analysis, or diagnostic purposes. Many library functions are not Async-Signal-Safe and should not be used from a signal handler. If walkcontext()
is to be called from a signal handler, careful programming is required. In particular, stdio(3C) and malloc(3C) cannot be used.
The printstack() function is Async-Signal-Safe and can be called from a signal handler. The output format from printstack() is unstable, as it varies with the scope of the routines.
Tail-call optimizations on SPARC eliminate stack frames that would otherwise be present. For example, if the code is of the form
|
#include <stdio.h>
main()
{
bar();
exit(0);
}
bar()
{
int a;
a = foo(fileno(stdout));
return (a);
}
foo(int file)
{
printstack(file);
}
|
compiling without optimization will yield a stack trace of the form
|
/tmp/q:foo+0x8
/tmp/q:bar+0x14
/tmp/q:main+0x4
/tmp/q:_start+0xb8
|
whereas with higher levels of optimization the output is
|
/tmp/q:main+0x10
/tmp/q:_start+0xb8
|
since both the call to foo() in main and the call to bar() in foo() are handled as tail calls that perform a return or restore in the delay slot. For further information, see The SPARC Architecture Manual.
|