Req #80517 [Com]: Retain parent method name of Closure in call stack

From: Date: Tue, 15 Dec 2020 02:58:25 +0000
Subject: Req #80517 [Com]: Retain parent method name of Closure in call stack
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-231090@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=80517&edit=1

 ID:                 80517
 Comment by:         ttijhof at wikimedia dot org
 Reported by:        ttijhof at wikimedia dot org
 Summary:            Retain parent method name of Closure in call stack
 Status:             Open
 Type:               Feature/Change Request
 Package:            Scripting Engine problem
 Operating System:   Debian stable
 PHP Version:        Irrelevant
 Block user comment: N
 Private report:     N

 New Comment:

The formatted outcome for this bug, may be of use in bug 62325 as the identifier or token for the
Reflection API.

Mentions:
- https://bugs.php.net/bug.php?id=62325
Backtrace gives no handle to anonymous functions


Previous Comments:
------------------------------------------------------------------------
[2020-12-15 02:55:51] ttijhof at wikimedia dot org

Description:
------------
When an anonymous function is encountered on the stack, it is currently not feasible (afaik) to
obtain the name of the class/method or function where the closure was declared.

My use case is a sampling profiler observing EG(current_execute_data), in which I'd like to
report something more useful and stable to the end-user than file path and line number.

This information would be useful to expose via debug_backtrace() as well, although maybe that should
could be a separate ticket.


Downstream code: https://github.com/wikimedia/php-excimer/
Downstream task: https://phabricator.wikimedia.org/T231335
Downstream use case: Flame graphs, such as https://performance.wikimedia.org/php-profiling/


Test script:
---------------
class ResourceLoader {
 public function getHashes() {
  return array_map( function ( $module ) {
    return $this->getModule( $module )->getVersionHash();
  }, $moduleNames );
 }
}




Expected result:
----------------
Able to construct a string like "Closure$ResourceLoader::getHashes".


Before Wikimedia upgraded to PHP 7.2, we used HHVM and its Xenon extension, which provided
"faux" function name for closures that were unique over a given code base and added
signifant value for developers as part of stack traces.

Example:
https://github.com/facebook/hhvm/blob/HHVM-3.23.4/hphp/tools/gdb/README.md#stacktraces
https://github.com/facebook/hhvm/blob/HHVM-3.23.4/hphp/test/slow/closure/name.php.expect

Note that a method could define multiple closures, in which we could append a number to them. HHVM
did this by appending "#2" as needed. XHProf does something similar for nested functions,
by appending "@2" to the faux function name.

Actual result:
--------------
function_name:
class_name:
filename: /tmp/foo.php
closure_line: 3

For closures, we currently format this as {closure:/tmp/foo.php(3)}

https://github.com/wikimedia/php-excimer/blob/d82eaf7b3b/excimer_log.c#L311


------------------------------------------------------------------------



--
Edit this bug report at https://bugs.php.net/bug.php?id=80517&edit=1


Thread (5 messages)

« previous php.bugs (#231090) next »