mirror of
https://github.com/php/php-src.git
synced 2025-08-16 05:58:45 +02:00
Add optional argument to debug_backtrace() and debug_print_backtrace() to limit the amount of stack frames returned.
This commit is contained in:
parent
efcb9a71cd
commit
6f3148db81
7 changed files with 189 additions and 14 deletions
2
NEWS
2
NEWS
|
@ -51,6 +51,8 @@ PHP NEWS
|
|||
(galaxy dot mipt at gmail dot com, Kalle)
|
||||
. Improved unix build system to allow building multiple PHP binary SAPIs and
|
||||
one SAPI module the same time. FR #53271, FR #52410. (Jani)
|
||||
. Added optional argument to debug_backtrace() and debug_print_backtrace()
|
||||
to limit the amount of stack frames returned. (Sebastian, Patrick)
|
||||
|
||||
- Improved Zend Engine memory usage: (Dmitry)
|
||||
. Replaced zend_function.pass_rest_by_reference by
|
||||
|
|
133
Zend/tests/debug_backtrace_limit.phpt
Normal file
133
Zend/tests/debug_backtrace_limit.phpt
Normal file
|
@ -0,0 +1,133 @@
|
|||
--TEST--
|
||||
debug_backtrace limit
|
||||
--FILE--
|
||||
<?php
|
||||
function a() {
|
||||
b();
|
||||
}
|
||||
|
||||
function b() {
|
||||
c();
|
||||
}
|
||||
|
||||
function c() {
|
||||
print_r(debug_backtrace(0, 1));
|
||||
print_r(debug_backtrace(0, 2));
|
||||
print_r(debug_backtrace(0, 0));
|
||||
print_r(debug_backtrace(0, 4));
|
||||
}
|
||||
|
||||
a();
|
||||
?>
|
||||
--EXPECTF--
|
||||
Array
|
||||
(
|
||||
[0] => Array
|
||||
(
|
||||
[file] => %s/debug_backtrace_limit.php
|
||||
[line] => 7
|
||||
[function] => c
|
||||
[args] => Array
|
||||
(
|
||||
)
|
||||
|
||||
)
|
||||
|
||||
)
|
||||
Array
|
||||
(
|
||||
[0] => Array
|
||||
(
|
||||
[file] => %s/debug_backtrace_limit.php
|
||||
[line] => 7
|
||||
[function] => c
|
||||
[args] => Array
|
||||
(
|
||||
)
|
||||
|
||||
)
|
||||
|
||||
[1] => Array
|
||||
(
|
||||
[file] => %s/debug_backtrace_limit.php
|
||||
[line] => 3
|
||||
[function] => b
|
||||
[args] => Array
|
||||
(
|
||||
)
|
||||
|
||||
)
|
||||
|
||||
)
|
||||
Array
|
||||
(
|
||||
[0] => Array
|
||||
(
|
||||
[file] => %s/debug_backtrace_limit.php
|
||||
[line] => 7
|
||||
[function] => c
|
||||
[args] => Array
|
||||
(
|
||||
)
|
||||
|
||||
)
|
||||
|
||||
[1] => Array
|
||||
(
|
||||
[file] => %s/debug_backtrace_limit.php
|
||||
[line] => 3
|
||||
[function] => b
|
||||
[args] => Array
|
||||
(
|
||||
)
|
||||
|
||||
)
|
||||
|
||||
[2] => Array
|
||||
(
|
||||
[file] => %s/debug_backtrace_limit.php
|
||||
[line] => 17
|
||||
[function] => a
|
||||
[args] => Array
|
||||
(
|
||||
)
|
||||
|
||||
)
|
||||
|
||||
)
|
||||
Array
|
||||
(
|
||||
[0] => Array
|
||||
(
|
||||
[file] => %s/debug_backtrace_limit.php
|
||||
[line] => 7
|
||||
[function] => c
|
||||
[args] => Array
|
||||
(
|
||||
)
|
||||
|
||||
)
|
||||
|
||||
[1] => Array
|
||||
(
|
||||
[file] => %s/debug_backtrace_limit.php
|
||||
[line] => 3
|
||||
[function] => b
|
||||
[args] => Array
|
||||
(
|
||||
)
|
||||
|
||||
)
|
||||
|
||||
[2] => Array
|
||||
(
|
||||
[file] => %s/debug_backtrace_limit.php
|
||||
[line] => 17
|
||||
[function] => a
|
||||
[args] => Array
|
||||
(
|
||||
)
|
||||
|
||||
)
|
||||
|
||||
)
|
31
Zend/tests/debug_print_backtrace_limit.phpt
Normal file
31
Zend/tests/debug_print_backtrace_limit.phpt
Normal file
|
@ -0,0 +1,31 @@
|
|||
--TEST--
|
||||
debug_print_backtrace limit
|
||||
--FILE--
|
||||
<?php
|
||||
function a() {
|
||||
b();
|
||||
}
|
||||
|
||||
function b() {
|
||||
c();
|
||||
}
|
||||
|
||||
function c() {
|
||||
debug_print_backtrace(0, 1);
|
||||
debug_print_backtrace(0, 2);
|
||||
debug_print_backtrace(0, 0);
|
||||
debug_print_backtrace(0, 4);
|
||||
}
|
||||
|
||||
a();
|
||||
?>
|
||||
--EXPECTF--
|
||||
#0 c() called at [%s/debug_print_backtrace_limit.php:7]
|
||||
#0 c() called at [%s/debug_print_backtrace_limit.php:7]
|
||||
#1 b() called at [%s/debug_print_backtrace_limit.php:3]
|
||||
#0 c() called at [%s/debug_print_backtrace_limit.php:7]
|
||||
#1 b() called at [%s/debug_print_backtrace_limit.php:3]
|
||||
#2 a() called at [%s/debug_print_backtrace_limit.php:17]
|
||||
#0 c() called at [%s/debug_print_backtrace_limit.php:7]
|
||||
#1 b() called at [%s/debug_print_backtrace_limit.php:3]
|
||||
#2 a() called at [%s/debug_print_backtrace_limit.php:17]
|
|
@ -227,6 +227,11 @@ ZEND_END_ARG_INFO()
|
|||
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_debug_backtrace, 0, 0, 0)
|
||||
ZEND_ARG_INFO(0, options)
|
||||
ZEND_ARG_INFO(0, limit)
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_debug_print_backtrace, 0, 0, 0)
|
||||
ZEND_ARG_INFO(0, options)
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_extension_loaded, 0, 0, 1)
|
||||
|
@ -290,7 +295,7 @@ static const zend_function_entry builtin_functions[] = { /* {{{ */
|
|||
ZEND_FE(get_extension_funcs, arginfo_extension_loaded)
|
||||
ZEND_FE(get_defined_constants, arginfo_get_defined_constants)
|
||||
ZEND_FE(debug_backtrace, arginfo_debug_backtrace)
|
||||
ZEND_FE(debug_print_backtrace, arginfo_debug_backtrace)
|
||||
ZEND_FE(debug_print_backtrace, arginfo_debug_print_backtrace)
|
||||
#if ZEND_DEBUG
|
||||
ZEND_FE(zend_test_func, NULL)
|
||||
#ifdef ZTS
|
||||
|
@ -2047,11 +2052,11 @@ void debug_print_backtrace_args(zval *arg_array TSRMLS_DC)
|
|||
}
|
||||
}
|
||||
|
||||
/* {{{ proto void debug_print_backtrace([int options]) */
|
||||
/* {{{ proto void debug_print_backtrace([int options[, int limit]]) */
|
||||
ZEND_FUNCTION(debug_print_backtrace)
|
||||
{
|
||||
zend_execute_data *ptr, *skip;
|
||||
int lineno;
|
||||
int lineno, frameno = 0;
|
||||
char *function_name;
|
||||
char *filename;
|
||||
const char *class_name = NULL;
|
||||
|
@ -2060,8 +2065,9 @@ ZEND_FUNCTION(debug_print_backtrace)
|
|||
zval *arg_array = NULL;
|
||||
int indent = 0;
|
||||
long options = 0;
|
||||
long limit = 0;
|
||||
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &options) == FAILURE) {
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|ll", &options, &limit) == FAILURE) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -2070,9 +2076,10 @@ ZEND_FUNCTION(debug_print_backtrace)
|
|||
/* skip debug_backtrace() */
|
||||
ptr = ptr->prev_execute_data;
|
||||
|
||||
while (ptr) {
|
||||
while (ptr && (limit == 0 || frameno < limit)) {
|
||||
const char *free_class_name = NULL;
|
||||
|
||||
frameno++;
|
||||
class_name = call_type = NULL;
|
||||
arg_array = NULL;
|
||||
|
||||
|
@ -2207,10 +2214,10 @@ ZEND_FUNCTION(debug_print_backtrace)
|
|||
|
||||
/* }}} */
|
||||
|
||||
ZEND_API void zend_fetch_debug_backtrace(zval *return_value, int skip_last, int options TSRMLS_DC)
|
||||
ZEND_API void zend_fetch_debug_backtrace(zval *return_value, int skip_last, int options, int limit TSRMLS_DC)
|
||||
{
|
||||
zend_execute_data *ptr, *skip;
|
||||
int lineno;
|
||||
int lineno, frameno = 0;
|
||||
char *function_name;
|
||||
char *filename;
|
||||
char *class_name;
|
||||
|
@ -2231,7 +2238,8 @@ ZEND_API void zend_fetch_debug_backtrace(zval *return_value, int skip_last, int
|
|||
|
||||
array_init(return_value);
|
||||
|
||||
while (ptr) {
|
||||
while (ptr && (limit == 0 || frameno < limit)) {
|
||||
frameno++;
|
||||
MAKE_STD_ZVAL(stack_frame);
|
||||
array_init(stack_frame);
|
||||
|
||||
|
@ -2369,17 +2377,18 @@ ZEND_API void zend_fetch_debug_backtrace(zval *return_value, int skip_last, int
|
|||
/* }}} */
|
||||
|
||||
|
||||
/* {{{ proto array debug_backtrace([int options])
|
||||
/* {{{ proto array debug_backtrace([int options[, int limit]])
|
||||
Return backtrace as array */
|
||||
ZEND_FUNCTION(debug_backtrace)
|
||||
{
|
||||
long options = DEBUG_BACKTRACE_PROVIDE_OBJECT;
|
||||
long limit = 0;
|
||||
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &options) == FAILURE) {
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|ll", &options, &limit) == FAILURE) {
|
||||
return;
|
||||
}
|
||||
|
||||
zend_fetch_debug_backtrace(return_value, 1, options TSRMLS_CC);
|
||||
zend_fetch_debug_backtrace(return_value, 1, options, limit TSRMLS_CC);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
|
|
@ -25,7 +25,7 @@
|
|||
int zend_startup_builtin_functions(TSRMLS_D);
|
||||
|
||||
BEGIN_EXTERN_C()
|
||||
ZEND_API void zend_fetch_debug_backtrace(zval *return_value, int skip_last, int options TSRMLS_DC);
|
||||
ZEND_API void zend_fetch_debug_backtrace(zval *return_value, int skip_last, int options, int limit TSRMLS_DC);
|
||||
END_EXTERN_C()
|
||||
|
||||
#endif /* ZEND_BUILTIN_FUNCTIONS_H */
|
||||
|
|
|
@ -158,7 +158,7 @@ static zend_object_value zend_default_exception_new_ex(zend_class_entry *class_t
|
|||
ALLOC_ZVAL(trace);
|
||||
Z_UNSET_ISREF_P(trace);
|
||||
Z_SET_REFCOUNT_P(trace, 0);
|
||||
zend_fetch_debug_backtrace(trace, skip_top_traces, 0 TSRMLS_CC);
|
||||
zend_fetch_debug_backtrace(trace, skip_top_traces, 0, 0 TSRMLS_CC);
|
||||
|
||||
zend_update_property_string(default_exception_ce, &obj, "file", sizeof("file")-1, zend_get_executed_filename(TSRMLS_C) TSRMLS_CC);
|
||||
zend_update_property_long(default_exception_ce, &obj, "line", sizeof("line")-1, zend_get_executed_lineno(TSRMLS_C) TSRMLS_CC);
|
||||
|
|
|
@ -454,7 +454,7 @@ PHPAPI char * mysqlnd_get_backtrace(uint max_levels, size_t * length TSRMLS_DC)
|
|||
}
|
||||
|
||||
MAKE_STD_ZVAL(trace);
|
||||
zend_fetch_debug_backtrace(trace, 0, 0 TSRMLS_CC);
|
||||
zend_fetch_debug_backtrace(trace, 0, 0, 0 TSRMLS_CC);
|
||||
|
||||
zend_hash_apply_with_arguments(Z_ARRVAL_P(trace) TSRMLS_CC, (apply_func_args_t)mysqlnd_build_trace_string, 4, &max_levels, str, len, &num);
|
||||
zval_ptr_dtor(&trace);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue