Skip to content

Instantly share code, notes, and snippets.

@patrickallaert
Created April 5, 2011 09:21
Show Gist options
  • Save patrickallaert/903309 to your computer and use it in GitHub Desktop.
Save patrickallaert/903309 to your computer and use it in GitHub Desktop.
Index: Zend/zend_builtin_functions.c
===================================================================
--- Zend/zend_builtin_functions.c (revision 309942)
+++ Zend/zend_builtin_functions.c (working copy)
@@ -227,6 +227,7 @@
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_extension_loaded, 0, 0, 1)
@@ -2047,11 +2048,11 @@
}
}
-/* {{{ 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 +2061,9 @@
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 +2072,10 @@
/* 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 +2210,10 @@
/* }}} */
-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 +2234,8 @@
array_init(return_value);
- while (ptr) {
+ while (ptr && (limit == 0 || frameno < limit)) {
+ frameno++;
MAKE_STD_ZVAL(stack_frame);
array_init(stack_frame);
@@ -2369,17 +2373,18 @@
/* }}} */
-/* {{{ 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);
}
/* }}} */
Index: Zend/zend_builtin_functions.h
===================================================================
--- Zend/zend_builtin_functions.h (revision 309942)
+++ Zend/zend_builtin_functions.h (working copy)
@@ -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 */
Index: Zend/zend_exceptions.c
===================================================================
--- Zend/zend_exceptions.c (revision 309942)
+++ Zend/zend_exceptions.c (working copy)
@@ -158,7 +158,7 @@
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);
Index: ext/mysqlnd/mysqlnd_bt.c
===================================================================
--- ext/mysqlnd/mysqlnd_bt.c (revision 309942)
+++ ext/mysqlnd/mysqlnd_bt.c (working copy)
@@ -454,7 +454,7 @@
}
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);
Index: Zend/tests/debug_backtrace_limit.phpt
===================================================================
--- Zend/tests/debug_backtrace_limit.phpt (revision 0)
+++ Zend/tests/debug_backtrace_limit.phpt (revision 0)
@@ -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
+ (
+ )
+
+ )
+
+)
Index: Zend/tests/debug_print_backtrace_limit.phpt
===================================================================
--- Zend/tests/debug_print_backtrace_limit.phpt (revision 0)
+++ Zend/tests/debug_print_backtrace_limit.phpt (revision 0)
@@ -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]
Index: NEWS
===================================================================
--- NEWS (revision 309942)
+++ NEWS (working copy)
@@ -51,6 +51,8 @@
(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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment