Debugging with GDB¶
This chapter will introduce you with the GNU C debugger, aka GDB. When a crash happens, you usually have to find the guilty part in thousands of lines. You need tools for that, and GDB is the most commonly used debugger under Unix platforms. Here we’ll give you an introduction to GDB and how to practice with it against the PHP source code.
Debug symbols¶
GDB requires debug symbols to map the memory addresses in your binary to the original position in your source code. To
generate debug symbols you need to pass the --enable-debug
flag to the ./configure
script. To get even more
debugging information you may add the CFLAGS="-ggdb3"
flag which will add support for macros.
Debugging the VM¶
The VM lives in the big zend_vm_execute.h
file that is generated by zend_vm_gen.php
from zend_vm_def.h
.
Debugging this file can be tedious because it is very large, and it’s often not obvious which specialized handler
will run. Luckily, it is possible to debug zend_vm_def.h
directly by generating the VM using the
php Zend/zend_vm_gen.php --with-lines
command. This will annotate the code with the #line
preprocessor directive
to allow the debugger to know the origin of the generated instructions.