46

I'm using this right now:

error_log(serialize(debug_backtrace()));

But I have to unserialize it every time. Is there a better way to store backtraces?

Leo Jiang
  • 24,497
  • 49
  • 154
  • 284

6 Answers6

65

This should generate a readable string:

error_log(print_r(debug_backtrace(), true));

Additionally, debug_print_backtrace() prints the back trace as string and its output can be captured with regular output buffer functions:

ob_start();
debug_print_backtrace();
error_log(ob_get_clean());
Álvaro González
  • 142,137
  • 41
  • 261
  • 360
  • 16
    `debug_backtrace()` returns a big array, which doesn't print_r real well. The second method prints a nicer looking backtrace. Another method I sometimes use is just `error_log(new Exception('message here, if you want'));` because I like the way the backtrace is formatted for exceptions. – Jay K Oct 14 '16 at 20:24
  • 1
    @JayK - FWIW, sassman on a comment on Igor's answer says about Exception: *"But it does not include the variables of the calling scope. The benefit of debug_print_backtrace() is it includes a copy of the runtime context."* – ToolmakerSteve Apr 17 '19 at 19:15
24

From my perspective the best approach is using an exception functionality:

$e = new Exception();
$e->getTraceAsString();
Igor Sydorenko
  • 1,855
  • 12
  • 12
8
    $log = var_export(debug_backtrace(), true);

Then use the variable $log to log in file or what ever.

Mathias Lykkegaard Lorenzen
  • 15,031
  • 23
  • 100
  • 187
Pramendra Gupta
  • 14,667
  • 4
  • 33
  • 34
4

A little ugly but workable, I do this:

 error_log('Identifying string so that it doesn\'t just end up as gibberish' . json_encode(debug_backtrace()));
Mathias Lykkegaard Lorenzen
  • 15,031
  • 23
  • 100
  • 187
Kzqai
  • 22,588
  • 25
  • 105
  • 137
3

For those who might want a more compact version, this will also do the trick:

error_log((new Exception())->getTraceAsString())
Nicolas Bouvrette
  • 4,295
  • 1
  • 39
  • 53
1

The following can either be written to a .txt file or you can also access it's contents (like $content[0]) as opposed to var_export which is a bit trickier I find:

    $content = unserialize(serialize(debug_backtrace()));
Robert Sinclair
  • 4,550
  • 2
  • 44
  • 46