Как отладить утечку ссылки? - PullRequest
1 голос
/ 20 апреля 2020

У нас есть сложная PHP программа, которая пропускает один объект. Есть ли способ получить обратный вызов каждый раз, когда увеличивается число ссылок, чтобы я мог записывать трассировку стека всех местоположений, которые принимают ссылку? Программа использует модель программирования RAII, и эта утечка приводит к тому, что деструктор запускается гораздо позже, чем ожидалось (в худшем случае при выходе из процесса).

Код в основном равен

while (!$done)
{
  # create database connection for each try (serializable transactions with fallback servers)
  $connection = ...;
  $transaction = $connection->newTransaction(...);
  try
  {
    doStuffWithTransaction($transaction);
    $transaction->commit();
    $done = true;
    ...; # additional best-effort cleanup routines
  }
  catch (TransactionMustRetry $e)
  {
    $transaction->rollback();
  }
  catch (\Throwable $e)
  {
    ...
  }
  $connection->disconnect();
}

и $transaction должен автоматически откатываться, если \Throwable выбрасывается какой-то вложенной подпрограммой в doStuffWithTransaction(). Однако $transaction имеет refcount = 2 перед вызовом этой функции и 3 при перехвате \Throwable, что приводит к тому, что откат не выполняется автоматически.

Как определить, какой код получил ссылку на $ сделка?

...