diff --git a/ext/collect_backtrace.c b/ext/collect_backtrace.c index 43cd3f3eef..0185caad2d 100644 --- a/ext/collect_backtrace.c +++ b/ext/collect_backtrace.c @@ -222,7 +222,7 @@ static inline zend_bool skip_internal_handler(zend_execute_data *skip) /* {{{ */ /* Copy of zend_fetch_debug_backtrace with ability to gather local variables */ void ddtrace_fetch_debug_backtrace(zval *return_value, int skip_last, int options, int limit) { - zend_execute_data *call; + zend_execute_data *call, *last_call = NULL; zend_object *object; bool fake_frame = 0; int lineno, frameno = 0; @@ -274,6 +274,7 @@ void ddtrace_fetch_debug_backtrace(zval *return_value, int skip_last, int option if (skip_last) { /* skip debug_backtrace() */ + last_call = call; call = call->prev_execute_data; } @@ -334,6 +335,9 @@ void ddtrace_fetch_debug_backtrace(zval *return_value, int skip_last, int option stack_frame = zend_new_array(8); zend_hash_real_init_mixed(stack_frame); zend_function *func = ZEND_FLF_FUNC(opline); + if (last_call && last_call->func == func) { + goto not_frameless_call; + } zend_string *name = func->common.function_name; ZVAL_STRINGL(&tmp, ZSTR_VAL(name), ZSTR_LEN(name)); _zend_hash_append_ex(stack_frame, ZSTR_KNOWN(ZEND_STR_FUNCTION), &tmp, 1); @@ -566,6 +570,7 @@ void ddtrace_fetch_debug_backtrace(zval *return_value, int skip_last, int option } else { fake_frame = 0; include_filename = filename; + last_call = call; call = prev; } } diff --git a/libdatadog b/libdatadog index 6de6bbb976..3f188fd273 160000 --- a/libdatadog +++ b/libdatadog @@ -1 +1 @@ -Subproject commit 6de6bbb976b8a3a1c63a68050fc63cb54188f672 +Subproject commit 3f188fd273762d68544dc78e80373089328f7f77