RE: [PHP] Re: How to get a stacktrace? (was how to get a function backtrace)

2002-01-14 Thread Neil Kimber

There is no native PHP function for getting a stack trace. This has been
discussed many times on the PHP-DEV mailing list. It has always been
discarded due to an unacceptable overhead that would be introduced into the
parsing process.
I'm not sure if any decision has been made with respect to the Zend 2
engine, you may want to make a request there ([EMAIL PROTECTED]).

> -Original Message-
> From: Stefan Rusterholz [mailto:[EMAIL PROTECTED]]
> Sent: 14 January 2002 10:39
> To: PHP
> Subject: Re: [PHP] Re: How to get a stacktrace? (was how to get a
> function backtrace)
>
>
> hmmm, i spent now a lot of time searching for such a function (discovering
> many many to me unknown but interesting functions :) - but it seems that
> there is no such function.
>
> And yes: I wanted to use it for debugging stuff. I have a lot of recursive
> functions and callback functions and it's sometimes incredibly hard to
> determine when exactly an error happened because I don't know the how
> maniest instance of a function actually is running and from where it got
> called. I have made some workarounds, but they are all
> unsatisfying compared
> to the possibilities a stacktrace function would offer...
>
> Just to give you a little impression what perl has got for such
> things (and
> i'd love to see that or something similar in PHP) an extract from the
> manual:
> caller EXPR
>
> caller
>
> Returns the context of the current subroutine call. In scalar context,
> returns the caller's package name if there is a caller, that is,
> if we're in
> a subroutine or eval or require, and the undefined value
> otherwise. In list
> context, returns
> ($package, $filename, $line) = caller;
> With EXPR, it returns some extra information that the debugger
> uses to print
> a stack trace. The value of EXPR indicates how many call frames to go back
> before the current one.
>
> ($package, $filename, $line, $subroutine, $hasargs,
> $wantarray, $evaltext, $is_require, $hints, $bitmask) = caller($i);
> Here $subroutine may be (eval) if the frame is not a subroutine
> call, but an
> eval. In such a case additional elements $evaltext and
> $is_require are set:
> $is_require is true if the frame is created by a require or use statement,
> $evaltext contains the text of the eval EXPR statement. In particular, for
> an eval BLOCK statement, $filename is (eval), but $evaltext is undefined.
> (Note also that each use statement creates a require frame inside an eval
> EXPR) frame. $hasargs is true if a new instance of @_ was set up for the
> frame. $hints and $bitmask contain pragmatic hints that the caller was
> compiled with. The $hints and $bitmask values are subject to
> change between
> versions of Perl, and are not meant for external use.
>
> Furthermore, when called from within the DB package, caller returns more
> detailed information: it sets the list variable @DB::args to be the
> arguments with which the subroutine was invoked.
>
> Be aware that the optimizer might have optimized call frames away before
> caller had a chance to get the information. That means that
> caller(N) might
> not return information about the call frame you expect it do, for
> N > 1. In
> particular, @DB::args might have information from the previous time caller
> was called.
>
> - Original Message -
> From: "Martin Wickman" <[EMAIL PROTECTED]>
> To: <[EMAIL PROTECTED]>
> Sent: Monday, January 14, 2002 10:24 AM
> Subject: [PHP] Re: How to get a function backtrace?
>
>
> > Stefan Rusterholz wrote:
> >
> > > Im not sure if "function-backtrace" is the correct word for
> what I need,
> so I'll explain:
> > > If I have for example
> >
> >
> > What you are looking for is a "stacktrace", ie the stack of called
> > functions. Dunno if php has any support for it, but it is normally
> > used when debugging and error/exception handling.
> >
> >
> > --
> > PHP General Mailing List (http://www.php.net/)
> > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > For additional commands, e-mail: [EMAIL PROTECTED]
> > To contact the list administrators, e-mail: [EMAIL PROTECTED]
> >
> >
> >
>
>
> --
> PHP General Mailing List (http://www.php.net/)
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
> To contact the list administrators, e-mail: [EMAIL PROTECTED]


-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
To contact the list administrators, e-mail: [EMAIL PROTECTED]




Re: [PHP] Re: How to get a stacktrace? (was how to get a function backtrace)

2002-01-14 Thread Stefan Rusterholz

hmmm, i spent now a lot of time searching for such a function (discovering
many many to me unknown but interesting functions :) - but it seems that
there is no such function.

And yes: I wanted to use it for debugging stuff. I have a lot of recursive
functions and callback functions and it's sometimes incredibly hard to
determine when exactly an error happened because I don't know the how
maniest instance of a function actually is running and from where it got
called. I have made some workarounds, but they are all unsatisfying compared
to the possibilities a stacktrace function would offer...

Just to give you a little impression what perl has got for such things (and
i'd love to see that or something similar in PHP) an extract from the
manual:
caller EXPR

caller

Returns the context of the current subroutine call. In scalar context,
returns the caller's package name if there is a caller, that is, if we're in
a subroutine or eval or require, and the undefined value otherwise. In list
context, returns
($package, $filename, $line) = caller;
With EXPR, it returns some extra information that the debugger uses to print
a stack trace. The value of EXPR indicates how many call frames to go back
before the current one.

($package, $filename, $line, $subroutine, $hasargs,
$wantarray, $evaltext, $is_require, $hints, $bitmask) = caller($i);
Here $subroutine may be (eval) if the frame is not a subroutine call, but an
eval. In such a case additional elements $evaltext and $is_require are set:
$is_require is true if the frame is created by a require or use statement,
$evaltext contains the text of the eval EXPR statement. In particular, for
an eval BLOCK statement, $filename is (eval), but $evaltext is undefined.
(Note also that each use statement creates a require frame inside an eval
EXPR) frame. $hasargs is true if a new instance of @_ was set up for the
frame. $hints and $bitmask contain pragmatic hints that the caller was
compiled with. The $hints and $bitmask values are subject to change between
versions of Perl, and are not meant for external use.

Furthermore, when called from within the DB package, caller returns more
detailed information: it sets the list variable @DB::args to be the
arguments with which the subroutine was invoked.

Be aware that the optimizer might have optimized call frames away before
caller had a chance to get the information. That means that caller(N) might
not return information about the call frame you expect it do, for N > 1. In
particular, @DB::args might have information from the previous time caller
was called.

- Original Message -
From: "Martin Wickman" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Monday, January 14, 2002 10:24 AM
Subject: [PHP] Re: How to get a function backtrace?


> Stefan Rusterholz wrote:
>
> > Im not sure if "function-backtrace" is the correct word for what I need,
so I'll explain:
> > If I have for example
>
>
> What you are looking for is a "stacktrace", ie the stack of called
> functions. Dunno if php has any support for it, but it is normally
> used when debugging and error/exception handling.
>
>
> --
> PHP General Mailing List (http://www.php.net/)
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
> To contact the list administrators, e-mail: [EMAIL PROTECTED]
>
>
>


-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
To contact the list administrators, e-mail: [EMAIL PROTECTED]