@@ -274,7 +274,8 @@ void phpdbg_dump_backtrace(size_t num) /* {{{ */
274274 Z_STR (startfile ) = zend_string_init (startfilename , strlen (startfilename ), 0 );
275275
276276 zend_hash_internal_pointer_reset_ex (Z_ARRVAL (zbacktrace ), & position );
277- tmp = zend_hash_get_current_data_ex (Z_ARRVAL (zbacktrace ), & position );
277+
278+ zval * function_name = NULL ;
278279 while ((tmp = zend_hash_get_current_data_ex (Z_ARRVAL (zbacktrace ), & position ))) {
279280 if (file ) { /* userland */
280281 phpdbg_out ("frame #%d: " , i );
@@ -289,10 +290,18 @@ void phpdbg_dump_backtrace(size_t num) /* {{{ */
289290
290291 file = zend_hash_find (Z_ARRVAL_P (tmp ), ZSTR_KNOWN (ZEND_STR_FILE ));
291292 line = zend_hash_find (Z_ARRVAL_P (tmp ), ZSTR_KNOWN (ZEND_STR_LINE ));
293+ function_name = zend_hash_find (Z_ARRVAL_P (tmp ), ZSTR_KNOWN (ZEND_STR_FUNCTION ));
294+
292295 zend_hash_move_forward_ex (Z_ARRVAL (zbacktrace ), & position );
293296 }
294297
295- phpdbg_writeln ("frame #%d: {main} at %s:" ZEND_LONG_FMT , i , Z_STRVAL_P (file ), Z_LVAL_P (line ));
298+ /* This is possible for fibers' start closure for example, which have a frame that doesn't contain the info
299+ * of which location stated the fiber if that stack frame is already torn down. same behaviour with debug_backtrace(). */
300+ if (file == NULL ) {
301+ phpdbg_writeln (" => %s (internal function)" , Z_STRVAL_P (function_name ));
302+ } else {
303+ phpdbg_writeln ("frame #%d: {main} at %s:" ZEND_LONG_FMT , i , Z_STRVAL_P (file ), Z_LVAL_P (line ));
304+ }
296305
297306 zval_ptr_dtor_nogc (& zbacktrace );
298307 zend_string_release (Z_STR (startfile ));
0 commit comments