php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login

Generating a backtrace, with a compiler, on Win32

You'll need to install MS Visual Studio 2008, 2012 or later. You'll also need to

If you downloaded the debug-pack from the snaps site, extract it into your PHP directory and be sure to put the PDB files that belong to the extensions into your extension directory.

If you compile PHP by your own, you can also use a newer version of MSVC.

When PHP crashes, click Cancel to debug the process. Now MSVC starts up in Debug View. If you don't already see the call stack, go into the View menu and choose Debug WindowsCall Stack.

You'll now see something similar to the following lines, this is the backtrace:


_efree(void * 0x00000000) line 286 + 3 bytes
zif_http_test(int 0, _zval_struct * 0x007bc3b0, _zval_struct * * 0x00000000, _zval_struct * 0x00000000, int 0, void * * * 0x00792cd0) line 1685 + 8 bytes
zend_do_fcall_common_helper_SPEC(_zend_execute_data * 0x0012fd6c, void * * * 0x00792cd0) line 188 + 95 bytes
ZEND_DO_FCALL_SPEC_CONST_HANDLER(_zend_execute_data * 0x0012fd6c, void * * * 0x00792cd0) line 1578 + 13 bytes
execute(_zend_op_array * 0x007bc880, void * * * 0x00792cd0) line 88 + 13 bytes
zend_eval_string(char * 0x00793bce, _zval_struct * 0x00000000, char * 0x00404588 tring', void * * * 0x00792cd0) line 1056 + 14 bytes
zend_eval_string_ex(char * 0x00793bce, _zval_struct * 0x00000000, char * 0x00404588 tring', int 1, void * * * 0x00792cd0) line 1090 + 21 bytes
main(int 3, char * * 0x00793ba8) line 1078 + 23 bytes
PHP! mainCRTStartup + 227 bytes
KERNEL32! 77e81af6()

Generating backtrace, without compiler, on Win32

You'll need:

For the sake of this example, we will simply use PHP in the shell. The same method can be used for IIS or any other process or services.

Once you have installed the Debug diagnostic tools and uncompressed PHP and its debug pack (they can be kept in two separate folders), the first step is to configure the diagnostic tools. Select the tools menu and click on "Options and settings". The first tab contains the path to the symbols files, add the "debug folder" to the existing list using the "browse" button:

Options

Now we are ready to generate our backtrace.

We will use the wizard, click the "Add a rule" button and choose "Crash" as the rule type:

Wizard #1

In the next window, select "a specific process":

Wizard #2

Add a "sleep(10);" for the first run (from the cmd: "php.exe crashme.php"), it will let you enough time to click "next" and select the php process. I you are debugging the Apache module, start Apache with -X option and choose httpd.exe instead of php.exe from the process list. Then proceed further:

Select the php process

Click again next and let it crash. If everything went well, you should see your new rule as shown in the image below:

rules list

It also detected that "php.exe" was used. A rule has been created for all instance of "php.exe". It will save you the sleep and process selection.

Now you can click the "Analyze data" button:

Analyze

Et voila, the complete report will show up in your internet explorer (compressed html):

Debug report backtrace screenshot

What we need is the backtrace itself which can be found under "Thread X - System ID XXX".

 
PHP Copyright © 2001-2014 The PHP Group
All rights reserved.
Last updated: Thu Apr 24 21:01:55 2014 UTC