From dac2297b1062975f5d9ac417dbea518c5823b8a6 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Sat, 9 Nov 2013 14:34:16 -0800 Subject: [PATCH 001/771] Initial commit --- README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 00000000000..2fc9fdfa7b4 --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +phpdbg +====== From 2fee7dce773dc365ef720d41568bcc2914065413 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sat, 9 Nov 2013 22:35:03 +0000 Subject: [PATCH 002/771] import --- Makefile.frag | 11 ++++ config.m4 | 34 +++++++++++ phpdbg.c | 160 ++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 205 insertions(+) create mode 100644 Makefile.frag create mode 100644 config.m4 create mode 100644 phpdbg.c diff --git a/Makefile.frag b/Makefile.frag new file mode 100644 index 00000000000..2a56b947f8c --- /dev/null +++ b/Makefile.frag @@ -0,0 +1,11 @@ +phpdbg: $(BUILD_BINARY) + +$(BUILD_BINARY): $(PHP_GLOBAL_OBJS) $(PHP_BINARY_OBJS) $(PHP_PHPDBG_OBJS) + $(BUILD_PHPDBG) + +install-phpdbg: $(BUILD_BINARY) + @echo "Installing phpdbg binary: $(INSTALL_ROOT)$(bindir)/" + @$(mkinstalldirs) $(INSTALL_ROOT)$(bindir) + @$(mkinstalldirs) $(INSTALL_ROOT)$(localstatedir)/log + @$(mkinstalldirs) $(INSTALL_ROOT)$(localstatedir)/run + @$(INSTALL) -m 0755 $(BUILD_BINARY) $(INSTALL_ROOT)$(sbindir)/$(program_prefix)phpdbg$(program_suffix)$(EXEEXT) diff --git a/config.m4 b/config.m4 new file mode 100644 index 00000000000..94e8727330f --- /dev/null +++ b/config.m4 @@ -0,0 +1,34 @@ +dnl +dnl $Id$ +dnl + +PHP_ARG_ENABLE(phpdbg, for phpdbg support, +[ --enable-phpdbg Build phpdbg], no, no) + +if test "$PHP_PHPDBG" != "no"; then + AC_DEFINE(HAVE_PHPDBG, 1, [ ]) + + PHP_PHPDBG_CFLAGS=-I$abs_srcdir/sapi/phpdbg + PHP_PHPDBG_FILES=phpdbg.c + + PHP_ADD_MAKEFILE_FRAGMENT([$abs_srcdir/sapi/phpdbg/Makefile.frag]) + PHP_SELECT_SAPI(phpdbg, program, $PHP_PHPDBG_FILES, $PHP_PHPDBG_CFLAGS, [$(SAPI_PHPDBG_PATH)]) + + BUILD_BINARY="sapi/phpdbg/phpdbg" + BUILD_PHPDBG="\$(LIBTOOL) --mode=link \ + \$(CC) -export-dynamic \$(CFLAGS_CLEAN) \$(EXTRA_CFLAGS) \$(EXTRA_LDFLAGS_PROGRAM) \$(LDFLAGS) \$(PHP_RPATHS) \ + \$(PHP_GLOBAL_OBJS) \ + \$(PHP_BINARY_OBJS) \ + \$(PHP_PHPDBG_OBJS) \ + \$(EXTRA_LIBS) \ + \$(PHPDBG_EXTRA_LIBS) \ + \$(ZEND_EXTRA_LIBS) \ + -o \$(BUILD_BINARY)" + + PHP_SUBST(BUILD_BINARY) + PHP_SUBST(BUILD_PHPDBG) +fi + +dnl ## Local Variables: +dnl ## tab-width: 4 +dnl ## End: diff --git a/phpdbg.c b/phpdbg.c new file mode 100644 index 00000000000..ba1b0a3e75a --- /dev/null +++ b/phpdbg.c @@ -0,0 +1,160 @@ +/* + +----------------------------------------------------------------------+ + | PHP Version 5 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997-2013 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 3.01 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | http://www.php.net/license/3_01.txt | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Authors: Joe Watkins | + +----------------------------------------------------------------------+ +*/ +#include "php.h" +#include "php_globals.h" +#include "php_variables.h" +#include "zend_modules.h" +#include "php.h" +#include "zend_ini_scanner.h" +#include "zend_globals.h" +#include "zend_stream.h" + +#include "SAPI.h" +#include "sapi/cgi/fastcgi.h" + +#include + +#include "php_main.h" + +static zend_module_entry sapi_server_module_entry = { + STANDARD_MODULE_HEADER, + "server", + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "0.1", + STANDARD_MODULE_PROPERTIES +}; + +static inline int php_sapi_server_module_startup(sapi_module_struct *module) { /* {{{ */ + if (php_module_startup(module, &sapi_server_module_entry, 1) == FAILURE) { + return FAILURE; + } + return SUCCESS; +} /* }}} */ + +/* {{{ sapi_module_struct server_sapi_module + */ +static sapi_module_struct server_sapi_module = { + "server", /* name */ + "SAPI server", /* pretty name */ + + php_sapi_server_module_startup, /* startup */ + php_module_shutdown_wrapper, /* shutdown */ + + NULL, /* activate */ + NULL, /* deactivate */ + + NULL, /* unbuffered write */ + NULL, /* flush */ + NULL, /* get uid */ + NULL, /* getenv */ + + php_error, /* error handler */ + + NULL, /* header handler */ + NULL, /* send headers handler */ + NULL, /* send header handler */ + + NULL, /* read POST data */ + NULL, /* read Cookies */ + + NULL, /* register server variables */ + NULL, /* Log message */ + NULL, /* Get request time */ + NULL, /* Child terminate */ + STANDARD_SAPI_MODULE_PROPERTIES +}; +/* }}} */ + +static inline int zend_machine(int argc, char **argv TSRMLS_DC) { /* {{{ */ + php_printf("Hello World :)\n"); +} /* }}} */ + +int main(int argc, char **argv) { /* {{{ */ +#ifdef ZTS + void ***tsrm_ls; + { + tsrm_startup( + 1, 1, 0, NULL); + + tsrm_ls = ts_resource(0); + } +#endif + + sapi_startup(&server_sapi_module); + + if (server_sapi_module.startup(&server_sapi_module) == SUCCESS) + { + zend_activate(TSRMLS_C); + +#ifdef ZEND_SIGNALS + zend_try { + zend_signals_activate(TSRMLS_C); + } zend_end_try(); +#endif + + PG(modules_activated)=0; + + zend_try { + zend_activate_modules(TSRMLS_C); + } zend_end_try(); + + /* START: ZEND INITIALIZED */ + { + /* do the thing */ + zend_machine(argc, argv TSRMLS_CC); + } + /* END: ZEND BLOCK */ + + if (PG(modules_activated)) { + zend_try { + zend_deactivate_modules(TSRMLS_C); + } zend_end_try(); + } + + zend_deactivate(TSRMLS_C); + + zend_try { + zend_post_deactivate_modules(TSRMLS_C); + } zend_end_try(); + +#ifdef ZEND_SIGNALS + zend_try { + zend_signal_deactivate(TSRMLS_C); + } zend_end_try(); +#endif + + zend_try { + shutdown_memory_manager(CG(unclean_shutdown), 0 TSRMLS_CC); + } zend_end_try(); + + php_module_shutdown(TSRMLS_C); + + sapi_shutdown(); + } + +#ifdef ZTS + tsrm_shutdown(); +#endif + + return 0; +} /* }}} */ From 60ee0cc74cbe43aa2452c97b1c687320d41b4c59 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sat, 9 Nov 2013 22:47:39 +0000 Subject: [PATCH 003/771] change server->phpdbg --- phpdbg.c | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/phpdbg.c b/phpdbg.c index ba1b0a3e75a..9223824193f 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -31,9 +31,9 @@ #include "php_main.h" -static zend_module_entry sapi_server_module_entry = { +static zend_module_entry sapi_phpdbg_module_entry = { STANDARD_MODULE_HEADER, - "server", + "phpdbg", NULL, NULL, NULL, @@ -44,20 +44,20 @@ static zend_module_entry sapi_server_module_entry = { STANDARD_MODULE_PROPERTIES }; -static inline int php_sapi_server_module_startup(sapi_module_struct *module) { /* {{{ */ - if (php_module_startup(module, &sapi_server_module_entry, 1) == FAILURE) { +static inline int php_sapi_phpdbg_module_startup(sapi_module_struct *module) { /* {{{ */ + if (php_module_startup(module, &sapi_phpdbg_module_entry, 1) == FAILURE) { return FAILURE; } return SUCCESS; } /* }}} */ -/* {{{ sapi_module_struct server_sapi_module +/* {{{ sapi_module_struct phpdbg_sapi_module */ -static sapi_module_struct server_sapi_module = { - "server", /* name */ - "SAPI server", /* pretty name */ +static sapi_module_struct phpdbg_sapi_module = { + "phpdbg", /* name */ + "phpdbg", /* pretty name */ - php_sapi_server_module_startup, /* startup */ + php_sapi_phpdbg_module_startup, /* startup */ php_module_shutdown_wrapper, /* shutdown */ NULL, /* activate */ @@ -100,9 +100,16 @@ int main(int argc, char **argv) { /* {{{ */ } #endif - sapi_startup(&server_sapi_module); +#ifdef PHP_WIN32 + _fmode = _O_BINARY; /*sets default for file streams to binary */ + setmode(_fileno(stdin), O_BINARY); /* make the stdio mode be binary */ + setmode(_fileno(stdout), O_BINARY); /* make the stdio mode be binary */ + setmode(_fileno(stderr), O_BINARY); /* make the stdio mode be binary */ +#endif + + sapi_startup(&phpdbg_sapi_module); - if (server_sapi_module.startup(&server_sapi_module) == SUCCESS) + if (phpdbg_sapi_module.startup(&phpdbg_sapi_module) == SUCCESS) { zend_activate(TSRMLS_C); From 1dd5d42bd80a5fa1f14b9f2046cfa042ff5e6195 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sat, 9 Nov 2013 22:53:27 +0000 Subject: [PATCH 004/771] cleanup --- phpdbg.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/phpdbg.c b/phpdbg.c index 9223824193f..7a9b419b9f8 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -25,7 +25,6 @@ #include "zend_stream.h" #include "SAPI.h" -#include "sapi/cgi/fastcgi.h" #include @@ -99,17 +98,20 @@ int main(int argc, char **argv) { /* {{{ */ tsrm_ls = ts_resource(0); } #endif - + sapi_module_struct *phpdbg = &phpdbg_sapi_module; + #ifdef PHP_WIN32 - _fmode = _O_BINARY; /*sets default for file streams to binary */ - setmode(_fileno(stdin), O_BINARY); /* make the stdio mode be binary */ - setmode(_fileno(stdout), O_BINARY); /* make the stdio mode be binary */ - setmode(_fileno(stderr), O_BINARY); /* make the stdio mode be binary */ + _fmode = _O_BINARY; /*sets default for file streams to binary */ + setmode(_fileno(stdin), O_BINARY); /* make the stdio mode be binary */ + setmode(_fileno(stdout), O_BINARY); /* make the stdio mode be binary */ + setmode(_fileno(stderr), O_BINARY); /* make the stdio mode be binary */ #endif - sapi_startup(&phpdbg_sapi_module); + phpdbg->executable_location = argv[0]; + + sapi_startup(phpdbg); - if (phpdbg_sapi_module.startup(&phpdbg_sapi_module) == SUCCESS) + if (phpdbg->startup(phpdbg) == SUCCESS) { zend_activate(TSRMLS_C); From 19a5ac93b40016ccb166e674a9c55cd297f5b1bf Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sat, 9 Nov 2013 21:07:04 -0200 Subject: [PATCH 005/771] - WS changes --- phpdbg.c | 169 +++++++++++++++++++++++++++---------------------------- 1 file changed, 83 insertions(+), 86 deletions(-) diff --git a/phpdbg.c b/phpdbg.c index 7a9b419b9f8..36319df2ed7 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -15,6 +15,7 @@ | Authors: Joe Watkins | +----------------------------------------------------------------------+ */ + #include "php.h" #include "php_globals.h" #include "php_variables.h" @@ -23,11 +24,8 @@ #include "zend_ini_scanner.h" #include "zend_globals.h" #include "zend_stream.h" - #include "SAPI.h" - #include - #include "php_main.h" static zend_module_entry sapi_phpdbg_module_entry = { @@ -43,7 +41,8 @@ static zend_module_entry sapi_phpdbg_module_entry = { STANDARD_MODULE_PROPERTIES }; -static inline int php_sapi_phpdbg_module_startup(sapi_module_struct *module) { /* {{{ */ +static inline int php_sapi_phpdbg_module_startup(sapi_module_struct *module) /* {{{ */ +{ if (php_module_startup(module, &sapi_phpdbg_module_entry, 1) == FAILURE) { return FAILURE; } @@ -53,117 +52,115 @@ static inline int php_sapi_phpdbg_module_startup(sapi_module_struct *module) { / /* {{{ sapi_module_struct phpdbg_sapi_module */ static sapi_module_struct phpdbg_sapi_module = { - "phpdbg", /* name */ - "phpdbg", /* pretty name */ + "phpdbg", /* name */ + "phpdbg", /* pretty name */ php_sapi_phpdbg_module_startup, /* startup */ php_module_shutdown_wrapper, /* shutdown */ - NULL, /* activate */ - NULL, /* deactivate */ + NULL, /* activate */ + NULL, /* deactivate */ - NULL, /* unbuffered write */ - NULL, /* flush */ - NULL, /* get uid */ - NULL, /* getenv */ + NULL, /* unbuffered write */ + NULL, /* flush */ + NULL, /* get uid */ + NULL, /* getenv */ - php_error, /* error handler */ + php_error, /* error handler */ - NULL, /* header handler */ - NULL, /* send headers handler */ - NULL, /* send header handler */ + NULL, /* header handler */ + NULL, /* send headers handler */ + NULL, /* send header handler */ - NULL, /* read POST data */ - NULL, /* read Cookies */ + NULL, /* read POST data */ + NULL, /* read Cookies */ - NULL, /* register server variables */ - NULL, /* Log message */ - NULL, /* Get request time */ - NULL, /* Child terminate */ + NULL, /* register server variables */ + NULL, /* Log message */ + NULL, /* Get request time */ + NULL, /* Child terminate */ STANDARD_SAPI_MODULE_PROPERTIES }; /* }}} */ -static inline int zend_machine(int argc, char **argv TSRMLS_DC) { /* {{{ */ +static inline int zend_machine(int argc, char **argv TSRMLS_DC) /* {{{ */ +{ php_printf("Hello World :)\n"); } /* }}} */ -int main(int argc, char **argv) { /* {{{ */ +int main(int argc, char **argv) /* {{{ */ +{ #ifdef ZTS - void ***tsrm_ls; - { - tsrm_startup( - 1, 1, 0, NULL); - - tsrm_ls = ts_resource(0); - } + void ***tsrm_ls; + tsrm_startup(1, 1, 0, NULL); + + tsrm_ls = ts_resource(0); #endif - sapi_module_struct *phpdbg = &phpdbg_sapi_module; - + sapi_module_struct *phpdbg = &phpdbg_sapi_module; + #ifdef PHP_WIN32 - _fmode = _O_BINARY; /*sets default for file streams to binary */ - setmode(_fileno(stdin), O_BINARY); /* make the stdio mode be binary */ - setmode(_fileno(stdout), O_BINARY); /* make the stdio mode be binary */ - setmode(_fileno(stderr), O_BINARY); /* make the stdio mode be binary */ + _fmode = _O_BINARY; /* sets default for file streams to binary */ + setmode(_fileno(stdin), O_BINARY); /* make the stdio mode be binary */ + setmode(_fileno(stdout), O_BINARY); /* make the stdio mode be binary */ + setmode(_fileno(stderr), O_BINARY); /* make the stdio mode be binary */ #endif - phpdbg->executable_location = argv[0]; - - sapi_startup(phpdbg); + phpdbg->executable_location = argv[0]; + + sapi_startup(phpdbg); + + if (phpdbg->startup(phpdbg) == SUCCESS) { + zend_activate(TSRMLS_C); - if (phpdbg->startup(phpdbg) == SUCCESS) - { - zend_activate(TSRMLS_C); - #ifdef ZEND_SIGNALS - zend_try { - zend_signals_activate(TSRMLS_C); - } zend_end_try(); + zend_try { + zend_signals_activate(TSRMLS_C); + } zend_end_try(); #endif - PG(modules_activated)=0; - - zend_try { - zend_activate_modules(TSRMLS_C); - } zend_end_try(); - - /* START: ZEND INITIALIZED */ - { - /* do the thing */ - zend_machine(argc, argv TSRMLS_CC); - } - /* END: ZEND BLOCK */ - - if (PG(modules_activated)) { - zend_try { - zend_deactivate_modules(TSRMLS_C); - } zend_end_try(); - } - - zend_deactivate(TSRMLS_C); - - zend_try { - zend_post_deactivate_modules(TSRMLS_C); - } zend_end_try(); - + PG(modules_activated) = 0; + + zend_try { + zend_activate_modules(TSRMLS_C); + } zend_end_try(); + + /* START: ZEND INITIALIZED */ + { + /* do the thing */ + zend_machine(argc, argv TSRMLS_CC); + } + /* END: ZEND BLOCK */ + + if (PG(modules_activated)) { + zend_try { + zend_deactivate_modules(TSRMLS_C); + } zend_end_try(); + } + + zend_deactivate(TSRMLS_C); + + zend_try { + zend_post_deactivate_modules(TSRMLS_C); + } zend_end_try(); + #ifdef ZEND_SIGNALS - zend_try { - zend_signal_deactivate(TSRMLS_C); - } zend_end_try(); + zend_try { + zend_signal_deactivate(TSRMLS_C); + } zend_end_try(); #endif - zend_try { - shutdown_memory_manager(CG(unclean_shutdown), 0 TSRMLS_CC); - } zend_end_try(); - - php_module_shutdown(TSRMLS_C); - - sapi_shutdown(); - } - + zend_try { + shutdown_memory_manager(CG(unclean_shutdown), 0 TSRMLS_CC); + } zend_end_try(); + + php_module_shutdown(TSRMLS_C); + + sapi_shutdown(); + } + #ifdef ZTS - tsrm_shutdown(); + tsrm_shutdown(); #endif - return 0; + return 0; } /* }}} */ From 8ac55d018cfeeca07c58df392eb1f961b4c3e514 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sat, 9 Nov 2013 21:08:01 -0200 Subject: [PATCH 006/771] - Added .gitignore --- .gitignore | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000000..2969ad7f15c --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +.libs/ +phpdbg +phpdbg.lo +phpdbg.o + From f16ccad2ffb3a00b74277f2c38779212528bfc6a Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sat, 9 Nov 2013 21:33:43 -0200 Subject: [PATCH 007/771] - Fixed unexpected memory leak warning --- phpdbg.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/phpdbg.c b/phpdbg.c index 36319df2ed7..ba4da219079 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -149,10 +149,6 @@ int main(int argc, char **argv) /* {{{ */ } zend_end_try(); #endif - zend_try { - shutdown_memory_manager(CG(unclean_shutdown), 0 TSRMLS_CC); - } zend_end_try(); - php_module_shutdown(TSRMLS_C); sapi_shutdown(); From 1c7ae5f1a69686eba3acac66f7fe45318befe19d Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sat, 9 Nov 2013 22:34:38 -0200 Subject: [PATCH 008/771] - Declaration first --- phpdbg.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpdbg.c b/phpdbg.c index ba4da219079..375e4ff8b8d 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -90,13 +90,13 @@ static inline int zend_machine(int argc, char **argv TSRMLS_DC) /* {{{ */ int main(int argc, char **argv) /* {{{ */ { + sapi_module_struct *phpdbg = &phpdbg_sapi_module; #ifdef ZTS void ***tsrm_ls; tsrm_startup(1, 1, 0, NULL); tsrm_ls = ts_resource(0); #endif - sapi_module_struct *phpdbg = &phpdbg_sapi_module; #ifdef PHP_WIN32 _fmode = _O_BINARY; /* sets default for file streams to binary */ From 612d6b258243968db00a79eab2876a4eaa94aa86 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sat, 9 Nov 2013 23:30:32 -0200 Subject: [PATCH 009/771] - Added initial code for a simple prompt --- .gitignore | 4 +-- config.m4 | 8 +++--- phpdbg.c | 14 +++------- phpdbg_prompt.c | 72 +++++++++++++++++++++++++++++++++++++++++++++++++ phpdbg_prompt.h | 43 +++++++++++++++++++++++++++++ 5 files changed, 124 insertions(+), 17 deletions(-) create mode 100644 phpdbg_prompt.c create mode 100644 phpdbg_prompt.h diff --git a/.gitignore b/.gitignore index 2969ad7f15c..a9e84f897bf 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,5 @@ .libs/ phpdbg -phpdbg.lo -phpdbg.o +*.lo +*.o diff --git a/config.m4 b/config.m4 index 94e8727330f..d2dac4acb3d 100644 --- a/config.m4 +++ b/config.m4 @@ -7,13 +7,13 @@ PHP_ARG_ENABLE(phpdbg, for phpdbg support, if test "$PHP_PHPDBG" != "no"; then AC_DEFINE(HAVE_PHPDBG, 1, [ ]) - + PHP_PHPDBG_CFLAGS=-I$abs_srcdir/sapi/phpdbg - PHP_PHPDBG_FILES=phpdbg.c + PHP_PHPDBG_FILES="phpdbg.c phpdbg_prompt.c" - PHP_ADD_MAKEFILE_FRAGMENT([$abs_srcdir/sapi/phpdbg/Makefile.frag]) + PHP_ADD_MAKEFILE_FRAGMENT([$abs_srcdir/sapi/phpdbg/Makefile.frag]) PHP_SELECT_SAPI(phpdbg, program, $PHP_PHPDBG_FILES, $PHP_PHPDBG_CFLAGS, [$(SAPI_PHPDBG_PATH)]) - + BUILD_BINARY="sapi/phpdbg/phpdbg" BUILD_PHPDBG="\$(LIBTOOL) --mode=link \ \$(CC) -export-dynamic \$(CFLAGS_CLEAN) \$(EXTRA_CFLAGS) \$(EXTRA_LDFLAGS_PROGRAM) \$(LDFLAGS) \$(PHP_RPATHS) \ diff --git a/phpdbg.c b/phpdbg.c index 375e4ff8b8d..b29a79929d4 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -83,11 +83,6 @@ static sapi_module_struct phpdbg_sapi_module = { }; /* }}} */ -static inline int zend_machine(int argc, char **argv TSRMLS_DC) /* {{{ */ -{ - php_printf("Hello World :)\n"); -} /* }}} */ - int main(int argc, char **argv) /* {{{ */ { sapi_module_struct *phpdbg = &phpdbg_sapi_module; @@ -124,12 +119,9 @@ int main(int argc, char **argv) /* {{{ */ zend_activate_modules(TSRMLS_C); } zend_end_try(); - /* START: ZEND INITIALIZED */ - { - /* do the thing */ - zend_machine(argc, argv TSRMLS_CC); - } - /* END: ZEND BLOCK */ + zend_try { + phpdbg_iteractive(argc, argv); + } zend_end_try(); if (PG(modules_activated)) { zend_try { diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c new file mode 100644 index 00000000000..475cbc38e6d --- /dev/null +++ b/phpdbg_prompt.c @@ -0,0 +1,72 @@ +/* + +----------------------------------------------------------------------+ + | PHP Version 5 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997-2013 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 3.01 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | http://www.php.net/license/3_01.txt | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Authors: Felipe Pena | + +----------------------------------------------------------------------+ +*/ + +#include +#include +#include "zend.h" +#include "phpdbg_prompt.h" + +void do_quit(const char *params) /* {{{ */ +{ + zend_bailout(); +} /* }}} */ + +static const phpdbg_command prompt_commands[] = { + {PHPDBG_STRL("quit"), do_quit}, + {NULL, 0, 0} +}; + +static void do_cmd(char *cmd_line) /* {{{ */ +{ + const phpdbg_command *command = prompt_commands; + char *params = NULL; + const char *cmd = strtok_r(cmd_line, " ", ¶ms); + size_t cmd_len = cmd ? strlen(cmd) : 0; + + while (command && command->name) { + if (command->name_len == cmd_len + && memcmp(cmd, command->name, cmd_len) == 0) { + /* Command find */ + command->handler(params); + return; + } + ++command; + } + + printf("command not found!\n"); + +} /* }}} */ + +void phpdbg_iteractive(int argc, char **argv) /* {{{ */ +{ + char cmd[PHPDBG_MAX_CMD]; + + printf("phpdbg> "); + + while (fgets(cmd, PHPDBG_MAX_CMD, stdin) != NULL) { + size_t cmd_len = strlen(cmd) - 1; + + if (cmd[cmd_len] == '\n') { + cmd[cmd_len] = 0; + } + if (cmd_len) { + do_cmd(cmd); + } + printf("phpdbg> "); + } +} /* }}} */ diff --git a/phpdbg_prompt.h b/phpdbg_prompt.h new file mode 100644 index 00000000000..0740a940ba6 --- /dev/null +++ b/phpdbg_prompt.h @@ -0,0 +1,43 @@ +/* + +----------------------------------------------------------------------+ + | PHP Version 5 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997-2013 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 3.01 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | http://www.php.net/license/3_01.txt | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Authors: Felipe Pena | + +----------------------------------------------------------------------+ +*/ + +#ifndef PHPDBG_PROMPT_H +#define PHPDBG_PROMPT_H + +/** + * Maximum command length + */ +#define PHPDBG_MAX_CMD 500 + +#define PHPDBG_STRL(s) s, sizeof(s)-1 + +/** + * Command handler + */ +typedef void (*phpdbg_command_handler)(const char*); + +/** + * Command representation + */ +typedef struct _phpdbg_command { + const char *name; /* Command name */ + size_t name_len; /* Command name length */ + phpdbg_command_handler handler; /* Command handler */ +} phpdbg_command; + +#endif From 19c16083a71be15638828b60c2e9bce697fa13cc Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sat, 9 Nov 2013 23:38:17 -0200 Subject: [PATCH 010/771] - WS change --- phpdbg_prompt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 475cbc38e6d..73a18eb8183 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -58,7 +58,7 @@ void phpdbg_iteractive(int argc, char **argv) /* {{{ */ printf("phpdbg> "); - while (fgets(cmd, PHPDBG_MAX_CMD, stdin) != NULL) { + while (fgets(cmd, PHPDBG_MAX_CMD, stdin) != NULL) { size_t cmd_len = strlen(cmd) - 1; if (cmd[cmd_len] == '\n') { From 2bda09abc6c938b6c964052a43b830e591a7ede9 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sat, 9 Nov 2013 23:42:41 -0200 Subject: [PATCH 011/771] - Added prototype for non-static function, fixed typo and staticfy command handler --- phpdbg_prompt.c | 4 ++-- phpdbg_prompt.h | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 73a18eb8183..79544921897 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -21,7 +21,7 @@ #include "zend.h" #include "phpdbg_prompt.h" -void do_quit(const char *params) /* {{{ */ +static void do_quit(const char *params) /* {{{ */ { zend_bailout(); } /* }}} */ @@ -41,7 +41,7 @@ static void do_cmd(char *cmd_line) /* {{{ */ while (command && command->name) { if (command->name_len == cmd_len && memcmp(cmd, command->name, cmd_len) == 0) { - /* Command find */ + /* Command found! */ command->handler(params); return; } diff --git a/phpdbg_prompt.h b/phpdbg_prompt.h index 0740a940ba6..09a5028a361 100644 --- a/phpdbg_prompt.h +++ b/phpdbg_prompt.h @@ -40,4 +40,6 @@ typedef struct _phpdbg_command { phpdbg_command_handler handler; /* Command handler */ } phpdbg_command; -#endif +void phpdbg_iteractive(int, char**); + +#endif /* PHPDBG_PROMPT_H */ From 39263cbfb1169a95352a5ed868fd5e63c9c2cdfb Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 08:20:57 +0000 Subject: [PATCH 012/771] header in main --- phpdbg.c | 1 + 1 file changed, 1 insertion(+) diff --git a/phpdbg.c b/phpdbg.c index b29a79929d4..d1f127d0327 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -27,6 +27,7 @@ #include "SAPI.h" #include #include "php_main.h" +#include "phpdbg_prompt.h" static zend_module_entry sapi_phpdbg_module_entry = { STANDARD_MODULE_HEADER, From 2089caed53dd3e4e83b847b6786cb5969edd5b49 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 10:44:42 +0000 Subject: [PATCH 013/771] bit more work on menu implement helper menu name some macros to help with declarations (sorry Felipe :)) --- config.m4 | 2 +- phpdbg.c | 45 ++++++++++++++++--------- phpdbg_help.c | 38 +++++++++++++++++++++ phpdbg_help.h | 46 ++++++++++++++++++++++++++ phpdbg_prompt.c | 88 +++++++++++++++++++++++++++++++++++++++---------- phpdbg_prompt.h | 26 ++++++++++++--- 6 files changed, 205 insertions(+), 40 deletions(-) create mode 100644 phpdbg_help.c create mode 100644 phpdbg_help.h diff --git a/config.m4 b/config.m4 index d2dac4acb3d..b62d099ad40 100644 --- a/config.m4 +++ b/config.m4 @@ -9,7 +9,7 @@ if test "$PHP_PHPDBG" != "no"; then AC_DEFINE(HAVE_PHPDBG, 1, [ ]) PHP_PHPDBG_CFLAGS=-I$abs_srcdir/sapi/phpdbg - PHP_PHPDBG_FILES="phpdbg.c phpdbg_prompt.c" + PHP_PHPDBG_FILES="phpdbg.c phpdbg_prompt.c phpdbg_help.c" PHP_ADD_MAKEFILE_FRAGMENT([$abs_srcdir/sapi/phpdbg/Makefile.frag]) PHP_SELECT_SAPI(phpdbg, program, $PHP_PHPDBG_FILES, $PHP_PHPDBG_CFLAGS, [$(SAPI_PHPDBG_PATH)]) diff --git a/phpdbg.c b/phpdbg.c index d1f127d0327..b5ba10a232d 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -16,27 +16,40 @@ +----------------------------------------------------------------------+ */ -#include "php.h" -#include "php_globals.h" -#include "php_variables.h" -#include "zend_modules.h" -#include "php.h" -#include "zend_ini_scanner.h" -#include "zend_globals.h" -#include "zend_stream.h" -#include "SAPI.h" -#include -#include "php_main.h" -#include "phpdbg_prompt.h" +#include "phpdbg.h" + +ZEND_DECLARE_MODULE_GLOBALS(phpdbg); + +static inline void php_phpdbg_globals_ctor(zend_phpdbg_globals *pg) {} + +static PHP_MINIT_FUNCTION(phpdbg) { + ZEND_INIT_MODULE_GLOBALS(phpdbg, php_phpdbg_globals_ctor, NULL); + + return SUCCESS; +} + +static inline void php_phpdbg_destroy_break(void *brake) { + +} + +static PHP_RINIT_FUNCTION(phpdbg) { + zend_hash_init(&PHPDBG_G(breaks), 8, NULL, php_phpdbg_destroy_break, 0); + + return SUCCESS; +} + +static PHP_RSHUTDOWN_FUNCTION(phpdbg) { + zend_hash_destroy(&PHPDBG_G(breaks)); +} static zend_module_entry sapi_phpdbg_module_entry = { STANDARD_MODULE_HEADER, "phpdbg", NULL, + PHP_MINIT(phpdbg), NULL, - NULL, - NULL, - NULL, + PHP_RINIT(phpdbg), + PHP_RSHUTDOWN(phpdbg), NULL, "0.1", STANDARD_MODULE_PROPERTIES @@ -121,7 +134,7 @@ int main(int argc, char **argv) /* {{{ */ } zend_end_try(); zend_try { - phpdbg_iteractive(argc, argv); + phpdbg_interactive(argc, argv TSRMLS_CC); } zend_end_try(); if (PG(modules_activated)) { diff --git a/phpdbg_help.c b/phpdbg_help.c new file mode 100644 index 00000000000..5cb2d209d60 --- /dev/null +++ b/phpdbg_help.c @@ -0,0 +1,38 @@ +/* + +----------------------------------------------------------------------+ + | PHP Version 5 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997-2013 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 3.01 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | http://www.php.net/license/3_01.txt | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Authors: Felipe Pena | + | Authors: Joe Watkins | + +----------------------------------------------------------------------+ +*/ + +#include +#include +#include "zend.h" +#include "phpdbg.h" +#include "phpdbg_help.h" + +PHPDBG_HELP(print) /* {{{ */ +{ + printf("doing print help: %s\n", expr); + + return SUCCESS; +} /* }}} */ + +PHPDBG_HELP(brake) /* {{{ */ +{ + printf("doing brake help: %s\n", expr); + + return SUCCESS; +} /* }}} */ diff --git a/phpdbg_help.h b/phpdbg_help.h new file mode 100644 index 00000000000..f2a2e2dd88e --- /dev/null +++ b/phpdbg_help.h @@ -0,0 +1,46 @@ +/* + +----------------------------------------------------------------------+ + | PHP Version 5 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997-2013 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 3.01 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | http://www.php.net/license/3_01.txt | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Authors: Felipe Pena | + | Authors: Joe Watkins | + +----------------------------------------------------------------------+ +*/ + +#ifndef PHPDBG_HELP_H +#define PHPDBG_HELP_H + +/** + * Command Declarators + */ +#define PHPDBG_HELP_D(name, tip) \ + {PHPDBG_STRL(#name), tip, sizeof(tip)-1, phpdbg_do_help_##name} +#define PHPDBG_HELP(name) \ + int phpdbg_do_help_##name(const char *expr, size_t expr_len TSRMLS_DC) + +/** + * Helper Forward Declarations + */ +PHPDBG_HELP(print); +PHPDBG_HELP(brake); + +/** + * Commands + */ +static const phpdbg_command_t phpdbg_help_commands[] = { + PHPDBG_HELP_D(print, "printing allows inspection of the execution environment"), + PHPDBG_HELP_D(brake, "brake points allow execution interruption"), + {NULL, 0, 0} +}; + +#endif /* PHPDBG_HELP_H */ diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 79544921897..be33353a995 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -13,46 +13,94 @@ | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Authors: Felipe Pena | + | Authors: Joe Watkins | +----------------------------------------------------------------------+ */ #include #include #include "zend.h" -#include "phpdbg_prompt.h" +#include "phpdbg.h" +#include "phpdbg_help.h" -static void do_quit(const char *params) /* {{{ */ +static const phpdbg_command_t phpdbg_prompt_commands[]; + +static PHPDBG_COMMAND(print) { /* {{{ */ + printf("%s", expr); + + return SUCCESS; +} /* }}} */ + +static PHPDBG_COMMAND(brake) { /* {{{ */ + return SUCCESS; +} /* }}} */ + +static PHPDBG_COMMAND(quit) /* {{{ */ { zend_bailout(); + + return SUCCESS; } /* }}} */ -static const phpdbg_command prompt_commands[] = { - {PHPDBG_STRL("quit"), do_quit}, +static PHPDBG_COMMAND(help) /* {{{ */ +{ + printf("Welcome to phpdbg, the interactive PHP debugger.\n"); + if (!expr_len) { + printf("To get help regarding a specific command type \"help command\"\n"); + printf("Commands:\n"); + { + const phpdbg_command_t *command = phpdbg_prompt_commands; + while (command && command->name) { + printf( + "\t%s\t%s\n", command->name, command->tip); + command++; + } + } + printf("Helpers Loaded:\n"); + { + const phpdbg_command_t *command = phpdbg_help_commands; + while (command && command->name) { + printf( + "\t%s\t%s\n", command->name, command->tip); + command++; + } + } + } else { + if (phpdbg_do_cmd(phpdbg_help_commands, expr, expr_len TSRMLS_CC) == FAILURE) { + printf("failed to find help command: %s\n", expr); + } + } + printf("Please report bugs to \n"); + + return SUCCESS; +} /* }}} */ + +static const phpdbg_command_t phpdbg_prompt_commands[] = { + PHPDBG_COMMAND_D(print, "print something"), + PHPDBG_COMMAND_D(brake, "set brake point"), + PHPDBG_COMMAND_D(help, "show help menu"), + PHPDBG_COMMAND_D(quit, "exit phpdbg"), {NULL, 0, 0} }; -static void do_cmd(char *cmd_line) /* {{{ */ +int phpdbg_do_cmd(const phpdbg_command_t *command, char *cmd_line, size_t cmd_len TSRMLS_DC) /* {{{ */ { - const phpdbg_command *command = prompt_commands; char *params = NULL; const char *cmd = strtok_r(cmd_line, " ", ¶ms); - size_t cmd_len = cmd ? strlen(cmd) : 0; - + size_t expr_len = cmd != NULL ? strlen(cmd) : 0; + while (command && command->name) { - if (command->name_len == cmd_len - && memcmp(cmd, command->name, cmd_len) == 0) { - /* Command found! */ - command->handler(params); - return; + if (command->name_len == expr_len + && memcmp(cmd, command->name, expr_len) == 0) { + return command->handler(params, cmd_len - expr_len TSRMLS_CC); } ++command; } - printf("command not found!\n"); - + return FAILURE; } /* }}} */ -void phpdbg_iteractive(int argc, char **argv) /* {{{ */ +void phpdbg_interactive(int argc, char **argv TSRMLS_DC) /* {{{ */ { char cmd[PHPDBG_MAX_CMD]; @@ -61,12 +109,16 @@ void phpdbg_iteractive(int argc, char **argv) /* {{{ */ while (fgets(cmd, PHPDBG_MAX_CMD, stdin) != NULL) { size_t cmd_len = strlen(cmd) - 1; - if (cmd[cmd_len] == '\n') { + while (cmd[cmd_len] == '\n') { cmd[cmd_len] = 0; } + if (cmd_len) { - do_cmd(cmd); + if (phpdbg_do_cmd(phpdbg_prompt_commands, cmd, cmd_len TSRMLS_CC) == FAILURE) { + printf("error executing %s !\n", cmd); + } } + printf("phpdbg> "); } } /* }}} */ diff --git a/phpdbg_prompt.h b/phpdbg_prompt.h index 09a5028a361..b1238ece640 100644 --- a/phpdbg_prompt.h +++ b/phpdbg_prompt.h @@ -13,6 +13,7 @@ | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Authors: Felipe Pena | + | Authors: Joe Watkins | +----------------------------------------------------------------------+ */ @@ -29,17 +30,32 @@ /** * Command handler */ -typedef void (*phpdbg_command_handler)(const char*); +typedef int (*phpdbg_command_handler_t)(const char* expr, size_t expr_len TSRMLS_DC); /** * Command representation */ -typedef struct _phpdbg_command { +typedef struct _phpdbg_command_t { const char *name; /* Command name */ size_t name_len; /* Command name length */ - phpdbg_command_handler handler; /* Command handler */ -} phpdbg_command; + const char *tip; /* Menu tip */ + size_t tip_len; /* Menu tip length */ + phpdbg_command_handler_t handler; /* Command handler */ +} phpdbg_command_t; -void phpdbg_iteractive(int, char**); +/** + * Command Executor + */ +int phpdbg_do_cmd(const phpdbg_command_t *command, char *cmd_line, size_t cmd_len TSRMLS_DC); + +/** + * Command Declarators + */ +#define PHPDBG_COMMAND_D(name, tip) \ + {PHPDBG_STRL(#name), tip, sizeof(tip)-1, phpdbg_do_##name} +#define PHPDBG_COMMAND(name) \ + int phpdbg_do_##name(const char *expr, size_t expr_len TSRMLS_DC) + +void phpdbg_interactive(int argc, char** argv TSRMLS_DC); #endif /* PHPDBG_PROMPT_H */ From ad3aa32a2f3c4b13135cabdcc8605bf9f3409f16 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 10:46:18 +0000 Subject: [PATCH 014/771] woops --- phpdbg.h | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 phpdbg.h diff --git a/phpdbg.h b/phpdbg.h new file mode 100644 index 00000000000..4a40c72fa20 --- /dev/null +++ b/phpdbg.h @@ -0,0 +1,43 @@ +/* + +----------------------------------------------------------------------+ + | PHP Version 5 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997-2013 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 3.01 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | http://www.php.net/license/3_01.txt | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Authors: Joe Watkins | + +----------------------------------------------------------------------+ +*/ +#include "php.h" +#include "php_globals.h" +#include "php_variables.h" +#include "zend_modules.h" +#include "zend_ini_scanner.h" +#include "zend_globals.h" +#include "zend_stream.h" +#include "SAPI.h" +#include +#include "php_main.h" + +#ifdef ZTS +# include "TSRM.h" +#endif + +#ifdef ZTS +# define PHPDBG_G(v) TSRMG(phpdbg_globals_id, zend_phpdbg_globals *, v) +#else +# define PHPDBG_G(v) (phpdbg_globals.v) +#endif + +ZEND_BEGIN_MODULE_GLOBALS(phpdbg) + HashTable breaks; +ZEND_END_MODULE_GLOBALS(phpdbg) + +#include "phpdbg_prompt.h" From 6df19b3aa25b4384ab806841ebbafa8f4fe95962 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 11:03:29 +0000 Subject: [PATCH 015/771] ... --- phpdbg.c | 7 ++++++- phpdbg.h | 2 ++ phpdbg_help.c | 7 +++++++ phpdbg_help.h | 2 ++ phpdbg_prompt.c | 24 +++++++++++++++++++++--- 5 files changed, 38 insertions(+), 4 deletions(-) diff --git a/phpdbg.c b/phpdbg.c index b5ba10a232d..88d6eaddaeb 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -20,7 +20,9 @@ ZEND_DECLARE_MODULE_GLOBALS(phpdbg); -static inline void php_phpdbg_globals_ctor(zend_phpdbg_globals *pg) {} +static inline void php_phpdbg_globals_ctor(zend_phpdbg_globals *pg) { + pg->exec = NULL; +} static PHP_MINIT_FUNCTION(phpdbg) { ZEND_INIT_MODULE_GLOBALS(phpdbg, php_phpdbg_globals_ctor, NULL); @@ -40,6 +42,9 @@ static PHP_RINIT_FUNCTION(phpdbg) { static PHP_RSHUTDOWN_FUNCTION(phpdbg) { zend_hash_destroy(&PHPDBG_G(breaks)); + if (PHPDBG_G(exec)) { + efree(PHPDBG_G(exec)); + } } static zend_module_entry sapi_phpdbg_module_entry = { diff --git a/phpdbg.h b/phpdbg.h index 4a40c72fa20..94ee7201b84 100644 --- a/phpdbg.h +++ b/phpdbg.h @@ -38,6 +38,8 @@ ZEND_BEGIN_MODULE_GLOBALS(phpdbg) HashTable breaks; + char *exec; /* file to execute */ + size_t exec_len; /* size of exec */ ZEND_END_MODULE_GLOBALS(phpdbg) #include "phpdbg_prompt.h" diff --git a/phpdbg_help.c b/phpdbg_help.c index 5cb2d209d60..586cd68cf4f 100644 --- a/phpdbg_help.c +++ b/phpdbg_help.c @@ -23,6 +23,13 @@ #include "phpdbg.h" #include "phpdbg_help.h" +PHPDBG_HELP(exec) /* {{{ */ +{ + printf("doing exec help: %s\n", expr); + + return SUCCESS; +} /* }}} */ + PHPDBG_HELP(print) /* {{{ */ { printf("doing print help: %s\n", expr); diff --git a/phpdbg_help.h b/phpdbg_help.h index f2a2e2dd88e..b3dfb228fdf 100644 --- a/phpdbg_help.h +++ b/phpdbg_help.h @@ -31,6 +31,7 @@ /** * Helper Forward Declarations */ +PHPDBG_HELP(exec); PHPDBG_HELP(print); PHPDBG_HELP(brake); @@ -38,6 +39,7 @@ PHPDBG_HELP(brake); * Commands */ static const phpdbg_command_t phpdbg_help_commands[] = { + PHPDBG_HELP_D(exec, "the execution context should be a valid phpdbg path"), PHPDBG_HELP_D(print, "printing allows inspection of the execution environment"), PHPDBG_HELP_D(brake, "brake points allow execution interruption"), {NULL, 0, 0} diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index be33353a995..6fc59a05067 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -25,9 +25,26 @@ static const phpdbg_command_t phpdbg_prompt_commands[]; -static PHPDBG_COMMAND(print) { /* {{{ */ - printf("%s", expr); +ZEND_EXTERN_MODULE_GLOBALS(phpdbg); + +static PHPDBG_COMMAND(exec) { /* {{{ */ + if (PHPDBG_G(exec)) { + printf( + "Unsetting old execution context: %s\n", PHPDBG_G(exec)); + efree(PHPDBG_G(exec)); + } + PHPDBG_G(exec) = estrndup( + expr, PHPDBG_G(exec_len)=expr_len); + + printf( + "Set execution context: %s\n", PHPDBG_G(exec)); +} /* }}} */ + +static PHPDBG_COMMAND(print) { /* {{{ */ + printf( + "%s\n", expr); + return SUCCESS; } /* }}} */ @@ -75,7 +92,8 @@ static PHPDBG_COMMAND(help) /* {{{ */ return SUCCESS; } /* }}} */ -static const phpdbg_command_t phpdbg_prompt_commands[] = { +static const phpdbg_command_t phpdbg_prompt_commands[] = { + PHPDBG_COMMAND_D(exec, "set execution context"), PHPDBG_COMMAND_D(print, "print something"), PHPDBG_COMMAND_D(brake, "set brake point"), PHPDBG_COMMAND_D(help, "show help menu"), From b978c20f63d911a07cd8288839e56119748a1a90 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 11:35:59 +0000 Subject: [PATCH 016/771] +compile --- phpdbg.c | 7 ++++++ phpdbg.h | 5 ++-- phpdbg_help.c | 26 +++++++++++++++----- phpdbg_help.h | 8 ++++--- phpdbg_prompt.c | 64 +++++++++++++++++++++++++++++++++++++++++++------ 5 files changed, 92 insertions(+), 18 deletions(-) diff --git a/phpdbg.c b/phpdbg.c index 88d6eaddaeb..b416a54fa64 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -22,6 +22,7 @@ ZEND_DECLARE_MODULE_GLOBALS(phpdbg); static inline void php_phpdbg_globals_ctor(zend_phpdbg_globals *pg) { pg->exec = NULL; + pg->ops = NULL; } static PHP_MINIT_FUNCTION(phpdbg) { @@ -42,9 +43,15 @@ static PHP_RINIT_FUNCTION(phpdbg) { static PHP_RSHUTDOWN_FUNCTION(phpdbg) { zend_hash_destroy(&PHPDBG_G(breaks)); + if (PHPDBG_G(exec)) { efree(PHPDBG_G(exec)); } + + if (PHPDBG_G(ops)) { + destroy_op_array(PHPDBG_G(ops) TSRMLS_CC); + efree(PHPDBG_G(ops)); + } } static zend_module_entry sapi_phpdbg_module_entry = { diff --git a/phpdbg.h b/phpdbg.h index 94ee7201b84..ba3ea5d5338 100644 --- a/phpdbg.h +++ b/phpdbg.h @@ -38,8 +38,9 @@ ZEND_BEGIN_MODULE_GLOBALS(phpdbg) HashTable breaks; - char *exec; /* file to execute */ - size_t exec_len; /* size of exec */ + char *exec; /* file to execute */ + size_t exec_len; /* size of exec */ + zend_op_array *ops; /* op_array */ ZEND_END_MODULE_GLOBALS(phpdbg) #include "phpdbg_prompt.h" diff --git a/phpdbg_help.c b/phpdbg_help.c index 586cd68cf4f..48d32a2db34 100644 --- a/phpdbg_help.c +++ b/phpdbg_help.c @@ -25,21 +25,35 @@ PHPDBG_HELP(exec) /* {{{ */ { - printf("doing exec help: %s\n", expr); - + printf("Will attempt execution, if compilation has not yet taken place, it occurs now.\n"); + printf("The execution context must be set before execution can take place\n"); + return SUCCESS; +} /* }}} */ + +PHPDBG_HELP(compile) /* {{{ */ +{ + printf("Pre-compilation of the execution context provides the opportunity to inspect the opcodes before they are executed\n"); + printf("The execution context must be set for compilation to succeed\n"); + printf("If errors occur during compilation they must be resolved before execution can take place.\n"); + printf("You do not need to exit phpdbg to retry compilation\n"); return SUCCESS; } /* }}} */ PHPDBG_HELP(print) /* {{{ */ { - printf("doing print help: %s\n", expr); + printf("By default, print will show information about the current execution environment\n"); + printf("To show specific information pass an expression to print, for example:\n"); + printf("\tprint opcodes[0]\n"); + printf("Will show the opline @ 0\n"); + printf("Available print commands:\n"); + printf("\tNone\n"); return SUCCESS; } /* }}} */ PHPDBG_HELP(brake) /* {{{ */ { - printf("doing brake help: %s\n", expr); - - return SUCCESS; + printf("doing brake help: %s\n", expr); + + return SUCCESS; } /* }}} */ diff --git a/phpdbg_help.h b/phpdbg_help.h index b3dfb228fdf..87462ca1354 100644 --- a/phpdbg_help.h +++ b/phpdbg_help.h @@ -32,6 +32,7 @@ * Helper Forward Declarations */ PHPDBG_HELP(exec); +PHPDBG_HELP(compile); PHPDBG_HELP(print); PHPDBG_HELP(brake); @@ -39,9 +40,10 @@ PHPDBG_HELP(brake); * Commands */ static const phpdbg_command_t phpdbg_help_commands[] = { - PHPDBG_HELP_D(exec, "the execution context should be a valid phpdbg path"), - PHPDBG_HELP_D(print, "printing allows inspection of the execution environment"), - PHPDBG_HELP_D(brake, "brake points allow execution interruption"), + PHPDBG_HELP_D(exec, "the execution context should be a valid phpdbg path"), + PHPDBG_HELP_D(compile, "pre-compilation allows inspection of code before execution"), + PHPDBG_HELP_D(print, "printing allows inspection of the execution environment"), + PHPDBG_HELP_D(brake, "brake points allow execution interruption"), {NULL, 0, 0} }; diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 6fc59a05067..809273886b6 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -32,6 +32,15 @@ static PHPDBG_COMMAND(exec) { /* {{{ */ printf( "Unsetting old execution context: %s\n", PHPDBG_G(exec)); efree(PHPDBG_G(exec)); + PHPDBG_G(exec) = NULL; + } + + if (PHPDBG_G(ops)) { + printf( + "Destroying compiled opcodes\n"); + destroy_op_array(PHPDBG_G(ops) TSRMLS_CC); + efree(PHPDBG_G(ops)); + PHPDBG_G(ops) = NULL; } PHPDBG_G(exec) = estrndup( @@ -39,11 +48,51 @@ static PHPDBG_COMMAND(exec) { /* {{{ */ printf( "Set execution context: %s\n", PHPDBG_G(exec)); + + return SUCCESS; +} /* }}} */ + +static PHPDBG_COMMAND(compile) { /* {{{ */ + zend_file_handle fh; + + if (PHPDBG_G(exec)) { + + if (PHPDBG_G(ops)) { + printf("Destroying compiled opcodes\n"); + destroy_op_array(PHPDBG_G(ops) TSRMLS_CC); + efree(PHPDBG_G(ops)); + } + + printf("Attempting compilation of %s\n", PHPDBG_G(exec)); + if (php_stream_open_for_zend_ex(PHPDBG_G(exec), &fh, USE_PATH|STREAM_OPEN_FOR_INCLUDE TSRMLS_CC) == SUCCESS) { + PHPDBG_G(ops) = zend_compile_file( + &fh, ZEND_INCLUDE TSRMLS_CC); + zend_destroy_file_handle(&fh TSRMLS_CC); + printf("Success\n"); + return SUCCESS; + } else { + printf("Could not open file %s\n", PHPDBG_G(exec)); + return FAILURE; + } + } else { + printf("No execution context\n"); + return FAILURE; + } } /* }}} */ static PHPDBG_COMMAND(print) { /* {{{ */ - printf( - "%s\n", expr); + if (!expr_len) { + printf("Showing Execution Context Information:\n"); + printf("Exec\t\t%s\n", PHPDBG_G(exec) ? PHPDBG_G(exec) : "none"); + printf("Compiled\t%s\n", PHPDBG_G(ops) ? "yes" : "no"); + if (PHPDBG_G(ops)) { + printf("Opcodes\t\t%d\n", PHPDBG_G(ops)->last-1); + printf("Variables\t%d\n", PHPDBG_G(ops)->last_var-1); + } + } else { + printf( + "%s\n", expr); + } return SUCCESS; } /* }}} */ @@ -93,11 +142,12 @@ static PHPDBG_COMMAND(help) /* {{{ */ } /* }}} */ static const phpdbg_command_t phpdbg_prompt_commands[] = { - PHPDBG_COMMAND_D(exec, "set execution context"), - PHPDBG_COMMAND_D(print, "print something"), - PHPDBG_COMMAND_D(brake, "set brake point"), - PHPDBG_COMMAND_D(help, "show help menu"), - PHPDBG_COMMAND_D(quit, "exit phpdbg"), + PHPDBG_COMMAND_D(exec, "set execution context"), + PHPDBG_COMMAND_D(compile, "attempt to pre-compile execution context"), + PHPDBG_COMMAND_D(print, "print something"), + PHPDBG_COMMAND_D(brake, "set brake point"), + PHPDBG_COMMAND_D(help, "show help menu"), + PHPDBG_COMMAND_D(quit, "exit phpdbg"), {NULL, 0, 0} }; From 9dd3e54351ad3e72c3f55811a3820845aa7ad413 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 10 Nov 2013 09:36:57 -0200 Subject: [PATCH 017/771] - Cosmetic changes --- phpdbg_prompt.c | 18 +++++++++--------- phpdbg_prompt.h | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 6fc59a05067..9d30193cd21 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -33,10 +33,10 @@ static PHPDBG_COMMAND(exec) { /* {{{ */ "Unsetting old execution context: %s\n", PHPDBG_G(exec)); efree(PHPDBG_G(exec)); } - + PHPDBG_G(exec) = estrndup( expr, PHPDBG_G(exec_len)=expr_len); - + printf( "Set execution context: %s\n", PHPDBG_G(exec)); } /* }}} */ @@ -55,7 +55,7 @@ static PHPDBG_COMMAND(brake) { /* {{{ */ static PHPDBG_COMMAND(quit) /* {{{ */ { zend_bailout(); - + return SUCCESS; } /* }}} */ @@ -88,13 +88,13 @@ static PHPDBG_COMMAND(help) /* {{{ */ } } printf("Please report bugs to \n"); - + return SUCCESS; } /* }}} */ static const phpdbg_command_t phpdbg_prompt_commands[] = { - PHPDBG_COMMAND_D(exec, "set execution context"), - PHPDBG_COMMAND_D(print, "print something"), + PHPDBG_COMMAND_D(exec, "set execution context"), + PHPDBG_COMMAND_D(print, "print something"), PHPDBG_COMMAND_D(brake, "set brake point"), PHPDBG_COMMAND_D(help, "show help menu"), PHPDBG_COMMAND_D(quit, "exit phpdbg"), @@ -106,7 +106,7 @@ int phpdbg_do_cmd(const phpdbg_command_t *command, char *cmd_line, size_t cmd_le char *params = NULL; const char *cmd = strtok_r(cmd_line, " ", ¶ms); size_t expr_len = cmd != NULL ? strlen(cmd) : 0; - + while (command && command->name) { if (command->name_len == expr_len && memcmp(cmd, command->name, expr_len) == 0) { @@ -130,13 +130,13 @@ void phpdbg_interactive(int argc, char **argv TSRMLS_DC) /* {{{ */ while (cmd[cmd_len] == '\n') { cmd[cmd_len] = 0; } - + if (cmd_len) { if (phpdbg_do_cmd(phpdbg_prompt_commands, cmd, cmd_len TSRMLS_CC) == FAILURE) { printf("error executing %s !\n", cmd); } } - + printf("phpdbg> "); } } /* }}} */ diff --git a/phpdbg_prompt.h b/phpdbg_prompt.h index b1238ece640..590358bf440 100644 --- a/phpdbg_prompt.h +++ b/phpdbg_prompt.h @@ -56,6 +56,6 @@ int phpdbg_do_cmd(const phpdbg_command_t *command, char *cmd_line, size_t cmd_le #define PHPDBG_COMMAND(name) \ int phpdbg_do_##name(const char *expr, size_t expr_len TSRMLS_DC) -void phpdbg_interactive(int argc, char** argv TSRMLS_DC); +void phpdbg_interactive(int argc, char **argv TSRMLS_DC); #endif /* PHPDBG_PROMPT_H */ From c6cb411d3905a790f9eb059c0ff0dd39fba4017a Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 13:01:46 +0000 Subject: [PATCH 018/771] execution --- phpdbg.c | 31 +++++++++------ phpdbg.h | 1 + phpdbg_prompt.c | 100 +++++++++++++++++++++++++++++++++++++++++------- phpdbg_prompt.h | 1 + test.php | 3 ++ 5 files changed, 111 insertions(+), 25 deletions(-) create mode 100644 test.php diff --git a/phpdbg.c b/phpdbg.c index b416a54fa64..3b1a93b172f 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -20,15 +20,21 @@ ZEND_DECLARE_MODULE_GLOBALS(phpdbg); +void (*zend_execute_old)(zend_execute_data *execute_data TSRMLS_DC); +void (*zend_execute_internal_old)(zend_execute_data *execute_data_ptr, zend_fcall_info *fci, int return_value_used TSRMLS_DC); + static inline void php_phpdbg_globals_ctor(zend_phpdbg_globals *pg) { - pg->exec = NULL; - pg->ops = NULL; + pg->exec = NULL; + pg->ops = NULL; } static PHP_MINIT_FUNCTION(phpdbg) { - ZEND_INIT_MODULE_GLOBALS(phpdbg, php_phpdbg_globals_ctor, NULL); + ZEND_INIT_MODULE_GLOBALS(phpdbg, php_phpdbg_globals_ctor, NULL); + + zend_execute_old = zend_execute_ex; + zend_execute_ex = phpdbg_execute_ex; - return SUCCESS; + return SUCCESS; } static inline void php_phpdbg_destroy_break(void *brake) { @@ -42,16 +48,17 @@ static PHP_RINIT_FUNCTION(phpdbg) { } static PHP_RSHUTDOWN_FUNCTION(phpdbg) { - zend_hash_destroy(&PHPDBG_G(breaks)); + zend_hash_destroy(&PHPDBG_G(breaks)); - if (PHPDBG_G(exec)) { - efree(PHPDBG_G(exec)); - } + if (PHPDBG_G(exec)) { + efree(PHPDBG_G(exec)); + } - if (PHPDBG_G(ops)) { - destroy_op_array(PHPDBG_G(ops) TSRMLS_CC); - efree(PHPDBG_G(ops)); - } + if (PHPDBG_G(ops)) { + destroy_op_array(PHPDBG_G(ops) TSRMLS_CC); + efree(PHPDBG_G(ops)); + } + return SUCCESS; } static zend_module_entry sapi_phpdbg_module_entry = { diff --git a/phpdbg.h b/phpdbg.h index ba3ea5d5338..a3da778520d 100644 --- a/phpdbg.h +++ b/phpdbg.h @@ -41,6 +41,7 @@ ZEND_BEGIN_MODULE_GLOBALS(phpdbg) char *exec; /* file to execute */ size_t exec_len; /* size of exec */ zend_op_array *ops; /* op_array */ + zval *retval; /* return value */ ZEND_END_MODULE_GLOBALS(phpdbg) #include "phpdbg_prompt.h" diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index a1f9685066b..31722665b3e 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -20,6 +20,7 @@ #include #include #include "zend.h" +#include "zend_compile.h" #include "phpdbg.h" #include "phpdbg_help.h" @@ -52,9 +53,23 @@ static PHPDBG_COMMAND(exec) { /* {{{ */ return SUCCESS; } /* }}} */ -static PHPDBG_COMMAND(compile) { /* {{{ */ - zend_file_handle fh; +static inline int phpdbg_compile(TSRMLS_D) { + zend_file_handle fh; + printf("Attempting compilation of %s\n", PHPDBG_G(exec)); + if (php_stream_open_for_zend_ex(PHPDBG_G(exec), &fh, USE_PATH|STREAM_OPEN_FOR_INCLUDE TSRMLS_CC) == SUCCESS) { + PHPDBG_G(ops) = zend_compile_file( + &fh, ZEND_INCLUDE TSRMLS_CC); + zend_destroy_file_handle(&fh TSRMLS_CC); + printf("Success\n"); + return SUCCESS; + } else { + printf("Could not open file %s\n", PHPDBG_G(exec)); + return FAILURE; + } +} + +static PHPDBG_COMMAND(compile) { /* {{{ */ if (PHPDBG_G(exec)) { if (PHPDBG_G(ops)) { @@ -63,23 +78,39 @@ static PHPDBG_COMMAND(compile) { /* {{{ */ efree(PHPDBG_G(ops)); } - printf("Attempting compilation of %s\n", PHPDBG_G(exec)); - if (php_stream_open_for_zend_ex(PHPDBG_G(exec), &fh, USE_PATH|STREAM_OPEN_FOR_INCLUDE TSRMLS_CC) == SUCCESS) { - PHPDBG_G(ops) = zend_compile_file( - &fh, ZEND_INCLUDE TSRMLS_CC); - zend_destroy_file_handle(&fh TSRMLS_CC); - printf("Success\n"); - return SUCCESS; - } else { - printf("Could not open file %s\n", PHPDBG_G(exec)); - return FAILURE; - } + return phpdbg_compile(TSRMLS_C); } else { printf("No execution context\n"); return FAILURE; } } /* }}} */ +static PHPDBG_COMMAND(run) { /* {{{ */ + if (PHPDBG_G(ops) || PHPDBG_G(exec)) { + if (!PHPDBG_G(ops)) { + if (phpdbg_compile(TSRMLS_C) == FAILURE) { + printf("Failed to compile %s, cannot run\n", PHPDBG_G(exec)); + return FAILURE; + } + } + + EG(active_op_array) = PHPDBG_G(ops); + EG(return_value_ptr_ptr) = &PHPDBG_G(retval); + + zend_try { + zend_execute(EG(active_op_array) TSRMLS_CC); + } zend_catch { + printf("Caught excetion in VM\n"); + return FAILURE; + } zend_end_try(); + + return SUCCESS; + } else { + printf("Nothing to execute !"); + return FAILURE; + } +} /* }}} */ + static PHPDBG_COMMAND(print) { /* {{{ */ if (!expr_len) { printf("Showing Execution Context Information:\n"); @@ -144,6 +175,7 @@ static PHPDBG_COMMAND(help) /* {{{ */ static const phpdbg_command_t phpdbg_prompt_commands[] = { PHPDBG_COMMAND_D(exec, "set execution context"), PHPDBG_COMMAND_D(compile, "attempt to pre-compile execution context"), + PHPDBG_COMMAND_D(run, "attempt execution"), PHPDBG_COMMAND_D(print, "print something"), PHPDBG_COMMAND_D(break, "set breakpoint"), PHPDBG_COMMAND_D(help, "show help menu"), @@ -190,3 +222,45 @@ void phpdbg_interactive(int argc, char **argv TSRMLS_DC) /* {{{ */ printf("phpdbg> "); } } /* }}} */ + +void phpdbg_execute_ex(zend_execute_data *execute_data TSRMLS_DC) +{ + zend_bool original_in_execution; + + original_in_execution = EG(in_execution); + EG(in_execution) = 1; + + if (0) { +zend_vm_enter: + execute_data = zend_create_execute_data_from_op_array(EG(active_op_array), 1 TSRMLS_CC); + } + + while (1) { + int ret; +#ifdef ZEND_WIN32 + if (EG(timed_out)) { + zend_timeout(0); + } +#endif + + printf("[OPLINE: %p]\n", execute_data->opline); + + if ((ret = execute_data->opline->handler(execute_data TSRMLS_CC)) > 0) { + switch (ret) { + case 1: + EG(in_execution) = original_in_execution; + return; + case 2: + goto zend_vm_enter; + break; + case 3: + execute_data = EG(current_execute_data); + break; + default: + break; + } + } + + } + zend_error_noreturn(E_ERROR, "Arrived at end of main loop which shouldn't happen"); +} diff --git a/phpdbg_prompt.h b/phpdbg_prompt.h index 590358bf440..028f2c080af 100644 --- a/phpdbg_prompt.h +++ b/phpdbg_prompt.h @@ -57,5 +57,6 @@ int phpdbg_do_cmd(const phpdbg_command_t *command, char *cmd_line, size_t cmd_le int phpdbg_do_##name(const char *expr, size_t expr_len TSRMLS_DC) void phpdbg_interactive(int argc, char **argv TSRMLS_DC); +void phpdbg_execute_ex(zend_execute_data *execute_data TSRMLS_DC); #endif /* PHPDBG_PROMPT_H */ diff --git a/test.php b/test.php new file mode 100644 index 00000000000..2f3600c6a0c --- /dev/null +++ b/test.php @@ -0,0 +1,3 @@ + From 8043d1ee5fe07b37a6154362095a206c97aa610f Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 13:06:57 +0000 Subject: [PATCH 019/771] run help --- phpdbg_help.c | 7 +++++++ phpdbg_help.h | 2 ++ 2 files changed, 9 insertions(+) diff --git a/phpdbg_help.c b/phpdbg_help.c index 38ae6c36f39..d5ec6fd40c3 100644 --- a/phpdbg_help.c +++ b/phpdbg_help.c @@ -51,6 +51,13 @@ PHPDBG_HELP(print) /* {{{ */ return SUCCESS; } /* }}} */ +PHPDBG_HELP(run) /* {{{ */ +{ + printf("Run the code inside the debug vm, you should have break points and variables set before running\n"); + printf("The execution context must not be set, but not necessarily compiled before execution occurs\n"); + return SUCCESS; +} /* }}} */ + PHPDBG_HELP(break) /* {{{ */ { printf("doing break help: %s\n", expr); diff --git a/phpdbg_help.h b/phpdbg_help.h index dba58d7dc48..1ab558725ce 100644 --- a/phpdbg_help.h +++ b/phpdbg_help.h @@ -33,6 +33,7 @@ */ PHPDBG_HELP(exec); PHPDBG_HELP(compile); +PHPDBG_HELP(run); PHPDBG_HELP(print); PHPDBG_HELP(break); @@ -42,6 +43,7 @@ PHPDBG_HELP(break); static const phpdbg_command_t phpdbg_help_commands[] = { PHPDBG_HELP_D(exec, "the execution context should be a valid phpdbg path"), PHPDBG_HELP_D(compile, "pre-compilation allows inspection of code before execution"), + PHPDBG_HELP_D(run, "execution inside the phpdbg vm allows detailed inspection and debugging"), PHPDBG_HELP_D(print, "printing allows inspection of the execution environment"), PHPDBG_HELP_D(break, "breakpoints allow execution interruption"), {NULL, 0, 0} From 5c866a9f1357bfab56824935287e51199d9ea3a7 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 14:28:14 +0000 Subject: [PATCH 020/771] stepping --- phpdbg.c | 1 + phpdbg.h | 4 ++++ phpdbg_help.c | 16 +++++++++++++++- phpdbg_help.h | 4 ++++ phpdbg_prompt.c | 47 ++++++++++++++++++++++++++++++++++++++--------- phpdbg_prompt.h | 2 +- 6 files changed, 63 insertions(+), 11 deletions(-) diff --git a/phpdbg.c b/phpdbg.c index 3b1a93b172f..1379b6b7bf2 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -26,6 +26,7 @@ void (*zend_execute_internal_old)(zend_execute_data *execute_data_ptr, zend_fcal static inline void php_phpdbg_globals_ctor(zend_phpdbg_globals *pg) { pg->exec = NULL; pg->ops = NULL; + pg->stepping = 0; } static PHP_MINIT_FUNCTION(phpdbg) { diff --git a/phpdbg.h b/phpdbg.h index a3da778520d..0b1f2daa885 100644 --- a/phpdbg.h +++ b/phpdbg.h @@ -36,12 +36,16 @@ # define PHPDBG_G(v) (phpdbg_globals.v) #endif +#define PHPDBG_NEXT 2 + ZEND_BEGIN_MODULE_GLOBALS(phpdbg) HashTable breaks; char *exec; /* file to execute */ size_t exec_len; /* size of exec */ zend_op_array *ops; /* op_array */ zval *retval; /* return value */ + zend_bool stepping; /* stepping */ + int vmret; /* return from last opcode handler execution */ ZEND_END_MODULE_GLOBALS(phpdbg) #include "phpdbg_prompt.h" diff --git a/phpdbg_help.c b/phpdbg_help.c index d5ec6fd40c3..a72f53fd13c 100644 --- a/phpdbg_help.c +++ b/phpdbg_help.c @@ -30,6 +30,20 @@ PHPDBG_HELP(exec) /* {{{ */ return SUCCESS; } /* }}} */ +PHPDBG_HELP(step) { /* {{{ */ + printf("You can enable and disable stepping at any phpdbg prompt during execution\n"); + printf("For example:\n"); + printf("phpdbg> stepping 1\n"); + printf("Will enable stepping\n"); + printf("While stepping is enabled you are presented with a prompt after the execution of each opcode\n"); + return SUCCESS; +} /* }}} */ + +PHPDBG_HELP(next) { /* {{{ */ + printf("While stepping through execution, use the next command to step back into the vm and execute the next opcode"); + return SUCCESS; +} /* }}} */ + PHPDBG_HELP(compile) /* {{{ */ { printf("Pre-compilation of the execution context provides the opportunity to inspect the opcodes before they are executed\n"); @@ -43,7 +57,7 @@ PHPDBG_HELP(print) /* {{{ */ { printf("By default, print will show information about the current execution environment\n"); printf("To show specific information pass an expression to print, for example:\n"); - printf("\tprint opcodes[0]\n"); + printf("\tphpdbg> print opcodes[0]\n"); printf("Will show the opline @ 0\n"); printf("Available print commands:\n"); printf("\tNone\n"); diff --git a/phpdbg_help.h b/phpdbg_help.h index 1ab558725ce..69b710f782d 100644 --- a/phpdbg_help.h +++ b/phpdbg_help.h @@ -33,6 +33,8 @@ */ PHPDBG_HELP(exec); PHPDBG_HELP(compile); +PHPDBG_HELP(step); +PHPDBG_HELP(next); PHPDBG_HELP(run); PHPDBG_HELP(print); PHPDBG_HELP(break); @@ -43,6 +45,8 @@ PHPDBG_HELP(break); static const phpdbg_command_t phpdbg_help_commands[] = { PHPDBG_HELP_D(exec, "the execution context should be a valid phpdbg path"), PHPDBG_HELP_D(compile, "pre-compilation allows inspection of code before execution"), + PHPDBG_HELP_D(step, "stepping through execution allows inspection of the opline after every opcode"), + PHPDBG_HELP_D(next, "execute the next opcode"), PHPDBG_HELP_D(run, "execution inside the phpdbg vm allows detailed inspection and debugging"), PHPDBG_HELP_D(print, "printing allows inspection of the execution environment"), PHPDBG_HELP_D(break, "breakpoints allow execution interruption"), diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 31722665b3e..0dfe14b1bef 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -85,6 +85,15 @@ static PHPDBG_COMMAND(compile) { /* {{{ */ } } /* }}} */ +static PHPDBG_COMMAND(step) { /* {{{ */ + PHPDBG_G(stepping) = atoi(expr); + return SUCCESS; +} /* }}} */ + +static PHPDBG_COMMAND(next) { /* {{{ */ + return PHPDBG_NEXT; +} /* }}} */ + static PHPDBG_COMMAND(run) { /* {{{ */ if (PHPDBG_G(ops) || PHPDBG_G(exec)) { if (!PHPDBG_G(ops)) { @@ -116,9 +125,12 @@ static PHPDBG_COMMAND(print) { /* {{{ */ printf("Showing Execution Context Information:\n"); printf("Exec\t\t%s\n", PHPDBG_G(exec) ? PHPDBG_G(exec) : "none"); printf("Compiled\t%s\n", PHPDBG_G(ops) ? "yes" : "no"); + printf("Stepping\t%s\n", PHPDBG_G(stepping) ? "on" : "off"); if (PHPDBG_G(ops)) { - printf("Opcodes\t\t%d\n", PHPDBG_G(ops)->last-1); - printf("Variables\t%d\n", PHPDBG_G(ops)->last_var-1); + printf("Opcodes\t\t%d\n", PHPDBG_G(ops)->last); + if (PHPDBG_G(ops)->last_var) { + printf("Variables\t%d\n", PHPDBG_G(ops)->last_var-1); + } else printf("Variables\tNone\n"); } } else { printf( @@ -175,6 +187,8 @@ static PHPDBG_COMMAND(help) /* {{{ */ static const phpdbg_command_t phpdbg_prompt_commands[] = { PHPDBG_COMMAND_D(exec, "set execution context"), PHPDBG_COMMAND_D(compile, "attempt to pre-compile execution context"), + PHPDBG_COMMAND_D(step, "step through execution"), + PHPDBG_COMMAND_D(next, "next opcode"), PHPDBG_COMMAND_D(run, "attempt execution"), PHPDBG_COMMAND_D(print, "print something"), PHPDBG_COMMAND_D(break, "set breakpoint"), @@ -200,7 +214,7 @@ int phpdbg_do_cmd(const phpdbg_command_t *command, char *cmd_line, size_t cmd_le return FAILURE; } /* }}} */ -void phpdbg_interactive(int argc, char **argv TSRMLS_DC) /* {{{ */ +int phpdbg_interactive(int argc, char **argv TSRMLS_DC) /* {{{ */ { char cmd[PHPDBG_MAX_CMD]; @@ -214,13 +228,20 @@ void phpdbg_interactive(int argc, char **argv TSRMLS_DC) /* {{{ */ } if (cmd_len) { - if (phpdbg_do_cmd(phpdbg_prompt_commands, cmd, cmd_len TSRMLS_CC) == FAILURE) { - printf("error executing %s !\n", cmd); - } + switch (phpdbg_do_cmd(phpdbg_prompt_commands, cmd, cmd_len TSRMLS_CC)) { + case FAILURE: + printf("error executing %s !\n", cmd); + break; + + case PHPDBG_NEXT: + return PHPDBG_NEXT; + } } printf("phpdbg> "); } + + return SUCCESS; } /* }}} */ void phpdbg_execute_ex(zend_execute_data *execute_data TSRMLS_DC) @@ -236,7 +257,6 @@ zend_vm_enter: } while (1) { - int ret; #ifdef ZEND_WIN32 if (EG(timed_out)) { zend_timeout(0); @@ -245,8 +265,17 @@ zend_vm_enter: printf("[OPLINE: %p]\n", execute_data->opline); - if ((ret = execute_data->opline->handler(execute_data TSRMLS_CC)) > 0) { - switch (ret) { + PHPDBG_G(vmret) = execute_data->opline->handler(execute_data TSRMLS_CC); + + if (PHPDBG_G(stepping)) { + while (phpdbg_interactive( + 0, NULL TSRMLS_CC) != PHPDBG_NEXT) { + continue; + } + } + + if (PHPDBG_G(vmret) > 0) { + switch (PHPDBG_G(vmret)) { case 1: EG(in_execution) = original_in_execution; return; diff --git a/phpdbg_prompt.h b/phpdbg_prompt.h index 028f2c080af..b6921d671e4 100644 --- a/phpdbg_prompt.h +++ b/phpdbg_prompt.h @@ -56,7 +56,7 @@ int phpdbg_do_cmd(const phpdbg_command_t *command, char *cmd_line, size_t cmd_le #define PHPDBG_COMMAND(name) \ int phpdbg_do_##name(const char *expr, size_t expr_len TSRMLS_DC) -void phpdbg_interactive(int argc, char **argv TSRMLS_DC); +int phpdbg_interactive(int argc, char **argv TSRMLS_DC); void phpdbg_execute_ex(zend_execute_data *execute_data TSRMLS_DC); #endif /* PHPDBG_PROMPT_H */ From d7720099213aed7e75dd7c8d8c49c815e5bf5d5f Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 10 Nov 2013 12:36:30 -0200 Subject: [PATCH 021/771] - Breakpoint initial work --- phpdbg.c | 20 +++++++++++--------- phpdbg.h | 12 +++++++----- phpdbg_prompt.c | 40 ++++++++++++++++++++++++++++++++++------ phpdbg_prompt.h | 16 ++++++++++++++++ 4 files changed, 68 insertions(+), 20 deletions(-) diff --git a/phpdbg.c b/phpdbg.c index 3b1a93b172f..b484c83d4ec 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -30,30 +30,32 @@ static inline void php_phpdbg_globals_ctor(zend_phpdbg_globals *pg) { static PHP_MINIT_FUNCTION(phpdbg) { ZEND_INIT_MODULE_GLOBALS(phpdbg, php_phpdbg_globals_ctor, NULL); - + zend_execute_old = zend_execute_ex; zend_execute_ex = phpdbg_execute_ex; - + return SUCCESS; } static inline void php_phpdbg_destroy_break(void *brake) { - + } static PHP_RINIT_FUNCTION(phpdbg) { - zend_hash_init(&PHPDBG_G(breaks), 8, NULL, php_phpdbg_destroy_break, 0); - - return SUCCESS; + zend_hash_init(&PHPDBG_G(break_files), 8, NULL, php_phpdbg_destroy_break, 0); + zend_hash_init(&PHPDBG_G(break_symbols), 8, NULL, php_phpdbg_destroy_break, 0); + + return SUCCESS; } static PHP_RSHUTDOWN_FUNCTION(phpdbg) { - zend_hash_destroy(&PHPDBG_G(breaks)); - + zend_hash_destroy(&PHPDBG_G(break_files)); + zend_hash_destroy(&PHPDBG_G(break_symbols)); + if (PHPDBG_G(exec)) { efree(PHPDBG_G(exec)); } - + if (PHPDBG_G(ops)) { destroy_op_array(PHPDBG_G(ops) TSRMLS_CC); efree(PHPDBG_G(ops)); diff --git a/phpdbg.h b/phpdbg.h index a3da778520d..8dbf89fe629 100644 --- a/phpdbg.h +++ b/phpdbg.h @@ -37,11 +37,13 @@ #endif ZEND_BEGIN_MODULE_GLOBALS(phpdbg) - HashTable breaks; - char *exec; /* file to execute */ - size_t exec_len; /* size of exec */ - zend_op_array *ops; /* op_array */ - zval *retval; /* return value */ + HashTable break_files; + HashTable break_symbols; + char *exec; /* file to execute */ + size_t exec_len; /* size of exec */ + zend_op_array *ops; /* op_array */ + zval *retval; /* return value */ + zend_bool has_breakpoint; /* breakpoint has been set */ ZEND_END_MODULE_GLOBALS(phpdbg) #include "phpdbg_prompt.h" diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 31722665b3e..1af00badcf4 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -93,17 +93,17 @@ static PHPDBG_COMMAND(run) { /* {{{ */ return FAILURE; } } - + EG(active_op_array) = PHPDBG_G(ops); EG(return_value_ptr_ptr) = &PHPDBG_G(retval); - + zend_try { zend_execute(EG(active_op_array) TSRMLS_CC); } zend_catch { printf("Caught excetion in VM\n"); return FAILURE; } zend_end_try(); - + return SUCCESS; } else { printf("Nothing to execute !"); @@ -128,8 +128,27 @@ static PHPDBG_COMMAND(print) { /* {{{ */ return SUCCESS; } /* }}} */ -static PHPDBG_COMMAND(break) { /* {{{ */ - return SUCCESS; +static PHPDBG_COMMAND(break) /* {{{ */ +{ + const char *line_pos = zend_memrchr(expr, ':', expr_len); + + if (line_pos) { + long line_num = strtol(line_pos+1, NULL, 0); + phpdbg_breakfile_t new_break; + zend_llist break_files; + + new_break.filename = estrndup(expr, line_pos - expr); + new_break.line = line_num; + + PHPDBG_G(has_breakpoint) = 1; + + if (zend_hash_find(&PHPDBG_G(break_files), new_break.filename, line_pos - expr, &break_files) == FAILURE) { + zend_llist_init(&break_files, sizeof(phpdbg_breakfile_t), NULL, 0); + } + zend_llist_add_element(&break_files, &new_break); + } + + return SUCCESS; } /* }}} */ static PHPDBG_COMMAND(quit) /* {{{ */ @@ -200,6 +219,11 @@ int phpdbg_do_cmd(const phpdbg_command_t *command, char *cmd_line, size_t cmd_le return FAILURE; } /* }}} */ +void phpdbg_breakpoint(zend_op_array *op_array) /* {{{ */ +{ + printf(">> %s\n", op_array->filename); +} /* }}} */ + void phpdbg_interactive(int argc, char **argv TSRMLS_DC) /* {{{ */ { char cmd[PHPDBG_MAX_CMD]; @@ -244,7 +268,11 @@ zend_vm_enter: #endif printf("[OPLINE: %p]\n", execute_data->opline); - + + if (PHPDBG_G(has_breakpoint)) { + phpdbg_breakpoint(execute_data->op_array); + } + if ((ret = execute_data->opline->handler(execute_data TSRMLS_CC)) > 0) { switch (ret) { case 1: diff --git a/phpdbg_prompt.h b/phpdbg_prompt.h index 028f2c080af..01d3f26c0b2 100644 --- a/phpdbg_prompt.h +++ b/phpdbg_prompt.h @@ -43,6 +43,22 @@ typedef struct _phpdbg_command_t { phpdbg_command_handler_t handler; /* Command handler */ } phpdbg_command_t; + +/** + * Breakpoint file-based representation + */ +typedef struct _phpdbg_breakfile_t { + const char *filename; + long line; +} phpdbg_breakfile_t; + +/** + * Breakpoint symbol-based representation + */ +typedef struct _phpdbg_breaksymbol_t { + const char *symbol; +} phpdbg_breaksymbol_t; + /** * Command Executor */ From 2977840a4a1325ba5d94f20ac8adc1ffecd3a54c Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 14:43:46 +0000 Subject: [PATCH 022/771] eval() --- phpdbg.c | 1 + phpdbg_help.c | 6 ++++++ phpdbg_help.h | 2 ++ phpdbg_prompt.c | 23 ++++++++++++++++++++++- test.php | 3 +++ 5 files changed, 34 insertions(+), 1 deletion(-) diff --git a/phpdbg.c b/phpdbg.c index 1379b6b7bf2..282588967fc 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -27,6 +27,7 @@ static inline void php_phpdbg_globals_ctor(zend_phpdbg_globals *pg) { pg->exec = NULL; pg->ops = NULL; pg->stepping = 0; + pg->vmret = 0; } static PHP_MINIT_FUNCTION(phpdbg) { diff --git a/phpdbg_help.c b/phpdbg_help.c index a72f53fd13c..b3971988417 100644 --- a/phpdbg_help.c +++ b/phpdbg_help.c @@ -72,6 +72,12 @@ PHPDBG_HELP(run) /* {{{ */ return SUCCESS; } /* }}} */ +PHPDBG_HELP(eval) /* {{{ */ +{ + printf("Access to eval() allows you to change the environment during execution, careful though !!"); + return SUCCESS; +} /* }}} */ + PHPDBG_HELP(break) /* {{{ */ { printf("doing break help: %s\n", expr); diff --git a/phpdbg_help.h b/phpdbg_help.h index 69b710f782d..7359812b700 100644 --- a/phpdbg_help.h +++ b/phpdbg_help.h @@ -36,6 +36,7 @@ PHPDBG_HELP(compile); PHPDBG_HELP(step); PHPDBG_HELP(next); PHPDBG_HELP(run); +PHPDBG_HELP(eval); PHPDBG_HELP(print); PHPDBG_HELP(break); @@ -48,6 +49,7 @@ static const phpdbg_command_t phpdbg_help_commands[] = { PHPDBG_HELP_D(step, "stepping through execution allows inspection of the opline after every opcode"), PHPDBG_HELP_D(next, "execute the next opcode"), PHPDBG_HELP_D(run, "execution inside the phpdbg vm allows detailed inspection and debugging"), + PHPDBG_HELP_D(eval, "access to eval() allows you to affect the environment during execution"), PHPDBG_HELP_D(print, "printing allows inspection of the execution environment"), PHPDBG_HELP_D(break, "breakpoints allow execution interruption"), {NULL, 0, 0} diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 0dfe14b1bef..326aa442a0f 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -115,11 +115,27 @@ static PHPDBG_COMMAND(run) { /* {{{ */ return SUCCESS; } else { - printf("Nothing to execute !"); + printf("Nothing to execute !\n"); return FAILURE; } } /* }}} */ +static PHPDBG_COMMAND(eval) { /* {{{ */ + zval retval; + + if (expr) { + if (zend_eval_stringl((char*)expr, expr_len-1, &retval, "eval()'d code" TSRMLS_CC) == SUCCESS) { + printf("Success\n"); + zval_dtor(&retval); + } + } else { + printf("No expression provided !\n"); + return FAILURE; + } + + return SUCCESS; +} /* }}} */ + static PHPDBG_COMMAND(print) { /* {{{ */ if (!expr_len) { printf("Showing Execution Context Information:\n"); @@ -132,6 +148,10 @@ static PHPDBG_COMMAND(print) { /* {{{ */ printf("Variables\t%d\n", PHPDBG_G(ops)->last_var-1); } else printf("Variables\tNone\n"); } + printf("Executing\t:%s\n", EG(in_execution) ? "yes" : "no"); + if (EG(in_execution)) { + printf("VM Return\t%d\n", PHPDBG_G(vmret)); + } } else { printf( "%s\n", expr); @@ -190,6 +210,7 @@ static const phpdbg_command_t phpdbg_prompt_commands[] = { PHPDBG_COMMAND_D(step, "step through execution"), PHPDBG_COMMAND_D(next, "next opcode"), PHPDBG_COMMAND_D(run, "attempt execution"), + PHPDBG_COMMAND_D(eval, "evaluate some code"), PHPDBG_COMMAND_D(print, "print something"), PHPDBG_COMMAND_D(break, "set breakpoint"), PHPDBG_COMMAND_D(help, "show help menu"), diff --git a/test.php b/test.php index 2f3600c6a0c..cbb2641e4fa 100644 --- a/test.php +++ b/test.php @@ -1,3 +1,6 @@ From ac5063468ae3fac6616ff929454641da050a9ec7 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 14:49:52 +0000 Subject: [PATCH 023/771] ... --- phpdbg_prompt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 326aa442a0f..f61f8d408f9 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -148,7 +148,7 @@ static PHPDBG_COMMAND(print) { /* {{{ */ printf("Variables\t%d\n", PHPDBG_G(ops)->last_var-1); } else printf("Variables\tNone\n"); } - printf("Executing\t:%s\n", EG(in_execution) ? "yes" : "no"); + printf("Executing\t%s\n", EG(in_execution) ? "yes" : "no"); if (EG(in_execution)) { printf("VM Return\t%d\n", PHPDBG_G(vmret)); } From 2f9b34d4b639b79a82d75f4ed509bfbc0e72e9de Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 15:16:45 +0000 Subject: [PATCH 024/771] backtrace --- phpdbg_prompt.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index f61f8d408f9..3be2753ce9c 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -136,6 +136,21 @@ static PHPDBG_COMMAND(eval) { /* {{{ */ return SUCCESS; } /* }}} */ +static PHPDBG_COMMAND(back) { /* {{{ */ + if (EG(in_execution)) { + const zend_execute_data *current = EG(current_execute_data); + if (current) { + do { + printf("%d\n", current->opline->opcode); + } while ((current = current->prev_execute_data)); + } + return SUCCESS; + } else { + printf("Not executing !\n"); + return FAILURE; + } +} /* }}} */ + static PHPDBG_COMMAND(print) { /* {{{ */ if (!expr_len) { printf("Showing Execution Context Information:\n"); @@ -213,6 +228,7 @@ static const phpdbg_command_t phpdbg_prompt_commands[] = { PHPDBG_COMMAND_D(eval, "evaluate some code"), PHPDBG_COMMAND_D(print, "print something"), PHPDBG_COMMAND_D(break, "set breakpoint"), + PHPDBG_COMMAND_D(back, "show backtrace"), PHPDBG_COMMAND_D(help, "show help menu"), PHPDBG_COMMAND_D(quit, "exit phpdbg"), {NULL, 0, 0} @@ -267,9 +283,8 @@ int phpdbg_interactive(int argc, char **argv TSRMLS_DC) /* {{{ */ void phpdbg_execute_ex(zend_execute_data *execute_data TSRMLS_DC) { - zend_bool original_in_execution; + zend_bool original_in_execution = EG(in_execution); - original_in_execution = EG(in_execution); EG(in_execution) = 1; if (0) { From 9552817864350cad7e25926e6e66aaee9684364e Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 10 Nov 2013 13:21:20 -0200 Subject: [PATCH 025/771] - Get the realpath on break command --- phpdbg_prompt.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 05cf32242a5..d99dbd34662 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -122,7 +122,7 @@ static PHPDBG_COMMAND(run) { /* {{{ */ static PHPDBG_COMMAND(eval) { /* {{{ */ zval retval; - + if (expr) { if (zend_eval_stringl((char*)expr, expr_len-1, &retval, "eval()'d code" TSRMLS_CC) == SUCCESS) { printf("Success\n"); @@ -132,7 +132,7 @@ static PHPDBG_COMMAND(eval) { /* {{{ */ printf("No expression provided !\n"); return FAILURE; } - + return SUCCESS; } /* }}} */ @@ -165,13 +165,21 @@ static PHPDBG_COMMAND(break) /* {{{ */ const char *line_pos = zend_memrchr(expr, ':', expr_len); if (line_pos) { + char resolved_name[MAXPATHLEN]; long line_num = strtol(line_pos+1, NULL, 0); phpdbg_breakfile_t new_break; zend_llist *break_files_ptr; + size_t name_len; + char *path = estrndup(expr, line_pos - expr); - size_t name_len = line_pos - expr; + if (expand_filepath(path, resolved_name TSRMLS_CC) == NULL) { + efree(path); + return FAILURE; + } + efree(path); - new_break.filename = estrndup(expr, name_len); + name_len = strlen(resolved_name); + new_break.filename = estrndup(resolved_name, name_len + 1); new_break.line = line_num; PHPDBG_G(has_file_bp) = 1; @@ -182,7 +190,8 @@ static PHPDBG_COMMAND(break) /* {{{ */ zend_llist_init(&break_files, sizeof(phpdbg_breakfile_t), NULL, 0); zend_hash_update(&PHPDBG_G(break_files), - new_break.filename, name_len, &break_files, sizeof(zend_llist), (void**)&break_files_ptr); + new_break.filename, name_len, &break_files, sizeof(zend_llist), + (void**)&break_files_ptr); } zend_llist_add_element(break_files_ptr, &new_break); } From 48f9db90dd9b6ac98a419a06645c79ec6a82d8ad Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 15:32:24 +0000 Subject: [PATCH 026/771] cont --- phpdbg_help.c | 30 +++++++++++++++++++++--------- phpdbg_help.h | 2 ++ phpdbg_prompt.c | 5 +++++ 3 files changed, 28 insertions(+), 9 deletions(-) diff --git a/phpdbg_help.c b/phpdbg_help.c index b3971988417..4edc20bb55d 100644 --- a/phpdbg_help.c +++ b/phpdbg_help.c @@ -55,14 +55,14 @@ PHPDBG_HELP(compile) /* {{{ */ PHPDBG_HELP(print) /* {{{ */ { - printf("By default, print will show information about the current execution environment\n"); - printf("To show specific information pass an expression to print, for example:\n"); - printf("\tphpdbg> print opcodes[0]\n"); - printf("Will show the opline @ 0\n"); - printf("Available print commands:\n"); - printf("\tNone\n"); + printf("By default, print will show information about the current execution environment\n"); + printf("To show specific information pass an expression to print, for example:\n"); + printf("\tphpdbg> print opcodes[0]\n"); + printf("Will show the opline @ 0\n"); + printf("Available print commands:\n"); + printf("\tNone\n"); - return SUCCESS; + return SUCCESS; } /* }}} */ PHPDBG_HELP(run) /* {{{ */ @@ -80,7 +80,19 @@ PHPDBG_HELP(eval) /* {{{ */ PHPDBG_HELP(break) /* {{{ */ { - printf("doing break help: %s\n", expr); + printf("Setting a breakpoint stops execution at a specific stage, the syntax is:\n"); + printf("\tfile:line\n"); + printf("[more to come]\n"); + printf("For example:\n"); + printf("\tphpdbg> break test.php:1\n"); + printf("Will break execution on line 1 of test.php\n"); + + return SUCCESS; +} /* }}} */ - return SUCCESS; +PHPDBG_HELP(cont) /* {{{ */ +{ + printf("Continues execution after a breakpoint is met\n"); + printf("[Warnings about using stepping and break points here]\n"); + return SUCCESS; } /* }}} */ diff --git a/phpdbg_help.h b/phpdbg_help.h index 7359812b700..ca510b942a5 100644 --- a/phpdbg_help.h +++ b/phpdbg_help.h @@ -39,6 +39,7 @@ PHPDBG_HELP(run); PHPDBG_HELP(eval); PHPDBG_HELP(print); PHPDBG_HELP(break); +PHPDBG_HELP(cont); /** * Commands @@ -52,6 +53,7 @@ static const phpdbg_command_t phpdbg_help_commands[] = { PHPDBG_HELP_D(eval, "access to eval() allows you to affect the environment during execution"), PHPDBG_HELP_D(print, "printing allows inspection of the execution environment"), PHPDBG_HELP_D(break, "breakpoints allow execution interruption"), + PHPDBG_HELP_D(cont, "use continue when a break point is met"), {NULL, 0, 0} }; diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 54fa53f18fa..50a7fef922b 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -94,6 +94,10 @@ static PHPDBG_COMMAND(next) { /* {{{ */ return PHPDBG_NEXT; } /* }}} */ +static PHPDBG_COMMAND(cont) { /* {{{ */ + return SUCCESS; +} /* }}} */ + static PHPDBG_COMMAND(run) { /* {{{ */ if (PHPDBG_G(ops) || PHPDBG_G(exec)) { if (!PHPDBG_G(ops)) { @@ -263,6 +267,7 @@ static const phpdbg_command_t phpdbg_prompt_commands[] = { PHPDBG_COMMAND_D(eval, "evaluate some code"), PHPDBG_COMMAND_D(print, "print something"), PHPDBG_COMMAND_D(break, "set breakpoint"), + PHPDBG_COMMAND_D(cont, "continue execution"), PHPDBG_COMMAND_D(back, "show backtrace"), PHPDBG_COMMAND_D(help, "show help menu"), PHPDBG_COMMAND_D(quit, "exit phpdbg"), From 6069121e234a7b70c2c8f9154759e1e583735946 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 10 Nov 2013 13:47:28 -0200 Subject: [PATCH 027/771] - Added llist dtor --- phpdbg.c | 27 ++++++++++++++++----------- phpdbg_prompt.c | 11 ++++++++++- 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/phpdbg.c b/phpdbg.c index ea7e3564650..a0419f313ea 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -23,34 +23,39 @@ ZEND_DECLARE_MODULE_GLOBALS(phpdbg); void (*zend_execute_old)(zend_execute_data *execute_data TSRMLS_DC); void (*zend_execute_internal_old)(zend_execute_data *execute_data_ptr, zend_fcall_info *fci, int return_value_used TSRMLS_DC); -static inline void php_phpdbg_globals_ctor(zend_phpdbg_globals *pg) { +static inline void php_phpdbg_globals_ctor(zend_phpdbg_globals *pg) /* {{{ */ +{ pg->exec = NULL; pg->ops = NULL; pg->stepping = 0; pg->vmret = 0; -} +} /* }}} */ -static PHP_MINIT_FUNCTION(phpdbg) { +static PHP_MINIT_FUNCTION(phpdbg) /* {{{ */ +{ ZEND_INIT_MODULE_GLOBALS(phpdbg, php_phpdbg_globals_ctor, NULL); zend_execute_old = zend_execute_ex; zend_execute_ex = phpdbg_execute_ex; return SUCCESS; -} - -static inline void php_phpdbg_destroy_break(void *brake) { +} /* }}} */ -} +static void php_phpdbg_destroy_break(void *brake) /* {{{ */ +{ + zend_llist_destroy((zend_llist*)brake); +} /* }}} */ -static PHP_RINIT_FUNCTION(phpdbg) { +static PHP_RINIT_FUNCTION(phpdbg) /* {{{ */ +{ zend_hash_init(&PHPDBG_G(break_files), 8, NULL, php_phpdbg_destroy_break, 0); zend_hash_init(&PHPDBG_G(break_symbols), 8, NULL, php_phpdbg_destroy_break, 0); return SUCCESS; -} +} /* }}} */ -static PHP_RSHUTDOWN_FUNCTION(phpdbg) { +static PHP_RSHUTDOWN_FUNCTION(phpdbg) /* {{{ */ +{ zend_hash_destroy(&PHPDBG_G(break_files)); zend_hash_destroy(&PHPDBG_G(break_symbols)); @@ -63,7 +68,7 @@ static PHP_RSHUTDOWN_FUNCTION(phpdbg) { efree(PHPDBG_G(ops)); } return SUCCESS; -} +} /* }}} */ static zend_module_entry sapi_phpdbg_module_entry = { STANDARD_MODULE_HEADER, diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index d99dbd34662..12c3cc51205 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -28,6 +28,13 @@ static const phpdbg_command_t phpdbg_prompt_commands[]; ZEND_EXTERN_MODULE_GLOBALS(phpdbg); +static void phpdbg_llist_breakfile_dtor(void *data) +{ + phpdbg_breakfile_t *bp = (phpdbg_breakfile_t*) data; + + efree(bp->filename); +} + static PHPDBG_COMMAND(exec) { /* {{{ */ if (PHPDBG_G(exec)) { printf( @@ -187,7 +194,9 @@ static PHPDBG_COMMAND(break) /* {{{ */ if (zend_hash_find(&PHPDBG_G(break_files), new_break.filename, name_len, (void**)&break_files_ptr) == FAILURE) { zend_llist break_files; - zend_llist_init(&break_files, sizeof(phpdbg_breakfile_t), NULL, 0); + + zend_llist_init(&break_files, sizeof(phpdbg_breakfile_t), + phpdbg_llist_breakfile_dtor, 0); zend_hash_update(&PHPDBG_G(break_files), new_break.filename, name_len, &break_files, sizeof(zend_llist), From 940f4e27de7d1babd48f3adb4ea284e57efde015 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 15:49:35 +0000 Subject: [PATCH 028/771] backtrace --- phpdbg_prompt.c | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 50a7fef922b..387ce74fd57 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -142,12 +142,28 @@ static PHPDBG_COMMAND(eval) { /* {{{ */ static PHPDBG_COMMAND(back) { /* {{{ */ if (EG(in_execution)) { - const zend_execute_data *current = EG(current_execute_data); - if (current) { - do { - printf("%d\n", current->opline->opcode); - } while ((current = current->prev_execute_data)); + zval zbacktrace; + zval **tmp; + HashPosition position; + int i = 0; + int limit = (expr != NULL) ? atoi(expr) : 0; + + zend_fetch_debug_backtrace( + &zbacktrace, 0, 0, limit TSRMLS_CC); + + for (zend_hash_internal_pointer_reset_ex(Z_ARRVAL(zbacktrace), &position); + zend_hash_get_current_data_ex(Z_ARRVAL(zbacktrace), (void**)&tmp, &position) == SUCCESS; + zend_hash_move_forward_ex(Z_ARRVAL(zbacktrace), &position)) { + if (i++) { + printf(",\n"); + } + zend_print_flat_zval_r(*tmp TSRMLS_CC); } + + printf("\n"); + + zval_dtor(&zbacktrace); + return SUCCESS; } else { printf("Not executing !\n"); From 4ef6705a747826052d83d2470e4f85db8a514a2e Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 15:54:19 +0000 Subject: [PATCH 029/771] correction to headers backtrace help --- phpdbg.h | 1 + phpdbg_help.c | 8 ++++++++ phpdbg_help.h | 2 ++ 3 files changed, 11 insertions(+) diff --git a/phpdbg.h b/phpdbg.h index 26fb118f4a4..f34fa4c84e0 100644 --- a/phpdbg.h +++ b/phpdbg.h @@ -22,6 +22,7 @@ #include "zend_ini_scanner.h" #include "zend_globals.h" #include "zend_stream.h" +#include "zend_builtin_functions.h" #include "SAPI.h" #include #include "php_main.h" diff --git a/phpdbg_help.c b/phpdbg_help.c index 4edc20bb55d..b3467a4eaae 100644 --- a/phpdbg_help.c +++ b/phpdbg_help.c @@ -96,3 +96,11 @@ PHPDBG_HELP(cont) /* {{{ */ printf("[Warnings about using stepping and break points here]\n"); return SUCCESS; } /* }}} */ + +PHPDBG_HELP(back) { /* {{{ */ + printf("The backtrace is gathered with the default debug_backtrace functionality.\n"); + printf("You can set the limit on the trace, for example:\n"); + printf("phpdbg> back 5\n"); + printf("Will limit the number of frames to 5, the default is no limit\n"); + return SUCCESS; +} /* }}} */ diff --git a/phpdbg_help.h b/phpdbg_help.h index ca510b942a5..597dfdca866 100644 --- a/phpdbg_help.h +++ b/phpdbg_help.h @@ -40,6 +40,7 @@ PHPDBG_HELP(eval); PHPDBG_HELP(print); PHPDBG_HELP(break); PHPDBG_HELP(cont); +PHPDBG_HELP(back); /** * Commands @@ -54,6 +55,7 @@ static const phpdbg_command_t phpdbg_help_commands[] = { PHPDBG_HELP_D(print, "printing allows inspection of the execution environment"), PHPDBG_HELP_D(break, "breakpoints allow execution interruption"), PHPDBG_HELP_D(cont, "use continue when a break point is met"), + PHPDBG_HELP_D(back, "show debug backtrace information during execution"), {NULL, 0, 0} }; From 72a60589ece2a198c9bc75e24da1335dc917a1fa Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 15:55:53 +0000 Subject: [PATCH 030/771] consistent help --- phpdbg_help.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/phpdbg_help.c b/phpdbg_help.c index b3467a4eaae..916764d5fc6 100644 --- a/phpdbg_help.c +++ b/phpdbg_help.c @@ -33,7 +33,7 @@ PHPDBG_HELP(exec) /* {{{ */ PHPDBG_HELP(step) { /* {{{ */ printf("You can enable and disable stepping at any phpdbg prompt during execution\n"); printf("For example:\n"); - printf("phpdbg> stepping 1\n"); + printf("\tphpdbg> stepping 1\n"); printf("Will enable stepping\n"); printf("While stepping is enabled you are presented with a prompt after the execution of each opcode\n"); return SUCCESS; @@ -100,7 +100,7 @@ PHPDBG_HELP(cont) /* {{{ */ PHPDBG_HELP(back) { /* {{{ */ printf("The backtrace is gathered with the default debug_backtrace functionality.\n"); printf("You can set the limit on the trace, for example:\n"); - printf("phpdbg> back 5\n"); + printf("\tphpdbg> back 5\n"); printf("Will limit the number of frames to 5, the default is no limit\n"); return SUCCESS; } /* }}} */ From 2f4acda67b9fd7659b8424345789f90061c141a8 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 16:05:15 +0000 Subject: [PATCH 031/771] ... --- README.md | 22 ++++++++++++++++++++-- phpdbg.png | Bin 0 -> 116358 bytes 2 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 phpdbg.png diff --git a/README.md b/README.md index 2fc9fdfa7b4..c18ca71ca17 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,20 @@ -phpdbg -====== +phpdbg - The interactive PHP debugger +===================================== + +phpdbg is an interactive debugger for PHP. + +Implemented as a SAPI module, phpdbg can excert complete control over the environment without impacting the functionality or performance of your code. + +Features +======== + + - step through debugging + - setting break points + - showing debug backtraces + - access to eval during execution + - sapi agnositicism, easy integration + +Screeny +======= + +screenshot diff --git a/phpdbg.png b/phpdbg.png new file mode 100644 index 0000000000000000000000000000000000000000..96768f7834ac4a7cde8792a09299e79d44464fce GIT binary patch literal 116358 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 Orl)NLt-5|U>i+=#Sr{n* literal 0 HcmV?d00001 From 9a15ea4d5870603ed456a23e2879051a71f5398f Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 16:06:15 +0000 Subject: [PATCH 032/771] ... --- phpdbg_prompt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 990f9c652d1..4a145ac78a2 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -32,7 +32,7 @@ static void phpdbg_llist_breakfile_dtor(void *data) { phpdbg_breakfile_t *bp = (phpdbg_breakfile_t*) data; - efree(bp->filename); + efree((char*)bp->filename); } static PHPDBG_COMMAND(exec) { /* {{{ */ From 5971ab299be15c57367d3ab642969a07e609483d Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 16:06:57 +0000 Subject: [PATCH 033/771] ... --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c18ca71ca17..42c66cf9842 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ phpdbg - The interactive PHP debugger phpdbg is an interactive debugger for PHP. -Implemented as a SAPI module, phpdbg can excert complete control over the environment without impacting the functionality or performance of your code. +Implemented as a SAPI module, phpdbg can excerpt complete control over the environment without impacting the functionality or performance of your code. Features ======== From c060093acf5f1732938dc06eae0c76d39d375827 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 10 Nov 2013 14:12:43 -0200 Subject: [PATCH 034/771] - WS change --- phpdbg_help.h | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/phpdbg_help.h b/phpdbg_help.h index 597dfdca866..1051d61fc93 100644 --- a/phpdbg_help.h +++ b/phpdbg_help.h @@ -24,9 +24,9 @@ * Command Declarators */ #define PHPDBG_HELP_D(name, tip) \ - {PHPDBG_STRL(#name), tip, sizeof(tip)-1, phpdbg_do_help_##name} + {PHPDBG_STRL(#name), tip, sizeof(tip)-1, phpdbg_do_help_##name} #define PHPDBG_HELP(name) \ - int phpdbg_do_help_##name(const char *expr, size_t expr_len TSRMLS_DC) + int phpdbg_do_help_##name(const char *expr, size_t expr_len TSRMLS_DC) /** * Helper Forward Declarations @@ -46,17 +46,18 @@ PHPDBG_HELP(back); * Commands */ static const phpdbg_command_t phpdbg_help_commands[] = { - PHPDBG_HELP_D(exec, "the execution context should be a valid phpdbg path"), - PHPDBG_HELP_D(compile, "pre-compilation allows inspection of code before execution"), - PHPDBG_HELP_D(step, "stepping through execution allows inspection of the opline after every opcode"), - PHPDBG_HELP_D(next, "execute the next opcode"), - PHPDBG_HELP_D(run, "execution inside the phpdbg vm allows detailed inspection and debugging"), - PHPDBG_HELP_D(eval, "access to eval() allows you to affect the environment during execution"), - PHPDBG_HELP_D(print, "printing allows inspection of the execution environment"), - PHPDBG_HELP_D(break, "breakpoints allow execution interruption"), - PHPDBG_HELP_D(cont, "use continue when a break point is met"), - PHPDBG_HELP_D(back, "show debug backtrace information during execution"), - {NULL, 0, 0} + PHPDBG_HELP_D(exec, "the execution context should be a valid phpdbg path"), + PHPDBG_HELP_D(compile, "pre-compilation allows inspection of code before execution"), + PHPDBG_HELP_D(step, "stepping through execution allows inspection of the opline after every opcode"), + PHPDBG_HELP_D(next, "execute the next opcode"), + PHPDBG_HELP_D(run, "execution inside the phpdbg vm allows detailed inspection and debugging"), + PHPDBG_HELP_D(eval, "access to eval() allows you to affect the environment during execution"), + PHPDBG_HELP_D(print, "printing allows inspection of the execution environment"), + PHPDBG_HELP_D(break, "breakpoints allow execution interruption"), + PHPDBG_HELP_D(cont, "use continue when a break point is met"), + PHPDBG_HELP_D(back, "show debug backtrace information during execution"), + + {NULL, 0, 0} }; #endif /* PHPDBG_HELP_H */ From 8532076c6465e73e7b437f43601c43a70560bf85 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 10 Nov 2013 14:16:52 -0200 Subject: [PATCH 035/771] - WS changes --- phpdbg_help.c | 87 ++++++++++++++++++++++++++------------------------- 1 file changed, 44 insertions(+), 43 deletions(-) diff --git a/phpdbg_help.c b/phpdbg_help.c index 916764d5fc6..978f7ae5c0f 100644 --- a/phpdbg_help.c +++ b/phpdbg_help.c @@ -25,12 +25,13 @@ PHPDBG_HELP(exec) /* {{{ */ { - printf("Will attempt execution, if compilation has not yet taken place, it occurs now.\n"); - printf("The execution context must be set before execution can take place\n"); - return SUCCESS; + printf("Will attempt execution, if compilation has not yet taken place, it occurs now.\n"); + printf("The execution context must be set before execution can take place\n"); + return SUCCESS; } /* }}} */ -PHPDBG_HELP(step) { /* {{{ */ +PHPDBG_HELP(step) /* {{{ */ +{ printf("You can enable and disable stepping at any phpdbg prompt during execution\n"); printf("For example:\n"); printf("\tphpdbg> stepping 1\n"); @@ -39,68 +40,68 @@ PHPDBG_HELP(step) { /* {{{ */ return SUCCESS; } /* }}} */ -PHPDBG_HELP(next) { /* {{{ */ - printf("While stepping through execution, use the next command to step back into the vm and execute the next opcode"); - return SUCCESS; +PHPDBG_HELP(next) /* {{{ */ +{ + printf("While stepping through execution, use the next command to step back into the vm and execute the next opcode"); + return SUCCESS; } /* }}} */ PHPDBG_HELP(compile) /* {{{ */ { - printf("Pre-compilation of the execution context provides the opportunity to inspect the opcodes before they are executed\n"); - printf("The execution context must be set for compilation to succeed\n"); - printf("If errors occur during compilation they must be resolved before execution can take place.\n"); - printf("You do not need to exit phpdbg to retry compilation\n"); - return SUCCESS; + printf("Pre-compilation of the execution context provides the opportunity to inspect the opcodes before they are executed\n"); + printf("The execution context must be set for compilation to succeed\n"); + printf("If errors occur during compilation they must be resolved before execution can take place.\n"); + printf("You do not need to exit phpdbg to retry compilation\n"); + return SUCCESS; } /* }}} */ PHPDBG_HELP(print) /* {{{ */ { - printf("By default, print will show information about the current execution environment\n"); - printf("To show specific information pass an expression to print, for example:\n"); - printf("\tphpdbg> print opcodes[0]\n"); - printf("Will show the opline @ 0\n"); - printf("Available print commands:\n"); - printf("\tNone\n"); - - return SUCCESS; + printf("By default, print will show information about the current execution environment\n"); + printf("To show specific information pass an expression to print, for example:\n"); + printf("\tphpdbg> print opcodes[0]\n"); + printf("Will show the opline @ 0\n"); + printf("Available print commands:\n"); + printf("\tNone\n"); + return SUCCESS; } /* }}} */ -PHPDBG_HELP(run) /* {{{ */ +PHPDBG_HELP(run) /* {{{ */ { - printf("Run the code inside the debug vm, you should have break points and variables set before running\n"); - printf("The execution context must not be set, but not necessarily compiled before execution occurs\n"); - return SUCCESS; + printf("Run the code inside the debug vm, you should have break points and variables set before running\n"); + printf("The execution context must not be set, but not necessarily compiled before execution occurs\n"); + return SUCCESS; } /* }}} */ PHPDBG_HELP(eval) /* {{{ */ { - printf("Access to eval() allows you to change the environment during execution, careful though !!"); - return SUCCESS; + printf("Access to eval() allows you to change the environment during execution, careful though !!"); + return SUCCESS; } /* }}} */ PHPDBG_HELP(break) /* {{{ */ { - printf("Setting a breakpoint stops execution at a specific stage, the syntax is:\n"); - printf("\tfile:line\n"); - printf("[more to come]\n"); - printf("For example:\n"); - printf("\tphpdbg> break test.php:1\n"); - printf("Will break execution on line 1 of test.php\n"); - - return SUCCESS; + printf("Setting a breakpoint stops execution at a specific stage, the syntax is:\n"); + printf("\tfile:line\n"); + printf("[more to come]\n"); + printf("For example:\n"); + printf("\tphpdbg> break test.php:1\n"); + printf("Will break execution on line 1 of test.php\n"); + return SUCCESS; } /* }}} */ PHPDBG_HELP(cont) /* {{{ */ { - printf("Continues execution after a breakpoint is met\n"); - printf("[Warnings about using stepping and break points here]\n"); - return SUCCESS; + printf("Continues execution after a breakpoint is met\n"); + printf("[Warnings about using stepping and break points here]\n"); + return SUCCESS; } /* }}} */ -PHPDBG_HELP(back) { /* {{{ */ - printf("The backtrace is gathered with the default debug_backtrace functionality.\n"); - printf("You can set the limit on the trace, for example:\n"); - printf("\tphpdbg> back 5\n"); - printf("Will limit the number of frames to 5, the default is no limit\n"); - return SUCCESS; +PHPDBG_HELP(back) /* {{{ */ +{ + printf("The backtrace is gathered with the default debug_backtrace functionality.\n"); + printf("You can set the limit on the trace, for example:\n"); + printf("\tphpdbg> back 5\n"); + printf("Will limit the number of frames to 5, the default is no limit\n"); + return SUCCESS; } /* }}} */ From 5cca4190f42e5ba41927e66645ff6902188dc2d7 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 16:30:36 +0000 Subject: [PATCH 036/771] fix interference while quitting --- phpdbg.c | 1 + phpdbg.h | 3 ++- phpdbg_prompt.c | 11 ++++++++--- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/phpdbg.c b/phpdbg.c index a0419f313ea..fc780bfed92 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -29,6 +29,7 @@ static inline void php_phpdbg_globals_ctor(zend_phpdbg_globals *pg) /* {{{ */ pg->ops = NULL; pg->stepping = 0; pg->vmret = 0; + pg->quitting = 0; } /* }}} */ static PHP_MINIT_FUNCTION(phpdbg) /* {{{ */ diff --git a/phpdbg.h b/phpdbg.h index f34fa4c84e0..5721ff5fd52 100644 --- a/phpdbg.h +++ b/phpdbg.h @@ -46,9 +46,10 @@ ZEND_BEGIN_MODULE_GLOBALS(phpdbg) size_t exec_len; /* size of exec */ zend_op_array *ops; /* op_array */ zval *retval; /* return value */ - zend_bool stepping; /* stepping */ + int stepping; /* stepping */ int vmret; /* return from last opcode handler execution */ zend_bool has_file_bp; /* file-based breakpoint has been set */ + zend_bool quitting; /* quitting flag */ ZEND_END_MODULE_GLOBALS(phpdbg) #include "phpdbg_prompt.h" diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 4a145ac78a2..e5c3142eda8 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -120,8 +120,10 @@ static PHPDBG_COMMAND(run) { /* {{{ */ zend_try { zend_execute(EG(active_op_array) TSRMLS_CC); } zend_catch { - printf("Caught excetion in VM\n"); - return FAILURE; + if (!PHPDBG_G(quitting)) { + printf("Caught excetion in VM\n"); + return FAILURE; + } else return SUCCESS; } zend_end_try(); return SUCCESS; @@ -245,6 +247,8 @@ static PHPDBG_COMMAND(break) /* {{{ */ static PHPDBG_COMMAND(quit) /* {{{ */ { + PHPDBG_G(quitting)=1; + zend_bailout(); return SUCCESS; @@ -344,7 +348,8 @@ int phpdbg_interactive(int argc, char **argv TSRMLS_DC) /* {{{ */ printf("phpdbg> "); - while (fgets(cmd, PHPDBG_MAX_CMD, stdin) != NULL) { + while (!PHPDBG_G(quitting) && + fgets(cmd, PHPDBG_MAX_CMD, stdin) != NULL) { size_t cmd_len = strlen(cmd) - 1; while (cmd[cmd_len] == '\n') { From 782ea75c9e8833ffd32a84875ab9c3c2712c4b0a Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 16:33:35 +0000 Subject: [PATCH 037/771] ... --- phpdbg_prompt.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index e5c3142eda8..a176be4c9e1 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -367,7 +367,9 @@ int phpdbg_interactive(int argc, char **argv TSRMLS_DC) /* {{{ */ } } - printf("phpdbg> "); + if (!PHPDBG_G(quitting)) { + printf("phpdbg> "); + } } return SUCCESS; From 5f6c416b1463286f56bd14e22b8abe7bb9609032 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 16:34:12 +0000 Subject: [PATCH 038/771] consistency --- phpdbg_prompt.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index a176be4c9e1..4566fc7ef26 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -359,7 +359,10 @@ int phpdbg_interactive(int argc, char **argv TSRMLS_DC) /* {{{ */ if (cmd_len) { switch (phpdbg_do_cmd(phpdbg_prompt_commands, cmd, cmd_len TSRMLS_CC)) { case FAILURE: - printf("error executing %s !\n", cmd); + if (!PHPDBG_G(quitting)) { + printf( + "Failed to execute %s !\n", cmd); + } break; case PHPDBG_NEXT: From c6f443db2ecbd4207498ed07715f432ee0f0ef25 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 16:47:39 +0000 Subject: [PATCH 039/771] improve output from eval() --- phpdbg_prompt.c | 7 +++++-- test.php | 1 + 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 4566fc7ef26..51c160582f8 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -135,10 +135,13 @@ static PHPDBG_COMMAND(run) { /* {{{ */ static PHPDBG_COMMAND(eval) { /* {{{ */ zval retval; - + if (expr) { if (zend_eval_stringl((char*)expr, expr_len-1, &retval, "eval()'d code" TSRMLS_CC) == SUCCESS) { - printf("Success\n"); + printf("Success: "); + zend_print_zval_r( + &retval, 0 TSRMLS_CC); + printf("\n"); zval_dtor(&retval); } } else { diff --git a/test.php b/test.php index cbb2641e4fa..e907c3b6bf2 100644 --- a/test.php +++ b/test.php @@ -3,4 +3,5 @@ echo "Hello World\n"; if (isset($greeting)) { echo $greeting; } +return true; ?> From 3716646d3ccd1eb1861fb54e5eda7115a5d8ce60 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 17:45:06 +0000 Subject: [PATCH 040/771] ... --- phpdbg.c | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-- phpdbg.h | 1 + 2 files changed, 87 insertions(+), 2 deletions(-) diff --git a/phpdbg.c b/phpdbg.c index fc780bfed92..45377503898 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -126,9 +126,36 @@ static sapi_module_struct phpdbg_sapi_module = { }; /* }}} */ +const opt_struct OPTIONS[] = { /* }}} */ + {'c', 1, "ini path override"}, + {'d', 1, "define ini entry on command line"}, + {'-', 0, NULL} +}; /* }}} */ + +/* overwriteable ini defaults must be set in phpdbg_ini_defaults() */ +#define INI_DEFAULT(name,value)\ + Z_SET_REFCOUNT(tmp, 0);\ + Z_UNSET_ISREF(tmp); \ + ZVAL_STRINGL(&tmp, zend_strndup(value, sizeof(value)-1), sizeof(value)-1, 0);\ + zend_hash_update(configuration_hash, name, sizeof(name), &tmp, sizeof(zval), NULL);\ + +void phpdbg_ini_defaults(HashTable *configuration_hash) { /* {{{ */ + zval tmp; + INI_DEFAULT("report_zend_debug", "0"); + INI_DEFAULT("display_errors", "1"); +} /* }}} */ + int main(int argc, char **argv) /* {{{ */ { sapi_module_struct *phpdbg = &phpdbg_sapi_module; + char *ini_file = NULL; + char *ini_entries = NULL; + int ini_entries_len = 0; + char *ini_path_override = NULL; + char *php_optarg = NULL; + int php_optind = 0; + int opt; + #ifdef ZTS void ***tsrm_ls; tsrm_startup(1, 1, 0, NULL); @@ -143,10 +170,59 @@ int main(int argc, char **argv) /* {{{ */ setmode(_fileno(stderr), O_BINARY); /* make the stdio mode be binary */ #endif - phpdbg->executable_location = argv[0]; - + while ((opt = php_getopt(argc, argv, OPTIONS, &php_optarg, &php_optind, 1, 1)) != -1) { + switch (opt) { + case 'c': + if (ini_path_override) { + free(ini_path_override); + } + ini_path_override = strdup(php_optarg); + break; + case 'd': { + int len = strlen(php_optarg); + char *val; + + if ((val = strchr(php_optarg, '='))) { + val++; + if (!isalnum(*val) && *val != '"' && *val != '\'' && *val != '\0') { + ini_entries = realloc(ini_entries, ini_entries_len + len + sizeof("\"\"\n\0")); + memcpy(ini_entries + ini_entries_len, php_optarg, (val - php_optarg)); + ini_entries_len += (val - php_optarg); + memcpy(ini_entries + ini_entries_len, "\"", 1); + ini_entries_len++; + memcpy(ini_entries + ini_entries_len, val, len - (val - php_optarg)); + ini_entries_len += len - (val - php_optarg); + memcpy(ini_entries + ini_entries_len, "\"\n\0", sizeof("\"\n\0")); + ini_entries_len += sizeof("\n\0\"") - 2; + } else { + ini_entries = realloc(ini_entries, ini_entries_len + len + sizeof("\n\0")); + memcpy(ini_entries + ini_entries_len, php_optarg, len); + memcpy(ini_entries + ini_entries_len + len, "\n\0", sizeof("\n\0")); + ini_entries_len += len + sizeof("\n\0") - 2; + } + } else { + ini_entries = realloc(ini_entries, ini_entries_len + len + sizeof("=1\n\0")); + memcpy(ini_entries + ini_entries_len, php_optarg, len); + memcpy(ini_entries + ini_entries_len + len, "=1\n\0", sizeof("=1\n\0")); + ini_entries_len += len + sizeof("=1\n\0") - 2; + } + } break; + } + } + + phpdbg->ini_defaults = phpdbg_ini_defaults; + phpdbg->php_ini_path_override = ini_path_override; + phpdbg->phpinfo_as_text = 1; + phpdbg->php_ini_ignore_cwd = 1; + sapi_startup(phpdbg); + phpdbg->executable_location = argv[0]; + phpdbg->phpinfo_as_text = 1; + phpdbg->php_ini_ignore_cwd = 0; + phpdbg->php_ini_ignore = 0; + phpdbg->ini_entries = ini_entries; + if (phpdbg->startup(phpdbg) == SUCCESS) { zend_activate(TSRMLS_C); @@ -165,6 +241,14 @@ int main(int argc, char **argv) /* {{{ */ zend_try { phpdbg_interactive(argc, argv TSRMLS_CC); } zend_end_try(); + + if (ini_file) { + pefree(ini_file, 1); + } + + if (ini_entries) { + free(ini_entries); + } if (PG(modules_activated)) { zend_try { diff --git a/phpdbg.h b/phpdbg.h index 5721ff5fd52..087323009e4 100644 --- a/phpdbg.h +++ b/phpdbg.h @@ -18,6 +18,7 @@ #include "php.h" #include "php_globals.h" #include "php_variables.h" +#include "php_getopt.h" #include "zend_modules.h" #include "zend_ini_scanner.h" #include "zend_globals.h" From 16930d85f84d5e8c26fa40d951c751237e2a140f Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 10 Nov 2013 15:49:25 -0200 Subject: [PATCH 041/771] - Initial code for breakpoint on function --- phpdbg.h | 5 +-- phpdbg_prompt.c | 83 +++++++++++++++++++++++++++++++++++++++++++------ phpdbg_prompt.h | 1 + test.php | 8 +++-- 4 files changed, 82 insertions(+), 15 deletions(-) diff --git a/phpdbg.h b/phpdbg.h index f34fa4c84e0..68c987a4295 100644 --- a/phpdbg.h +++ b/phpdbg.h @@ -40,8 +40,8 @@ #define PHPDBG_NEXT 2 ZEND_BEGIN_MODULE_GLOBALS(phpdbg) - HashTable break_files; - HashTable break_symbols; + HashTable bp_files; + HashTable bp_symbols; char *exec; /* file to execute */ size_t exec_len; /* size of exec */ zend_op_array *ops; /* op_array */ @@ -49,6 +49,7 @@ ZEND_BEGIN_MODULE_GLOBALS(phpdbg) zend_bool stepping; /* stepping */ int vmret; /* return from last opcode handler execution */ zend_bool has_file_bp; /* file-based breakpoint has been set */ + zend_bool has_sym_bp; /* symbol-based breakpoint has been set */ ZEND_END_MODULE_GLOBALS(phpdbg) #include "phpdbg_prompt.h" diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 4a145ac78a2..c941fc94836 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -35,6 +35,13 @@ static void phpdbg_llist_breakfile_dtor(void *data) efree((char*)bp->filename); } +static void phpdbg_llist_breaksym_dtor(void *data) +{ + phpdbg_breaksymbol_t *bp = (phpdbg_breaksymbol_t*) data; + + efree((char*)bp->symbol); +} + static PHPDBG_COMMAND(exec) { /* {{{ */ if (PHPDBG_G(exec)) { printf( @@ -154,10 +161,10 @@ static PHPDBG_COMMAND(back) { /* {{{ */ HashPosition position; int i = 0; int limit = (expr != NULL) ? atoi(expr) : 0; - + zend_fetch_debug_backtrace( &zbacktrace, 0, 0, limit TSRMLS_CC); - + for (zend_hash_internal_pointer_reset_ex(Z_ARRVAL(zbacktrace), &position); zend_hash_get_current_data_ex(Z_ARRVAL(zbacktrace), (void**)&tmp, &position) == SUCCESS; zend_hash_move_forward_ex(Z_ARRVAL(zbacktrace), &position)) { @@ -166,11 +173,11 @@ static PHPDBG_COMMAND(back) { /* {{{ */ } zend_print_flat_zval_r(*tmp TSRMLS_CC); } - + printf("\n"); - + zval_dtor(&zbacktrace); - + return SUCCESS; } else { printf("Not executing !\n"); @@ -226,18 +233,42 @@ static PHPDBG_COMMAND(break) /* {{{ */ PHPDBG_G(has_file_bp) = 1; - if (zend_hash_find(&PHPDBG_G(break_files), + if (zend_hash_find(&PHPDBG_G(bp_files), new_break.filename, name_len, (void**)&break_files_ptr) == FAILURE) { zend_llist break_files; zend_llist_init(&break_files, sizeof(phpdbg_breakfile_t), phpdbg_llist_breakfile_dtor, 0); - zend_hash_update(&PHPDBG_G(break_files), + zend_hash_update(&PHPDBG_G(bp_files), new_break.filename, name_len, &break_files, sizeof(zend_llist), (void**)&break_files_ptr); } zend_llist_add_element(break_files_ptr, &new_break); + } else { + const char *opline_num_pos = zend_memrchr(expr, '#', expr_len); + long opline_num = opline_num_pos ? strtol(opline_num_pos+1, NULL, 0) : 0; + phpdbg_breaksymbol_t new_break; + zend_llist *break_sym_ptr; + size_t name_len = opline_num_pos ? opline_num_pos - expr : strlen(expr); + + new_break.symbol = estrndup(expr, name_len); + new_break.opline_num = opline_num; + + PHPDBG_G(has_sym_bp) = 1; + + if (zend_hash_find(&PHPDBG_G(bp_symbols), + new_break.symbol, name_len, (void**)&break_sym_ptr) == FAILURE) { + zend_llist break_syms; + + zend_llist_init(&break_syms, sizeof(phpdbg_breaksymbol_t), + phpdbg_llist_breaksym_dtor, 0); + + zend_hash_update(&PHPDBG_G(bp_symbols), + new_break.symbol, name_len, &break_syms, sizeof(zend_llist), + (void**)&break_sym_ptr); + } + zend_llist_add_element(break_sym_ptr, &new_break); } return SUCCESS; @@ -316,12 +347,12 @@ int phpdbg_do_cmd(const phpdbg_command_t *command, char *cmd_line, size_t cmd_le return FAILURE; } /* }}} */ -int phpdbg_breakpoint(zend_op_array *op_array TSRMLS_DC) /* {{{ */ +int phpdbg_breakpoint_file(zend_op_array *op_array TSRMLS_DC) /* {{{ */ { size_t name_len = strlen(op_array->filename); zend_llist *break_list; - if (zend_hash_find(&PHPDBG_G(break_files), op_array->filename, name_len, + if (zend_hash_find(&PHPDBG_G(bp_files), op_array->filename, name_len, (void**)&break_list) == SUCCESS) { zend_llist_element *le; @@ -338,6 +369,30 @@ int phpdbg_breakpoint(zend_op_array *op_array TSRMLS_DC) /* {{{ */ return FAILURE; } /* }}} */ +int phpdbg_breakpoint_symbol(zend_function *fbc TSRMLS_DC) +{ + const char *fname; + zend_llist *break_list; + + if (fbc->type != ZEND_USER_FUNCTION) { + return FAILURE; + } + + fname = ((zend_op_array*)fbc)->function_name; + + if (!fname) { + fname = "main"; + } + + if (zend_hash_find(&PHPDBG_G(bp_symbols), fname, strlen(fname), + (void**)&break_list) == SUCCESS) { + printf("breakpoint reached!\n"); + return SUCCESS; + } + + return FAILURE; +} + int phpdbg_interactive(int argc, char **argv TSRMLS_DC) /* {{{ */ { char cmd[PHPDBG_MAX_CMD]; @@ -389,7 +444,15 @@ zend_vm_enter: printf("[OPLINE: %p]\n", execute_data->opline); if (PHPDBG_G(has_file_bp) - && phpdbg_breakpoint(execute_data->op_array TSRMLS_CC) == SUCCESS) { + && phpdbg_breakpoint_file(execute_data->op_array TSRMLS_CC) == SUCCESS) { + while (phpdbg_interactive(0, NULL TSRMLS_CC) != PHPDBG_NEXT) { + continue; + } + } + + if (PHPDBG_G(has_sym_bp) + && (execute_data->opline->opcode == ZEND_DO_FCALL || execute_data->opline->opcode == ZEND_DO_FCALL_BY_NAME) + && phpdbg_breakpoint_symbol(execute_data->function_state.function TSRMLS_CC) == SUCCESS) { while (phpdbg_interactive(0, NULL TSRMLS_CC) != PHPDBG_NEXT) { continue; } diff --git a/phpdbg_prompt.h b/phpdbg_prompt.h index 8a4dfad675f..0f938e0051e 100644 --- a/phpdbg_prompt.h +++ b/phpdbg_prompt.h @@ -57,6 +57,7 @@ typedef struct _phpdbg_breakfile_t { */ typedef struct _phpdbg_breaksymbol_t { const char *symbol; + long opline_num; } phpdbg_breaksymbol_t; /** diff --git a/test.php b/test.php index cbb2641e4fa..0a10de16a93 100644 --- a/test.php +++ b/test.php @@ -1,6 +1,8 @@ From 307897e6027fde67138d1ecc70503b0bd9ff759d Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 17:51:48 +0000 Subject: [PATCH 042/771] instructions --- README.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/README.md b/README.md index 42c66cf9842..a15e556226f 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,21 @@ Features - access to eval during execution - sapi agnositicism, easy integration +Installation +============ + +To install **phpdbg**, you must compile the source against your PHP installation sources, and enable the SAPI with the configure command. + +``` +cd /usr/src/php-src/sapi +git clone https://github.com/krakjoe/phpdbg +cd ../ +./buildconf --force +./config.nice +make -j8 +make install-phpdbg +``` + Screeny ======= From 4d127e4afbff3f751208f2881a16a56e745d16a4 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 18:05:11 +0000 Subject: [PATCH 043/771] print_opline function to decode opline --- phpdbg_prompt.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index fe81c8cb9dd..d60bafa4abc 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -436,6 +436,13 @@ int phpdbg_interactive(int argc, char **argv TSRMLS_DC) /* {{{ */ return SUCCESS; } /* }}} */ +static void phpdbg_print_opline(zend_execute_data *execute_data TSRMLS_DC) { /* {{{ */ + zend_op *opline = execute_data->opline; + + printf( + "[OPLINE: %p:%d]\n", opline, opline->opcode); +} /* }}} */ + void phpdbg_execute_ex(zend_execute_data *execute_data TSRMLS_DC) { zend_bool original_in_execution = EG(in_execution); @@ -454,7 +461,7 @@ zend_vm_enter: } #endif - printf("[OPLINE: %p]\n", execute_data->opline); + phpdbg_print_opline(execute_data TSRMLS_CC); if (PHPDBG_G(has_file_bp) && phpdbg_breakpoint_file(execute_data->op_array TSRMLS_CC) == SUCCESS) { From defc4c318022cb8d56d38b90dbbd55a195c8529e Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 10 Nov 2013 16:06:41 -0200 Subject: [PATCH 044/771] - Added separated file to handle breakpoint feature --- config.m4 | 2 +- phpdbg.h | 6 +- phpdbg_bp.c | 147 ++++++++++++++++++++++++++++++++++++++++++++++++ phpdbg_bp.h | 39 +++++++++++++ phpdbg_help.h | 2 + phpdbg_prompt.c | 121 ++------------------------------------- phpdbg_prompt.h | 17 ------ 7 files changed, 200 insertions(+), 134 deletions(-) create mode 100644 phpdbg_bp.c create mode 100644 phpdbg_bp.h diff --git a/config.m4 b/config.m4 index b62d099ad40..4f98bb92bf7 100644 --- a/config.m4 +++ b/config.m4 @@ -9,7 +9,7 @@ if test "$PHP_PHPDBG" != "no"; then AC_DEFINE(HAVE_PHPDBG, 1, [ ]) PHP_PHPDBG_CFLAGS=-I$abs_srcdir/sapi/phpdbg - PHP_PHPDBG_FILES="phpdbg.c phpdbg_prompt.c phpdbg_help.c" + PHP_PHPDBG_FILES="phpdbg.c phpdbg_prompt.c phpdbg_help.c phpdbg_bp.c" PHP_ADD_MAKEFILE_FRAGMENT([$abs_srcdir/sapi/phpdbg/Makefile.frag]) PHP_SELECT_SAPI(phpdbg, program, $PHP_PHPDBG_FILES, $PHP_PHPDBG_CFLAGS, [$(SAPI_PHPDBG_PATH)]) diff --git a/phpdbg.h b/phpdbg.h index 427d22aa968..437fe8a2441 100644 --- a/phpdbg.h +++ b/phpdbg.h @@ -15,6 +15,10 @@ | Authors: Joe Watkins | +----------------------------------------------------------------------+ */ + +#ifndef PHPDBG_H +#define PHPDBG_H + #include "php.h" #include "php_globals.h" #include "php_variables.h" @@ -54,4 +58,4 @@ ZEND_BEGIN_MODULE_GLOBALS(phpdbg) zend_bool quitting; /* quitting flag */ ZEND_END_MODULE_GLOBALS(phpdbg) -#include "phpdbg_prompt.h" +#endif /* PHPDBG_H */ diff --git a/phpdbg_bp.c b/phpdbg_bp.c new file mode 100644 index 00000000000..a45ab164f7e --- /dev/null +++ b/phpdbg_bp.c @@ -0,0 +1,147 @@ +/* + +----------------------------------------------------------------------+ + | PHP Version 5 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997-2013 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 3.01 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | http://www.php.net/license/3_01.txt | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Authors: Felipe Pena | + | Authors: Joe Watkins | + +----------------------------------------------------------------------+ +*/ + +#include "zend.h" +#include "zend_hash.h" +#include "phpdbg.h" +#include "phpdbg_bp.h" + +ZEND_EXTERN_MODULE_GLOBALS(phpdbg); + +static void phpdbg_llist_breakfile_dtor(void *data) /* {{{ */ +{ + phpdbg_breakfile_t *bp = (phpdbg_breakfile_t*) data; + + efree((char*)bp->filename); +} /* }}} */ + +static void phpdbg_llist_breaksym_dtor(void *data) /* {{{ */ +{ + phpdbg_breaksymbol_t *bp = (phpdbg_breaksymbol_t*) data; + + efree((char*)bp->symbol); +} /* }}} */ + +void phpdbg_set_breakpoint_file(const char *expr, const char *line_pos TSRMLS_DC) /* {{{ */ +{ + char resolved_name[MAXPATHLEN]; + long line_num = strtol(line_pos+1, NULL, 0); + phpdbg_breakfile_t new_break; + zend_llist *break_files_ptr; + size_t name_len; + char *path = estrndup(expr, line_pos - expr); + + if (expand_filepath(path, resolved_name TSRMLS_CC) == NULL) { + efree(path); + return; + } + efree(path); + + name_len = strlen(resolved_name); + new_break.filename = estrndup(resolved_name, name_len + 1); + new_break.line = line_num; + + PHPDBG_G(has_file_bp) = 1; + + if (zend_hash_find(&PHPDBG_G(bp_files), + new_break.filename, name_len, (void**)&break_files_ptr) == FAILURE) { + zend_llist break_files; + + zend_llist_init(&break_files, sizeof(phpdbg_breakfile_t), + phpdbg_llist_breakfile_dtor, 0); + + zend_hash_update(&PHPDBG_G(bp_files), + new_break.filename, name_len, &break_files, sizeof(zend_llist), + (void**)&break_files_ptr); + } + zend_llist_add_element(break_files_ptr, &new_break); +} /* }}} */ + +void phpdbg_set_breakpoint_symbol(const char *expr, const char *opline_num_pos TSRMLS_DC) /* {{{ */ +{ + long opline_num = opline_num_pos ? strtol(opline_num_pos+1, NULL, 0) : 0; + phpdbg_breaksymbol_t new_break; + zend_llist *break_sym_ptr; + size_t name_len = opline_num_pos ? opline_num_pos - expr : strlen(expr); + + new_break.symbol = estrndup(expr, name_len); + new_break.opline_num = opline_num; + + PHPDBG_G(has_sym_bp) = 1; + + if (zend_hash_find(&PHPDBG_G(bp_symbols), + new_break.symbol, name_len, (void**)&break_sym_ptr) == FAILURE) { + zend_llist break_syms; + + zend_llist_init(&break_syms, sizeof(phpdbg_breaksymbol_t), + phpdbg_llist_breaksym_dtor, 0); + + zend_hash_update(&PHPDBG_G(bp_symbols), + new_break.symbol, name_len, &break_syms, sizeof(zend_llist), + (void**)&break_sym_ptr); + } + zend_llist_add_element(break_sym_ptr, &new_break); +} /* }}} */ + +int phpdbg_breakpoint_file(zend_op_array *op_array TSRMLS_DC) /* {{{ */ +{ + size_t name_len = strlen(op_array->filename); + zend_llist *break_list; + + if (zend_hash_find(&PHPDBG_G(bp_files), op_array->filename, name_len, + (void**)&break_list) == SUCCESS) { + zend_llist_element *le; + + for (le = break_list->head; le; le = le->next) { + phpdbg_breakfile_t *bp = (phpdbg_breakfile_t*) le->data; + + if (bp->line == (*EG(opline_ptr))->lineno) { + printf("breakpoint reached!\n"); + return SUCCESS; + } + } + } + + return FAILURE; +} /* }}} */ + +int phpdbg_breakpoint_symbol(zend_function *fbc TSRMLS_DC) /* {{{ */ +{ + const char *fname; + zend_llist *break_list; + + if (fbc->type != ZEND_USER_FUNCTION) { + return FAILURE; + } + + fname = ((zend_op_array*)fbc)->function_name; + + if (!fname) { + fname = "main"; + } + + if (zend_hash_find(&PHPDBG_G(bp_symbols), fname, strlen(fname), + (void**)&break_list) == SUCCESS) { + printf("breakpoint reached!\n"); + return SUCCESS; + } + + return FAILURE; +} +/* }}} */ diff --git a/phpdbg_bp.h b/phpdbg_bp.h new file mode 100644 index 00000000000..87aea82d0f9 --- /dev/null +++ b/phpdbg_bp.h @@ -0,0 +1,39 @@ +/* + +----------------------------------------------------------------------+ + | PHP Version 5 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997-2013 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 3.01 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | http://www.php.net/license/3_01.txt | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Authors: Felipe Pena | + | Authors: Joe Watkins | + +----------------------------------------------------------------------+ +*/ + +#ifndef PHPDBG_BP_H +#define PHPDBG_BP_H + +/** + * Breakpoint file-based representation + */ +typedef struct _phpdbg_breakfile_t { + const char *filename; + long line; +} phpdbg_breakfile_t; + +/** + * Breakpoint symbol-based representation + */ +typedef struct _phpdbg_breaksymbol_t { + const char *symbol; + long opline_num; +} phpdbg_breaksymbol_t; + +#endif /* PHPDBG_BP_H */ diff --git a/phpdbg_help.h b/phpdbg_help.h index 1051d61fc93..8ce6f9691d2 100644 --- a/phpdbg_help.h +++ b/phpdbg_help.h @@ -20,6 +20,8 @@ #ifndef PHPDBG_HELP_H #define PHPDBG_HELP_H +#include "phpdbg_prompt.h" + /** * Command Declarators */ diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index fe81c8cb9dd..5e795b624b3 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -23,25 +23,12 @@ #include "zend_compile.h" #include "phpdbg.h" #include "phpdbg_help.h" +#include "phpdbg_bp.h" static const phpdbg_command_t phpdbg_prompt_commands[]; ZEND_EXTERN_MODULE_GLOBALS(phpdbg); -static void phpdbg_llist_breakfile_dtor(void *data) -{ - phpdbg_breakfile_t *bp = (phpdbg_breakfile_t*) data; - - efree((char*)bp->filename); -} - -static void phpdbg_llist_breaksym_dtor(void *data) -{ - phpdbg_breaksymbol_t *bp = (phpdbg_breaksymbol_t*) data; - - efree((char*)bp->symbol); -} - static PHPDBG_COMMAND(exec) { /* {{{ */ if (PHPDBG_G(exec)) { printf( @@ -142,7 +129,7 @@ static PHPDBG_COMMAND(run) { /* {{{ */ static PHPDBG_COMMAND(eval) { /* {{{ */ zval retval; - + if (expr) { if (zend_eval_stringl((char*)expr, expr_len-1, &retval, "eval()'d code" TSRMLS_CC) == SUCCESS) { printf("Success: "); @@ -219,61 +206,11 @@ static PHPDBG_COMMAND(break) /* {{{ */ const char *line_pos = zend_memrchr(expr, ':', expr_len); if (line_pos) { - char resolved_name[MAXPATHLEN]; - long line_num = strtol(line_pos+1, NULL, 0); - phpdbg_breakfile_t new_break; - zend_llist *break_files_ptr; - size_t name_len; - char *path = estrndup(expr, line_pos - expr); - - if (expand_filepath(path, resolved_name TSRMLS_CC) == NULL) { - efree(path); - return FAILURE; - } - efree(path); - - name_len = strlen(resolved_name); - new_break.filename = estrndup(resolved_name, name_len + 1); - new_break.line = line_num; - - PHPDBG_G(has_file_bp) = 1; - - if (zend_hash_find(&PHPDBG_G(bp_files), - new_break.filename, name_len, (void**)&break_files_ptr) == FAILURE) { - zend_llist break_files; - - zend_llist_init(&break_files, sizeof(phpdbg_breakfile_t), - phpdbg_llist_breakfile_dtor, 0); - - zend_hash_update(&PHPDBG_G(bp_files), - new_break.filename, name_len, &break_files, sizeof(zend_llist), - (void**)&break_files_ptr); - } - zend_llist_add_element(break_files_ptr, &new_break); + phpdbg_set_breakpoint_file(expr, line_pos TSRMLS_CC); } else { const char *opline_num_pos = zend_memrchr(expr, '#', expr_len); - long opline_num = opline_num_pos ? strtol(opline_num_pos+1, NULL, 0) : 0; - phpdbg_breaksymbol_t new_break; - zend_llist *break_sym_ptr; - size_t name_len = opline_num_pos ? opline_num_pos - expr : strlen(expr); - - new_break.symbol = estrndup(expr, name_len); - new_break.opline_num = opline_num; - - PHPDBG_G(has_sym_bp) = 1; - if (zend_hash_find(&PHPDBG_G(bp_symbols), - new_break.symbol, name_len, (void**)&break_sym_ptr) == FAILURE) { - zend_llist break_syms; - - zend_llist_init(&break_syms, sizeof(phpdbg_breaksymbol_t), - phpdbg_llist_breaksym_dtor, 0); - - zend_hash_update(&PHPDBG_G(bp_symbols), - new_break.symbol, name_len, &break_syms, sizeof(zend_llist), - (void**)&break_sym_ptr); - } - zend_llist_add_element(break_sym_ptr, &new_break); + phpdbg_set_breakpoint_symbol(expr, opline_num_pos TSRMLS_CC); } return SUCCESS; @@ -282,7 +219,7 @@ static PHPDBG_COMMAND(break) /* {{{ */ static PHPDBG_COMMAND(quit) /* {{{ */ { PHPDBG_G(quitting)=1; - + zend_bailout(); return SUCCESS; @@ -354,59 +291,13 @@ int phpdbg_do_cmd(const phpdbg_command_t *command, char *cmd_line, size_t cmd_le return FAILURE; } /* }}} */ -int phpdbg_breakpoint_file(zend_op_array *op_array TSRMLS_DC) /* {{{ */ -{ - size_t name_len = strlen(op_array->filename); - zend_llist *break_list; - - if (zend_hash_find(&PHPDBG_G(bp_files), op_array->filename, name_len, - (void**)&break_list) == SUCCESS) { - zend_llist_element *le; - - for (le = break_list->head; le; le = le->next) { - phpdbg_breakfile_t *bp = (phpdbg_breakfile_t*) le->data; - - if (bp->line == (*EG(opline_ptr))->lineno) { - printf("breakpoint reached!\n"); - return SUCCESS; - } - } - } - - return FAILURE; -} /* }}} */ - -int phpdbg_breakpoint_symbol(zend_function *fbc TSRMLS_DC) -{ - const char *fname; - zend_llist *break_list; - - if (fbc->type != ZEND_USER_FUNCTION) { - return FAILURE; - } - - fname = ((zend_op_array*)fbc)->function_name; - - if (!fname) { - fname = "main"; - } - - if (zend_hash_find(&PHPDBG_G(bp_symbols), fname, strlen(fname), - (void**)&break_list) == SUCCESS) { - printf("breakpoint reached!\n"); - return SUCCESS; - } - - return FAILURE; -} - int phpdbg_interactive(int argc, char **argv TSRMLS_DC) /* {{{ */ { char cmd[PHPDBG_MAX_CMD]; printf("phpdbg> "); - while (!PHPDBG_G(quitting) && + while (!PHPDBG_G(quitting) && fgets(cmd, PHPDBG_MAX_CMD, stdin) != NULL) { size_t cmd_len = strlen(cmd) - 1; diff --git a/phpdbg_prompt.h b/phpdbg_prompt.h index 0f938e0051e..b6921d671e4 100644 --- a/phpdbg_prompt.h +++ b/phpdbg_prompt.h @@ -43,23 +43,6 @@ typedef struct _phpdbg_command_t { phpdbg_command_handler_t handler; /* Command handler */ } phpdbg_command_t; - -/** - * Breakpoint file-based representation - */ -typedef struct _phpdbg_breakfile_t { - const char *filename; - long line; -} phpdbg_breakfile_t; - -/** - * Breakpoint symbol-based representation - */ -typedef struct _phpdbg_breaksymbol_t { - const char *symbol; - long opline_num; -} phpdbg_breaksymbol_t; - /** * Command Executor */ From 4bfbdf55dce16eb2e25defa9d3fbe1b68a9ec38c Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 18:08:08 +0000 Subject: [PATCH 045/771] next not quitting when not stepping --- phpdbg_prompt.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 7e4f46d093a..252af0a16f4 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -314,8 +314,10 @@ int phpdbg_interactive(int argc, char **argv TSRMLS_DC) /* {{{ */ } break; - case PHPDBG_NEXT: + case PHPDBG_NEXT: if (PHPDBG_G(stepping)) { return PHPDBG_NEXT; + } + } } From 7d43677b1f87567d334562cb8bc04c998d63cd94 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 10 Nov 2013 16:10:23 -0200 Subject: [PATCH 046/771] - Fix code --- phpdbg_prompt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 5e795b624b3..02bb377af50 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -301,7 +301,7 @@ int phpdbg_interactive(int argc, char **argv TSRMLS_DC) /* {{{ */ fgets(cmd, PHPDBG_MAX_CMD, stdin) != NULL) { size_t cmd_len = strlen(cmd) - 1; - while (cmd[cmd_len] == '\n') { + if (cmd[cmd_len] == '\n') { cmd[cmd_len] = 0; } From 226052fb8ace69330a154da160af7f8bbf590459 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 10 Nov 2013 16:15:00 -0200 Subject: [PATCH 047/771] - Simplify code --- phpdbg_prompt.c | 52 +++++++++++++++++++++++++++---------------------- 1 file changed, 29 insertions(+), 23 deletions(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index cec6abb245d..cb24a3e7b34 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -177,28 +177,34 @@ static PHPDBG_COMMAND(back) { /* {{{ */ } } /* }}} */ -static PHPDBG_COMMAND(print) { /* {{{ */ - if (!expr_len) { - printf("Showing Execution Context Information:\n"); - printf("Exec\t\t%s\n", PHPDBG_G(exec) ? PHPDBG_G(exec) : "none"); - printf("Compiled\t%s\n", PHPDBG_G(ops) ? "yes" : "no"); - printf("Stepping\t%s\n", PHPDBG_G(stepping) ? "on" : "off"); - if (PHPDBG_G(ops)) { - printf("Opcodes\t\t%d\n", PHPDBG_G(ops)->last); - if (PHPDBG_G(ops)->last_var) { - printf("Variables\t%d\n", PHPDBG_G(ops)->last_var-1); - } else printf("Variables\tNone\n"); - } - printf("Executing\t%s\n", EG(in_execution) ? "yes" : "no"); - if (EG(in_execution)) { - printf("VM Return\t%d\n", PHPDBG_G(vmret)); - } - } else { - printf( - "%s\n", expr); - } +static PHPDBG_COMMAND(print) /* {{{ */ +{ + if (expr_len) { + printf("%s\n", expr); + return SUCCESS; + } - return SUCCESS; + printf("Showing Execution Context Information:\n"); + printf("Exec\t\t%s\n", PHPDBG_G(exec) ? PHPDBG_G(exec) : "none"); + printf("Compiled\t%s\n", PHPDBG_G(ops) ? "yes" : "no"); + printf("Stepping\t%s\n", PHPDBG_G(stepping) ? "on" : "off"); + + if (PHPDBG_G(ops)) { + printf("Opcodes\t\t%d\n", PHPDBG_G(ops)->last); + + if (PHPDBG_G(ops)->last_var) { + printf("Variables\t%d\n", PHPDBG_G(ops)->last_var-1); + } else { + printf("Variables\tNone\n"); + } + } + printf("Executing\t%s\n", EG(in_execution) ? "yes" : "no"); + + if (EG(in_execution)) { + printf("VM Return\t%d\n", PHPDBG_G(vmret)); + } + + return SUCCESS; } /* }}} */ static PHPDBG_COMMAND(break) /* {{{ */ @@ -317,7 +323,7 @@ int phpdbg_interactive(int argc, char **argv TSRMLS_DC) /* {{{ */ case PHPDBG_NEXT: if (PHPDBG_G(stepping)) { return PHPDBG_NEXT; } - + } } @@ -331,7 +337,7 @@ int phpdbg_interactive(int argc, char **argv TSRMLS_DC) /* {{{ */ static void phpdbg_print_opline(zend_execute_data *execute_data TSRMLS_DC) { /* {{{ */ zend_op *opline = execute_data->opline; - + printf( "[OPLINE: %p:%d]\n", opline, opline->opcode); } /* }}} */ From ddf5c42e2db8d3320ce4ba48240f64d0dddbfad0 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 10 Nov 2013 16:21:49 -0200 Subject: [PATCH 048/771] - Cosmetic changes --- phpdbg_prompt.c | 109 +++++++++++++++++++++++------------------------- 1 file changed, 52 insertions(+), 57 deletions(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index cb24a3e7b34..ba6cebcd32d 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -146,35 +146,32 @@ static PHPDBG_COMMAND(eval) { /* {{{ */ return SUCCESS; } /* }}} */ -static PHPDBG_COMMAND(back) { /* {{{ */ - if (EG(in_execution)) { - zval zbacktrace; - zval **tmp; - HashPosition position; - int i = 0; - int limit = (expr != NULL) ? atoi(expr) : 0; - - zend_fetch_debug_backtrace( - &zbacktrace, 0, 0, limit TSRMLS_CC); - - for (zend_hash_internal_pointer_reset_ex(Z_ARRVAL(zbacktrace), &position); - zend_hash_get_current_data_ex(Z_ARRVAL(zbacktrace), (void**)&tmp, &position) == SUCCESS; - zend_hash_move_forward_ex(Z_ARRVAL(zbacktrace), &position)) { - if (i++) { - printf(",\n"); - } - zend_print_flat_zval_r(*tmp TSRMLS_CC); - } - - printf("\n"); +static PHPDBG_COMMAND(back) /* {{{ */ +{ + if (!EG(in_execution)) { + printf("Not executing !\n"); + return FAILURE; + } + zval zbacktrace; + zval **tmp; + HashPosition position; + int i = 0, limit = (expr != NULL) ? atoi(expr) : 0; + + zend_fetch_debug_backtrace(&zbacktrace, 0, 0, limit TSRMLS_CC); + + for (zend_hash_internal_pointer_reset_ex(Z_ARRVAL(zbacktrace), &position); + zend_hash_get_current_data_ex(Z_ARRVAL(zbacktrace), (void**)&tmp, &position) == SUCCESS; + zend_hash_move_forward_ex(Z_ARRVAL(zbacktrace), &position)) { + if (i++) { + printf(",\n"); + } + zend_print_flat_zval_r(*tmp TSRMLS_CC); + } - zval_dtor(&zbacktrace); + printf("\n"); + zval_dtor(&zbacktrace); - return SUCCESS; - } else { - printf("Not executing !\n"); - return FAILURE; - } + return SUCCESS; } /* }}} */ static PHPDBG_COMMAND(print) /* {{{ */ @@ -233,35 +230,33 @@ static PHPDBG_COMMAND(quit) /* {{{ */ static PHPDBG_COMMAND(help) /* {{{ */ { - printf("Welcome to phpdbg, the interactive PHP debugger.\n"); - if (!expr_len) { - printf("To get help regarding a specific command type \"help command\"\n"); - printf("Commands:\n"); - { - const phpdbg_command_t *command = phpdbg_prompt_commands; - while (command && command->name) { - printf( - "\t%s\t%s\n", command->name, command->tip); - command++; - } - } - printf("Helpers Loaded:\n"); - { - const phpdbg_command_t *command = phpdbg_help_commands; - while (command && command->name) { - printf( - "\t%s\t%s\n", command->name, command->tip); - command++; - } - } - } else { - if (phpdbg_do_cmd(phpdbg_help_commands, expr, expr_len TSRMLS_CC) == FAILURE) { - printf("failed to find help command: %s\n", expr); - } - } - printf("Please report bugs to \n"); + printf("Welcome to phpdbg, the interactive PHP debugger.\n"); - return SUCCESS; + if (!expr_len) { + const phpdbg_command_t *prompt_command = phpdbg_prompt_commands; + const phpdbg_command_t *help_command = phpdbg_help_commands; + + printf("To get help regarding a specific command type \"help command\"\n"); + + printf("Commands:\n"); + while (prompt_command && prompt_command->name) { + printf("\t%s\t%s\n", prompt_command->name, prompt_command->tip); + ++prompt_command; + } + + printf("Helpers Loaded:\n"); + while (help_command && help_command->name) { + printf("\t%s\t%s\n", help_command->name, help_command->tip); + ++help_command; + } + } else { + if (phpdbg_do_cmd(phpdbg_help_commands, expr, expr_len TSRMLS_CC) == FAILURE) { + printf("failed to find help command: %s\n", expr); + } + } + printf("Please report bugs to \n"); + + return SUCCESS; } /* }}} */ static const phpdbg_command_t phpdbg_prompt_commands[] = { @@ -342,7 +337,7 @@ static void phpdbg_print_opline(zend_execute_data *execute_data TSRMLS_DC) { /* "[OPLINE: %p:%d]\n", opline, opline->opcode); } /* }}} */ -void phpdbg_execute_ex(zend_execute_data *execute_data TSRMLS_DC) +void phpdbg_execute_ex(zend_execute_data *execute_data TSRMLS_DC) /* {{{ */ { zend_bool original_in_execution = EG(in_execution); @@ -404,4 +399,4 @@ zend_vm_enter: } zend_error_noreturn(E_ERROR, "Arrived at end of main loop which shouldn't happen"); -} +} /* }}} */ From 7752077b63af0a9c52a46b8a8e2aeb8796bec3e7 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 10 Nov 2013 16:24:08 -0200 Subject: [PATCH 049/771] - Added prototype for breakpoint funcs --- phpdbg_bp.h | 3 +++ phpdbg_help.c | 1 - 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/phpdbg_bp.h b/phpdbg_bp.h index 87aea82d0f9..78909d2ae36 100644 --- a/phpdbg_bp.h +++ b/phpdbg_bp.h @@ -36,4 +36,7 @@ typedef struct _phpdbg_breaksymbol_t { long opline_num; } phpdbg_breaksymbol_t; +void phpdbg_set_breakpoint_file(const char*, const char* TSRMLS_DC); +void phpdbg_set_breakpoint_symbol(const char*, const char* TSRMLS_DC); + #endif /* PHPDBG_BP_H */ diff --git a/phpdbg_help.c b/phpdbg_help.c index 978f7ae5c0f..26811d0c395 100644 --- a/phpdbg_help.c +++ b/phpdbg_help.c @@ -18,7 +18,6 @@ */ #include -#include #include "zend.h" #include "phpdbg.h" #include "phpdbg_help.h" From cc85f285c6eb1de28c5f259d1fb99a40ee443ba3 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 18:28:50 +0000 Subject: [PATCH 050/771] print opcode names --- phpdbg_prompt.c | 175 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 174 insertions(+), 1 deletion(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 252af0a16f4..39ad020310b 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -329,11 +329,184 @@ int phpdbg_interactive(int argc, char **argv TSRMLS_DC) /* {{{ */ return SUCCESS; } /* }}} */ +static const char *phpdbg_decode_opcode(zend_uchar opcode TSRMLS_DC) { /* {{{ */ + switch (opcode) { + case ZEND_NOP: return "ZEND_NOP"; + case ZEND_ADD: return "ZEND_ADD"; + case ZEND_SUB: return "ZEND_SUB"; + case ZEND_MUL: return "ZEND_MUL"; + case ZEND_DIV: return "ZEND_DIV"; + case ZEND_MOD: return "ZEND_MOD"; + case ZEND_SL: return "ZEND_SL"; + case ZEND_SR: return "ZEND_SR"; + case ZEND_CONCAT: return "ZEND_CONCAT"; + case ZEND_BW_OR: return "ZEND_BW_OR"; + case ZEND_BW_AND: return "ZEND_BW_AND"; + case ZEND_BW_XOR: return "ZEND_BW_XOR"; + case ZEND_BW_NOT: return "ZEND_BW_NOT"; + case ZEND_BOOL_NOT: return "ZEND_BOOL_NOT"; + case ZEND_BOOL_XOR: return "ZEND_BOOL_XOR"; + case ZEND_IS_IDENTICAL: return "ZEND_IS_IDENTICAL"; + case ZEND_IS_NOT_IDENTICAL: return "ZEND_IS_NOT_IDENTICAL"; + case ZEND_IS_EQUAL: return "ZEND_IS_EQUAL"; + case ZEND_IS_NOT_EQUAL: return "ZEND_IS_NOT_EQUAL"; + case ZEND_IS_SMALLER: return "ZEND_IS_SMALLER"; + case ZEND_IS_SMALLER_OR_EQUAL: return "ZEND_IS_SMALLER_OR_EQUAL"; + case ZEND_CAST: return "ZEND_CAST"; + case ZEND_QM_ASSIGN: return "ZEND_QM_ASSIGN"; + case ZEND_ASSIGN_ADD: return "ZEND_ASSIGN_ADD"; + case ZEND_ASSIGN_SUB: return "ZEND_ASSIGN_SUB"; + case ZEND_ASSIGN_MUL: return "ZEND_ASSIGN_MUL"; + case ZEND_ASSIGN_DIV: return "ZEND_ASSIGN_DIV"; + case ZEND_ASSIGN_MOD: return "ZEND_ASSIGN_MOD"; + case ZEND_ASSIGN_SL: return "ZEND_ASSIGN_SL"; + case ZEND_ASSIGN_SR: return "ZEND_ASSIGN_SR"; + case ZEND_ASSIGN_CONCAT: return "ZEND_ASSIGN_CONCAT"; + case ZEND_ASSIGN_BW_OR: return "ZEND_ASSIGN_BW_OR"; + case ZEND_ASSIGN_BW_AND: return "ZEND_ASSIGN_BW_AND"; + case ZEND_ASSIGN_BW_XOR: return "ZEND_ASSIGN_BW_XOR"; + case ZEND_PRE_INC: return "ZEND_PRE_INC"; + case ZEND_PRE_DEC: return "ZEND_PRE_DEC"; + case ZEND_POST_INC: return "ZEND_POST_INC"; + case ZEND_POST_DEC: return "ZEND_POST_DEC"; + case ZEND_ASSIGN: return "ZEND_ASSIGN"; + case ZEND_ASSIGN_REF: return "ZEND_ASSIGN_REF"; + case ZEND_ECHO: return "ZEND_ECHO"; + case ZEND_PRINT: return "ZEND_PRINT"; + case ZEND_JMP: return "ZEND_JMP"; + case ZEND_JMPZ: return "ZEND_JMPZ"; + case ZEND_JMPNZ: return "ZEND_JMPNZ"; + case ZEND_JMPZNZ: return "ZEND_JMPZNZ"; + case ZEND_JMPZ_EX: return "ZEND_JMPZ_EX"; + case ZEND_JMPNZ_EX: return "ZEND_JMPNZ_EX"; + case ZEND_CASE: return "ZEND_CASE"; + case ZEND_SWITCH_FREE: return "ZEND_SWITCH_FREE"; + case ZEND_BRK: return "ZEND_BRK"; + case ZEND_CONT: return "ZEND_CONT"; + case ZEND_BOOL: return "ZEND_BOOL"; + case ZEND_INIT_STRING: return "ZEND_INIT_STRING"; + case ZEND_ADD_CHAR: return "ZEND_ADD_CHAR"; + case ZEND_ADD_STRING: return "ZEND_ADD_STRING"; + case ZEND_ADD_VAR: return "ZEND_ADD_VAR"; + case ZEND_BEGIN_SILENCE: return "ZEND_BEGIN_SILENCE"; + case ZEND_END_SILENCE: return "ZEND_END_SILENCE"; + case ZEND_INIT_FCALL_BY_NAME: return "ZEND_INIT_FCALL_BY_NAME"; + case ZEND_DO_FCALL: return "ZEND_DO_FCALL"; + case ZEND_DO_FCALL_BY_NAME: return "ZEND_DO_FCALL_BY_NAME"; + case ZEND_RETURN: return "ZEND_RETURN"; + case ZEND_RECV: return "ZEND_RECV"; + case ZEND_RECV_INIT: return "ZEND_RECV_INIT"; + case ZEND_SEND_VAL: return "ZEND_SEND_VAL"; + case ZEND_SEND_VAR: return "ZEND_SEND_VAR"; + case ZEND_SEND_REF: return "ZEND_SEND_REF"; + case ZEND_NEW: return "ZEND_NEW"; + case ZEND_INIT_NS_FCALL_BY_NAME: return "ZEND_INIT_NS_FCALL_BY_NAME"; + case ZEND_FREE: return "ZEND_FREE"; + case ZEND_INIT_ARRAY: return "ZEND_INIT_ARRAY"; + case ZEND_ADD_ARRAY_ELEMENT: return "ZEND_ADD_ARRAY_ELEMENT"; + case ZEND_INCLUDE_OR_EVAL: return "ZEND_INCLUDE_OR_EVAL"; + case ZEND_UNSET_VAR: return "ZEND_UNSET_VAR"; + case ZEND_UNSET_DIM: return "ZEND_UNSET_DIM"; + case ZEND_UNSET_OBJ: return "ZEND_UNSET_OBJ"; + case ZEND_FE_RESET: return "ZEND_FE_RESET"; + case ZEND_FE_FETCH: return "ZEND_FE_FETCH"; + case ZEND_EXIT: return "ZEND_EXIT"; + case ZEND_FETCH_R: return "ZEND_FETCH_R"; + case ZEND_FETCH_DIM_R: return "ZEND_FETCH_DIM_R"; + case ZEND_FETCH_OBJ_R: return "ZEND_FETCH_OBJ_R"; + case ZEND_FETCH_W: return "ZEND_FETCH_W"; + case ZEND_FETCH_DIM_W: return "ZEND_FETCH_DIM_W"; + case ZEND_FETCH_OBJ_W: return "ZEND_FETCH_OBJ_W"; + case ZEND_FETCH_RW: return "ZEND_FETCH_RW"; + case ZEND_FETCH_DIM_RW: return "ZEND_FETCH_DIM_RW"; + case ZEND_FETCH_OBJ_RW: return "ZEND_FETCH_OBJ_RW"; + case ZEND_FETCH_IS: return "ZEND_FETCH_IS"; + case ZEND_FETCH_DIM_IS: return "ZEND_FETCH_DIM_IS"; + case ZEND_FETCH_OBJ_IS: return "ZEND_FETCH_OBJ_IS"; + case ZEND_FETCH_FUNC_ARG: return "ZEND_FETCH_FUNC_ARG"; + case ZEND_FETCH_DIM_FUNC_ARG: return "ZEND_FETCH_DIM_FUNC_ARG"; + case ZEND_FETCH_OBJ_FUNC_ARG: return "ZEND_FETCH_OBJ_FUNC_ARG"; + case ZEND_FETCH_UNSET: return "ZEND_FETCH_UNSET"; + case ZEND_FETCH_DIM_UNSET: return "ZEND_FETCH_DIM_UNSET"; + case ZEND_FETCH_OBJ_UNSET: return "ZEND_FETCH_OBJ_UNSET"; + case ZEND_FETCH_DIM_TMP_VAR: return "ZEND_FETCH_DIM_TMP_VAR"; + case ZEND_FETCH_CONSTANT: return "ZEND_FETCH_CONSTANT"; + case ZEND_GOTO: return "ZEND_GOTO"; + case ZEND_EXT_STMT: return "ZEND_EXT_STMT"; + case ZEND_EXT_FCALL_BEGIN: return "ZEND_EXT_FCALL_BEGIN"; + case ZEND_EXT_FCALL_END: return "ZEND_EXT_FCALL_END"; + case ZEND_EXT_NOP: return "ZEND_EXT_NOP"; + case ZEND_TICKS: return "ZEND_TICKS"; + case ZEND_SEND_VAR_NO_REF: return "ZEND_SEND_VAR_NO_REF"; + case ZEND_CATCH: return "ZEND_CATCH"; + case ZEND_THROW: return "ZEND_THROW"; + case ZEND_FETCH_CLASS: return "ZEND_FETCH_CLASS"; + case ZEND_CLONE: return "ZEND_CLONE"; + case ZEND_RETURN_BY_REF: return "ZEND_RETURN_BY_REF"; + case ZEND_INIT_METHOD_CALL: return "ZEND_INIT_METHOD_CALL"; + case ZEND_INIT_STATIC_METHOD_CALL: return "ZEND_INIT_STATIC_METHOD_CALL"; + case ZEND_ISSET_ISEMPTY_VAR: return "ZEND_ISSET_ISEMPTY_VAR"; + case ZEND_ISSET_ISEMPTY_DIM_OBJ: return "ZEND_ISSET_ISEMPTY_DIM_OBJ"; + case ZEND_PRE_INC_OBJ: return "ZEND_PRE_INC_OBJ"; + case ZEND_PRE_DEC_OBJ: return "ZEND_PRE_DEC_OBJ"; + case ZEND_POST_INC_OBJ: return "ZEND_POST_INC_OBJ"; + case ZEND_POST_DEC_OBJ: return "ZEND_POST_DEC_OBJ"; + case ZEND_ASSIGN_OBJ: return "ZEND_ASSIGN_OBJ"; + case ZEND_INSTANCEOF: return "ZEND_INSTANCEOF"; + case ZEND_DECLARE_CLASS: return "ZEND_DECLARE_CLASS"; + case ZEND_DECLARE_INHERITED_CLASS: return "ZEND_DECLARE_INHERITED_CLASS"; + case ZEND_DECLARE_FUNCTION: return "ZEND_DECLARE_FUNCTION"; + case ZEND_RAISE_ABSTRACT_ERROR: return "ZEND_RAISE_ABSTRACT_ERROR"; + case ZEND_DECLARE_CONST: return "ZEND_DECLARE_CONST"; + case ZEND_ADD_INTERFACE: return "ZEND_ADD_INTERFACE"; + case ZEND_DECLARE_INHERITED_CLASS_DELAYED: return "ZEND_DECLARE_INHERITED_CLASS_DELAYED"; + case ZEND_VERIFY_ABSTRACT_CLASS: return "ZEND_VERIFY_ABSTRACT_CLASS"; + case ZEND_ASSIGN_DIM: return "ZEND_ASSIGN_DIM"; + case ZEND_ISSET_ISEMPTY_PROP_OBJ: return "ZEND_ISSET_ISEMPTY_PROP_OBJ"; + case ZEND_HANDLE_EXCEPTION: return "ZEND_HANDLE_EXCEPTION"; + case ZEND_USER_OPCODE: return "ZEND_USER_OPCODE"; +#ifdef ZEND_JMP_SET + case ZEND_JMP_SET: return "ZEND_JMP_SET"; +#endif + case ZEND_DECLARE_LAMBDA_FUNCTION: return "ZEND_DECLARE_LAMBDA_FUNCTION"; +#ifdef ZEND_ADD_TRAIT + case ZEND_ADD_TRAIT: return "ZEND_ADD_TRAIT"; +#endif +#ifdef ZEND_BIND_TRAITS + case ZEND_BIND_TRAITS: return "ZEND_BIND_TRAITS"; +#endif +#ifdef ZEND_SEPARATE + case ZEND_SEPARATE: return "ZEND_SEPARATE"; +#endif +#ifdef ZEND_QM_ASSIGN_VAR + case ZEND_QM_ASSIGN_VAR: return "ZEND_QM_ASSIGN_VAR"; +#endif +#ifdef ZEND_JMP_SET_VAR + case ZEND_JMP_SET_VAR: return "ZEND_JMP_SET_VAR"; +#endif + case ZEND_DISCARD_EXCEPTION: return "ZEND_DISCARD_EXCEPTION"; + case ZEND_YIELD: return "ZEND_YIELD"; + case ZEND_GENERATOR_RETURN: return "ZEND_GENERATOR_RETURN"; +#ifdef ZEND_FAST_CALL + case ZEND_FAST_CALL: return "ZEND_FAST_CALL"; +#endif +#ifdef ZEND_FAST_RET + case ZEND_FAST_RET: return "ZEND_FAST_RET"; +#endif +#ifdef ZEND_RECV_VARIADIC + case ZEND_RECV_VARIADIC: return "ZEND_RECV_VARIADIC"; +#endif + case ZEND_OP_DATA: return "ZEND_OP_DATA"; + + default: return "UNKNOWN"; + } +} /* }}} */ + static void phpdbg_print_opline(zend_execute_data *execute_data TSRMLS_DC) { /* {{{ */ zend_op *opline = execute_data->opline; printf( - "[OPLINE: %p:%d]\n", opline, opline->opcode); + "[OPLINE: %p:%s]\n", opline, phpdbg_decode_opcode(opline->opcode TSRMLS_CC)); } /* }}} */ void phpdbg_execute_ex(zend_execute_data *execute_data TSRMLS_DC) From aedf45252f20ff68800a72dc4e486b924ba0086f Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 10 Nov 2013 16:29:05 -0200 Subject: [PATCH 051/771] - WS changes --- phpdbg_prompt.c | 191 ++++++++++++++++++++++++------------------------ 1 file changed, 97 insertions(+), 94 deletions(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index ba6cebcd32d..8c8482c4fad 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -29,121 +29,124 @@ static const phpdbg_command_t phpdbg_prompt_commands[]; ZEND_EXTERN_MODULE_GLOBALS(phpdbg); -static PHPDBG_COMMAND(exec) { /* {{{ */ - if (PHPDBG_G(exec)) { - printf( - "Unsetting old execution context: %s\n", PHPDBG_G(exec)); - efree(PHPDBG_G(exec)); - PHPDBG_G(exec) = NULL; - } +static PHPDBG_COMMAND(exec) /* {{{ */ +{ + if (PHPDBG_G(exec)) { + printf("Unsetting old execution context: %s\n", PHPDBG_G(exec)); + efree(PHPDBG_G(exec)); + PHPDBG_G(exec) = NULL; + } - if (PHPDBG_G(ops)) { - printf( - "Destroying compiled opcodes\n"); - destroy_op_array(PHPDBG_G(ops) TSRMLS_CC); - efree(PHPDBG_G(ops)); - PHPDBG_G(ops) = NULL; - } + if (PHPDBG_G(ops)) { + printf("Destroying compiled opcodes\n"); + destroy_op_array(PHPDBG_G(ops) TSRMLS_CC); + efree(PHPDBG_G(ops)); + PHPDBG_G(ops) = NULL; + } - PHPDBG_G(exec) = estrndup( - expr, PHPDBG_G(exec_len)=expr_len); + PHPDBG_G(exec) = estrndup(expr, PHPDBG_G(exec_len) = expr_len); - printf( - "Set execution context: %s\n", PHPDBG_G(exec)); + printf("Set execution context: %s\n", PHPDBG_G(exec)); - return SUCCESS; + return SUCCESS; } /* }}} */ -static inline int phpdbg_compile(TSRMLS_D) { - zend_file_handle fh; - - printf("Attempting compilation of %s\n", PHPDBG_G(exec)); - if (php_stream_open_for_zend_ex(PHPDBG_G(exec), &fh, USE_PATH|STREAM_OPEN_FOR_INCLUDE TSRMLS_CC) == SUCCESS) { - PHPDBG_G(ops) = zend_compile_file( - &fh, ZEND_INCLUDE TSRMLS_CC); - zend_destroy_file_handle(&fh TSRMLS_CC); - printf("Success\n"); - return SUCCESS; - } else { - printf("Could not open file %s\n", PHPDBG_G(exec)); - return FAILURE; - } -} +static inline int phpdbg_compile(TSRMLS_D) /* {{{ */ +{ + zend_file_handle fh; -static PHPDBG_COMMAND(compile) { /* {{{ */ - if (PHPDBG_G(exec)) { + printf("Attempting compilation of %s\n", PHPDBG_G(exec)); - if (PHPDBG_G(ops)) { - printf("Destroying compiled opcodes\n"); - destroy_op_array(PHPDBG_G(ops) TSRMLS_CC); - efree(PHPDBG_G(ops)); + if (php_stream_open_for_zend_ex(PHPDBG_G(exec), &fh, + USE_PATH|STREAM_OPEN_FOR_INCLUDE TSRMLS_CC) == SUCCESS) { + PHPDBG_G(ops) = zend_compile_file(&fh, ZEND_INCLUDE TSRMLS_CC); + zend_destroy_file_handle(&fh TSRMLS_CC); + printf("Success\n"); + return SUCCESS; } - return phpdbg_compile(TSRMLS_C); - } else { - printf("No execution context\n"); - return FAILURE; - } + printf("Could not open file %s\n", PHPDBG_G(exec)); + return FAILURE; } /* }}} */ -static PHPDBG_COMMAND(step) { /* {{{ */ - PHPDBG_G(stepping) = atoi(expr); - return SUCCESS; +static PHPDBG_COMMAND(compile) /* {{{ */ +{ + if (PHPDBG_G(exec)) { + if (PHPDBG_G(ops)) { + printf("Destroying compiled opcodes\n"); + destroy_op_array(PHPDBG_G(ops) TSRMLS_CC); + efree(PHPDBG_G(ops)); + } + + return phpdbg_compile(TSRMLS_C); + } else { + printf("No execution context\n"); + return FAILURE; + } } /* }}} */ -static PHPDBG_COMMAND(next) { /* {{{ */ - return PHPDBG_NEXT; +static PHPDBG_COMMAND(step) /* {{{ */ +{ + PHPDBG_G(stepping) = atoi(expr); + return SUCCESS; } /* }}} */ -static PHPDBG_COMMAND(cont) { /* {{{ */ - return SUCCESS; +static PHPDBG_COMMAND(next) /* {{{ */ +{ + return PHPDBG_NEXT; } /* }}} */ -static PHPDBG_COMMAND(run) { /* {{{ */ - if (PHPDBG_G(ops) || PHPDBG_G(exec)) { - if (!PHPDBG_G(ops)) { - if (phpdbg_compile(TSRMLS_C) == FAILURE) { - printf("Failed to compile %s, cannot run\n", PHPDBG_G(exec)); - return FAILURE; - } - } - - EG(active_op_array) = PHPDBG_G(ops); - EG(return_value_ptr_ptr) = &PHPDBG_G(retval); - - zend_try { - zend_execute(EG(active_op_array) TSRMLS_CC); - } zend_catch { - if (!PHPDBG_G(quitting)) { - printf("Caught excetion in VM\n"); - return FAILURE; - } else return SUCCESS; - } zend_end_try(); - - return SUCCESS; - } else { - printf("Nothing to execute !\n"); - return FAILURE; - } +static PHPDBG_COMMAND(cont) /* {{{ */ +{ + return SUCCESS; } /* }}} */ -static PHPDBG_COMMAND(eval) { /* {{{ */ - zval retval; - - if (expr) { - if (zend_eval_stringl((char*)expr, expr_len-1, &retval, "eval()'d code" TSRMLS_CC) == SUCCESS) { - printf("Success: "); - zend_print_zval_r( - &retval, 0 TSRMLS_CC); - printf("\n"); - zval_dtor(&retval); - } - } else { - printf("No expression provided !\n"); - return FAILURE; - } +static PHPDBG_COMMAND(run) /* {{{ */ +{ + if (PHPDBG_G(ops) || PHPDBG_G(exec)) { + if (!PHPDBG_G(ops)) { + if (phpdbg_compile(TSRMLS_C) == FAILURE) { + printf("Failed to compile %s, cannot run\n", PHPDBG_G(exec)); + return FAILURE; + } + } - return SUCCESS; + EG(active_op_array) = PHPDBG_G(ops); + EG(return_value_ptr_ptr) = &PHPDBG_G(retval); + + zend_try { + zend_execute(EG(active_op_array) TSRMLS_CC); + } zend_catch { + if (!PHPDBG_G(quitting)) { + printf("Caught excetion in VM\n"); + return FAILURE; + } else return SUCCESS; + } zend_end_try(); + + return SUCCESS; + } else { + printf("Nothing to execute !\n"); + return FAILURE; + } +} /* }}} */ + +static PHPDBG_COMMAND(eval) /* {{{ */ +{ + zval retval; + + if (expr) { + if (zend_eval_stringl((char*)expr, expr_len-1, &retval, "eval()'d code" TSRMLS_CC) == SUCCESS) { + printf("Success: "); + zend_print_zval_r(&retval, 0 TSRMLS_CC); + printf("\n"); + zval_dtor(&retval); + } + } else { + printf("No expression provided !\n"); + return FAILURE; + } + + return SUCCESS; } /* }}} */ static PHPDBG_COMMAND(back) /* {{{ */ From 663a13635ac00b139d4882daeea44214b04cb9ba Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 18:56:19 +0000 Subject: [PATCH 052/771] fix symbol breakpoints --- phpdbg_bp.c | 2 +- phpdbg_help.c | 4 +++- phpdbg_prompt.c | 36 ++++++++++++++++++++++++++---------- 3 files changed, 30 insertions(+), 12 deletions(-) diff --git a/phpdbg_bp.c b/phpdbg_bp.c index a45ab164f7e..52f0a243fda 100644 --- a/phpdbg_bp.c +++ b/phpdbg_bp.c @@ -135,7 +135,7 @@ int phpdbg_breakpoint_symbol(zend_function *fbc TSRMLS_DC) /* {{{ */ if (!fname) { fname = "main"; } - + if (zend_hash_find(&PHPDBG_G(bp_symbols), fname, strlen(fname), (void**)&break_list) == SUCCESS) { printf("breakpoint reached!\n"); diff --git a/phpdbg_help.c b/phpdbg_help.c index 26811d0c395..370c15eba0f 100644 --- a/phpdbg_help.c +++ b/phpdbg_help.c @@ -82,10 +82,12 @@ PHPDBG_HELP(break) /* {{{ */ { printf("Setting a breakpoint stops execution at a specific stage, the syntax is:\n"); printf("\tfile:line\n"); - printf("[more to come]\n"); + printf("\tfunction\n"); printf("For example:\n"); printf("\tphpdbg> break test.php:1\n"); printf("Will break execution on line 1 of test.php\n"); + printf("\tphpdbg> break my_function\n"); + printf("Will break execution on entry to my_function\n"); return SUCCESS; } /* }}} */ diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index dee88d2534f..a5fa359290d 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -531,8 +531,6 @@ zend_vm_enter: } #endif - phpdbg_print_opline(execute_data TSRMLS_CC); - if (PHPDBG_G(has_file_bp) && phpdbg_breakpoint_file(execute_data->op_array TSRMLS_CC) == SUCCESS) { while (phpdbg_interactive(0, NULL TSRMLS_CC) != PHPDBG_NEXT) { @@ -540,15 +538,33 @@ zend_vm_enter: } } - if (PHPDBG_G(has_sym_bp) - && (execute_data->opline->opcode == ZEND_DO_FCALL || execute_data->opline->opcode == ZEND_DO_FCALL_BY_NAME) - && phpdbg_breakpoint_symbol(execute_data->function_state.function TSRMLS_CC) == SUCCESS) { - while (phpdbg_interactive(0, NULL TSRMLS_CC) != PHPDBG_NEXT) { - continue; - } - } - + if (PHPDBG_G(has_sym_bp)) { + zend_execute_data *previous = execute_data->prev_execute_data; + if (previous && (previous != execute_data)) { + if (previous->opline) { + if (previous->opline->opcode == ZEND_DO_FCALL || previous->opline->opcode == ZEND_DO_FCALL_BY_NAME) { + if (phpdbg_breakpoint_symbol(previous->function_state.function TSRMLS_CC) == SUCCESS) { + while (phpdbg_interactive(0, NULL TSRMLS_CC) != PHPDBG_NEXT) { + continue; + } + } + } + } + } else { + if (execute_data->opline->opcode == ZEND_DO_FCALL || execute_data->opline->opcode == ZEND_DO_FCALL_BY_NAME) { + if (phpdbg_breakpoint_symbol(execute_data->function_state.function TSRMLS_CC) == SUCCESS) { + while (phpdbg_interactive(0, NULL TSRMLS_CC) != PHPDBG_NEXT) { + continue; + } + } + } + } + } + PHPDBG_G(vmret) = execute_data->opline->handler(execute_data TSRMLS_CC); + + phpdbg_print_opline( + execute_data TSRMLS_CC); if (PHPDBG_G(stepping)) { while (phpdbg_interactive( From 1fcc54a6b822c1f1acb7349f9d683403c100e08a Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 10 Nov 2013 17:15:32 -0200 Subject: [PATCH 053/771] - Added breakpoint counter --- phpdbg.c | 2 ++ phpdbg.h | 1 + phpdbg_bp.c | 21 +++++++++++++-------- phpdbg_bp.h | 2 ++ 4 files changed, 18 insertions(+), 8 deletions(-) diff --git a/phpdbg.c b/phpdbg.c index 48b5728d77a..feed5ecd398 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -17,6 +17,7 @@ */ #include "phpdbg.h" +#include "phpdbg_prompt.h" ZEND_DECLARE_MODULE_GLOBALS(phpdbg); @@ -30,6 +31,7 @@ static inline void php_phpdbg_globals_ctor(zend_phpdbg_globals *pg) /* {{{ */ pg->stepping = 0; pg->vmret = 0; pg->quitting = 0; + pg->bp_count = 0; } /* }}} */ static PHP_MINIT_FUNCTION(phpdbg) /* {{{ */ diff --git a/phpdbg.h b/phpdbg.h index 437fe8a2441..c2f949bc899 100644 --- a/phpdbg.h +++ b/phpdbg.h @@ -51,6 +51,7 @@ ZEND_BEGIN_MODULE_GLOBALS(phpdbg) size_t exec_len; /* size of exec */ zend_op_array *ops; /* op_array */ zval *retval; /* return value */ + size_t bp_count; /* breakpoint count */ int stepping; /* stepping */ int vmret; /* return from last opcode handler execution */ zend_bool has_file_bp; /* file-based breakpoint has been set */ diff --git a/phpdbg_bp.c b/phpdbg_bp.c index a45ab164f7e..a531f4f1af3 100644 --- a/phpdbg_bp.c +++ b/phpdbg_bp.c @@ -70,6 +70,8 @@ void phpdbg_set_breakpoint_file(const char *expr, const char *line_pos TSRMLS_DC new_break.filename, name_len, &break_files, sizeof(zend_llist), (void**)&break_files_ptr); } + + new_break.id = PHPDBG_G(bp_count)++; zend_llist_add_element(break_files_ptr, &new_break); } /* }}} */ @@ -96,6 +98,8 @@ void phpdbg_set_breakpoint_symbol(const char *expr, const char *opline_num_pos T new_break.symbol, name_len, &break_syms, sizeof(zend_llist), (void**)&break_sym_ptr); } + + new_break.id = PHPDBG_G(bp_count)++; zend_llist_add_element(break_sym_ptr, &new_break); } /* }}} */ @@ -103,18 +107,19 @@ int phpdbg_breakpoint_file(zend_op_array *op_array TSRMLS_DC) /* {{{ */ { size_t name_len = strlen(op_array->filename); zend_llist *break_list; + zend_llist_element *le; if (zend_hash_find(&PHPDBG_G(bp_files), op_array->filename, name_len, - (void**)&break_list) == SUCCESS) { - zend_llist_element *le; + (void**)&break_list) == FAILURE) { + return FAILURE; + } - for (le = break_list->head; le; le = le->next) { - phpdbg_breakfile_t *bp = (phpdbg_breakfile_t*) le->data; + for (le = break_list->head; le; le = le->next) { + const phpdbg_breakfile_t *bp = (phpdbg_breakfile_t*)le->data; - if (bp->line == (*EG(opline_ptr))->lineno) { - printf("breakpoint reached!\n"); - return SUCCESS; - } + if (bp->line == (*EG(opline_ptr))->lineno) { + printf("Breakpoint #%d at %s:%ld\n", bp->id, bp->filename, bp->line); + return SUCCESS; } } diff --git a/phpdbg_bp.h b/phpdbg_bp.h index 78909d2ae36..c6d057c2806 100644 --- a/phpdbg_bp.h +++ b/phpdbg_bp.h @@ -26,6 +26,7 @@ typedef struct _phpdbg_breakfile_t { const char *filename; long line; + size_t id; } phpdbg_breakfile_t; /** @@ -34,6 +35,7 @@ typedef struct _phpdbg_breakfile_t { typedef struct _phpdbg_breaksymbol_t { const char *symbol; long opline_num; + size_t id; } phpdbg_breaksymbol_t; void phpdbg_set_breakpoint_file(const char*, const char* TSRMLS_DC); From 20f37407e149bc4a815b67c92fbd6ab84c28d763 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 10 Nov 2013 18:01:09 -0200 Subject: [PATCH 054/771] - Added separated file to opcode decode function --- config.m4 | 2 +- phpdbg_opcode.c | 195 ++++++++++++++++++++++++++++++++++++++++++++++++ phpdbg_opcode.h | 27 +++++++ phpdbg_prompt.c | 177 +------------------------------------------ 4 files changed, 225 insertions(+), 176 deletions(-) create mode 100644 phpdbg_opcode.c create mode 100644 phpdbg_opcode.h diff --git a/config.m4 b/config.m4 index 4f98bb92bf7..f3671f4b10d 100644 --- a/config.m4 +++ b/config.m4 @@ -9,7 +9,7 @@ if test "$PHP_PHPDBG" != "no"; then AC_DEFINE(HAVE_PHPDBG, 1, [ ]) PHP_PHPDBG_CFLAGS=-I$abs_srcdir/sapi/phpdbg - PHP_PHPDBG_FILES="phpdbg.c phpdbg_prompt.c phpdbg_help.c phpdbg_bp.c" + PHP_PHPDBG_FILES="phpdbg.c phpdbg_prompt.c phpdbg_help.c phpdbg_bp.c phpdbg_opcode.c" PHP_ADD_MAKEFILE_FRAGMENT([$abs_srcdir/sapi/phpdbg/Makefile.frag]) PHP_SELECT_SAPI(phpdbg, program, $PHP_PHPDBG_FILES, $PHP_PHPDBG_CFLAGS, [$(SAPI_PHPDBG_PATH)]) diff --git a/phpdbg_opcode.c b/phpdbg_opcode.c new file mode 100644 index 00000000000..b77cfb730bd --- /dev/null +++ b/phpdbg_opcode.c @@ -0,0 +1,195 @@ +/* + +----------------------------------------------------------------------+ + | PHP Version 5 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997-2013 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 3.01 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | http://www.php.net/license/3_01.txt | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Authors: Felipe Pena | + | Authors: Joe Watkins | + +----------------------------------------------------------------------+ +*/ + +#include "phpdbg_opcode.h" +#include "zend_vm_opcodes.h" + +const char *phpdbg_decode_opcode(zend_uchar opcode) /* {{{ */ +{ +#define CASE(s) return #s + switch (opcode) { + CASE(ZEND_NOP); + CASE(ZEND_ADD); + CASE(ZEND_SUB); + CASE(ZEND_MUL); + CASE(ZEND_DIV); + CASE(ZEND_MOD); + CASE(ZEND_SL); + CASE(ZEND_SR); + CASE(ZEND_CONCAT); + CASE(ZEND_BW_OR); + CASE(ZEND_BW_AND); + CASE(ZEND_BW_XOR); + CASE(ZEND_BW_NOT); + CASE(ZEND_BOOL_NOT); + CASE(ZEND_BOOL_XOR); + CASE(ZEND_IS_IDENTICAL); + CASE(ZEND_IS_NOT_IDENTICAL); + CASE(ZEND_IS_EQUAL); + CASE(ZEND_IS_NOT_EQUAL); + CASE(ZEND_IS_SMALLER); + CASE(ZEND_IS_SMALLER_OR_EQUAL); + CASE(ZEND_CAST); + CASE(ZEND_QM_ASSIGN); + CASE(ZEND_ASSIGN_ADD); + CASE(ZEND_ASSIGN_SUB); + CASE(ZEND_ASSIGN_MUL); + CASE(ZEND_ASSIGN_DIV); + CASE(ZEND_ASSIGN_MOD); + CASE(ZEND_ASSIGN_SL); + CASE(ZEND_ASSIGN_SR); + CASE(ZEND_ASSIGN_CONCAT); + CASE(ZEND_ASSIGN_BW_OR); + CASE(ZEND_ASSIGN_BW_AND); + CASE(ZEND_ASSIGN_BW_XOR); + CASE(ZEND_PRE_INC); + CASE(ZEND_PRE_DEC); + CASE(ZEND_POST_INC); + CASE(ZEND_POST_DEC); + CASE(ZEND_ASSIGN); + CASE(ZEND_ASSIGN_REF); + CASE(ZEND_ECHO); + CASE(ZEND_PRINT); + CASE(ZEND_JMP); + CASE(ZEND_JMPZ); + CASE(ZEND_JMPNZ); + CASE(ZEND_JMPZNZ); + CASE(ZEND_JMPZ_EX); + CASE(ZEND_JMPNZ_EX); + CASE(ZEND_CASE); + CASE(ZEND_SWITCH_FREE); + CASE(ZEND_BRK); + CASE(ZEND_CONT); + CASE(ZEND_BOOL); + CASE(ZEND_INIT_STRING); + CASE(ZEND_ADD_CHAR); + CASE(ZEND_ADD_STRING); + CASE(ZEND_ADD_VAR); + CASE(ZEND_BEGIN_SILENCE); + CASE(ZEND_END_SILENCE); + CASE(ZEND_INIT_FCALL_BY_NAME); + CASE(ZEND_DO_FCALL); + CASE(ZEND_DO_FCALL_BY_NAME); + CASE(ZEND_RETURN); + CASE(ZEND_RECV); + CASE(ZEND_RECV_INIT); + CASE(ZEND_SEND_VAL); + CASE(ZEND_SEND_VAR); + CASE(ZEND_SEND_REF); + CASE(ZEND_NEW); + CASE(ZEND_INIT_NS_FCALL_BY_NAME); + CASE(ZEND_FREE); + CASE(ZEND_INIT_ARRAY); + CASE(ZEND_ADD_ARRAY_ELEMENT); + CASE(ZEND_INCLUDE_OR_EVAL); + CASE(ZEND_UNSET_VAR); + CASE(ZEND_UNSET_DIM); + CASE(ZEND_UNSET_OBJ); + CASE(ZEND_FE_RESET); + CASE(ZEND_FE_FETCH); + CASE(ZEND_EXIT); + CASE(ZEND_FETCH_R); + CASE(ZEND_FETCH_DIM_R); + CASE(ZEND_FETCH_OBJ_R); + CASE(ZEND_FETCH_W); + CASE(ZEND_FETCH_DIM_W); + CASE(ZEND_FETCH_OBJ_W); + CASE(ZEND_FETCH_RW); + CASE(ZEND_FETCH_DIM_RW); + CASE(ZEND_FETCH_OBJ_RW); + CASE(ZEND_FETCH_IS); + CASE(ZEND_FETCH_DIM_IS); + CASE(ZEND_FETCH_OBJ_IS); + CASE(ZEND_FETCH_FUNC_ARG); + CASE(ZEND_FETCH_DIM_FUNC_ARG); + CASE(ZEND_FETCH_OBJ_FUNC_ARG); + CASE(ZEND_FETCH_UNSET); + CASE(ZEND_FETCH_DIM_UNSET); + CASE(ZEND_FETCH_OBJ_UNSET); + CASE(ZEND_FETCH_DIM_TMP_VAR); + CASE(ZEND_FETCH_CONSTANT); + CASE(ZEND_GOTO); + CASE(ZEND_EXT_STMT); + CASE(ZEND_EXT_FCALL_BEGIN); + CASE(ZEND_EXT_FCALL_END); + CASE(ZEND_EXT_NOP); + CASE(ZEND_TICKS); + CASE(ZEND_SEND_VAR_NO_REF); + CASE(ZEND_CATCH); + CASE(ZEND_THROW); + CASE(ZEND_FETCH_CLASS); + CASE(ZEND_CLONE); + CASE(ZEND_RETURN_BY_REF); + CASE(ZEND_INIT_METHOD_CALL); + CASE(ZEND_INIT_STATIC_METHOD_CALL); + CASE(ZEND_ISSET_ISEMPTY_VAR); + CASE(ZEND_ISSET_ISEMPTY_DIM_OBJ); + CASE(ZEND_PRE_INC_OBJ); + CASE(ZEND_PRE_DEC_OBJ); + CASE(ZEND_POST_INC_OBJ); + CASE(ZEND_POST_DEC_OBJ); + CASE(ZEND_ASSIGN_OBJ); + CASE(ZEND_INSTANCEOF); + CASE(ZEND_DECLARE_CLASS); + CASE(ZEND_DECLARE_INHERITED_CLASS); + CASE(ZEND_DECLARE_FUNCTION); + CASE(ZEND_RAISE_ABSTRACT_ERROR); + CASE(ZEND_DECLARE_CONST); + CASE(ZEND_ADD_INTERFACE); + CASE(ZEND_DECLARE_INHERITED_CLASS_DELAYED); + CASE(ZEND_VERIFY_ABSTRACT_CLASS); + CASE(ZEND_ASSIGN_DIM); + CASE(ZEND_ISSET_ISEMPTY_PROP_OBJ); + CASE(ZEND_HANDLE_EXCEPTION); + CASE(ZEND_USER_OPCODE); +#ifdef ZEND_JMP_SET + CASE(ZEND_JMP_SET); +#endif + CASE(ZEND_DECLARE_LAMBDA_FUNCTION); +#ifdef ZEND_ADD_TRAIT + CASE(ZEND_ADD_TRAIT); +#endif +#ifdef ZEND_BIND_TRAITS + CASE(ZEND_BIND_TRAITS); +#endif +#ifdef ZEND_SEPARATE + CASE(ZEND_SEPARATE); +#endif +#ifdef ZEND_QM_ASSIGN_VAR + CASE(ZEND_QM_ASSIGN_VAR); +#endif +#ifdef ZEND_JMP_SET_VAR + CASE(ZEND_JMP_SET_VAR); +#endif + CASE(ZEND_DISCARD_EXCEPTION); + CASE(ZEND_YIELD); + CASE(ZEND_GENERATOR_RETURN); +#ifdef ZEND_FAST_CALL + CASE(ZEND_FAST_CALL); +#endif +#ifdef ZEND_FAST_RET + CASE(ZEND_FAST_RET); +#endif +#ifdef ZEND_RECV_VARIADIC + CASE(ZEND_RECV_VARIADIC); +#endif + CASE(ZEND_OP_DATA); + default: return "UNKNOWN"; + } +} /* }}} */ diff --git a/phpdbg_opcode.h b/phpdbg_opcode.h new file mode 100644 index 00000000000..28fc806c1c0 --- /dev/null +++ b/phpdbg_opcode.h @@ -0,0 +1,27 @@ +/* + +----------------------------------------------------------------------+ + | PHP Version 5 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997-2013 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 3.01 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | http://www.php.net/license/3_01.txt | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Authors: Felipe Pena | + | Authors: Joe Watkins | + +----------------------------------------------------------------------+ +*/ + +#ifndef PHPDBG_OPCODE_H +#define PHPDBG_OPCODE_H + +#include "zend_types.h" + +const char *phpdbg_decode_opcode(zend_uchar); + +#endif /* PHPDBG_OPCODE_H */ diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index dee88d2534f..cd432fbf612 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -24,6 +24,7 @@ #include "phpdbg.h" #include "phpdbg_help.h" #include "phpdbg_bp.h" +#include "phpdbg_opcode.h" static const phpdbg_command_t phpdbg_prompt_commands[]; @@ -333,184 +334,10 @@ int phpdbg_interactive(int argc, char **argv TSRMLS_DC) /* {{{ */ return SUCCESS; } /* }}} */ -static const char *phpdbg_decode_opcode(zend_uchar opcode TSRMLS_DC) { /* {{{ */ - switch (opcode) { - case ZEND_NOP: return "ZEND_NOP"; - case ZEND_ADD: return "ZEND_ADD"; - case ZEND_SUB: return "ZEND_SUB"; - case ZEND_MUL: return "ZEND_MUL"; - case ZEND_DIV: return "ZEND_DIV"; - case ZEND_MOD: return "ZEND_MOD"; - case ZEND_SL: return "ZEND_SL"; - case ZEND_SR: return "ZEND_SR"; - case ZEND_CONCAT: return "ZEND_CONCAT"; - case ZEND_BW_OR: return "ZEND_BW_OR"; - case ZEND_BW_AND: return "ZEND_BW_AND"; - case ZEND_BW_XOR: return "ZEND_BW_XOR"; - case ZEND_BW_NOT: return "ZEND_BW_NOT"; - case ZEND_BOOL_NOT: return "ZEND_BOOL_NOT"; - case ZEND_BOOL_XOR: return "ZEND_BOOL_XOR"; - case ZEND_IS_IDENTICAL: return "ZEND_IS_IDENTICAL"; - case ZEND_IS_NOT_IDENTICAL: return "ZEND_IS_NOT_IDENTICAL"; - case ZEND_IS_EQUAL: return "ZEND_IS_EQUAL"; - case ZEND_IS_NOT_EQUAL: return "ZEND_IS_NOT_EQUAL"; - case ZEND_IS_SMALLER: return "ZEND_IS_SMALLER"; - case ZEND_IS_SMALLER_OR_EQUAL: return "ZEND_IS_SMALLER_OR_EQUAL"; - case ZEND_CAST: return "ZEND_CAST"; - case ZEND_QM_ASSIGN: return "ZEND_QM_ASSIGN"; - case ZEND_ASSIGN_ADD: return "ZEND_ASSIGN_ADD"; - case ZEND_ASSIGN_SUB: return "ZEND_ASSIGN_SUB"; - case ZEND_ASSIGN_MUL: return "ZEND_ASSIGN_MUL"; - case ZEND_ASSIGN_DIV: return "ZEND_ASSIGN_DIV"; - case ZEND_ASSIGN_MOD: return "ZEND_ASSIGN_MOD"; - case ZEND_ASSIGN_SL: return "ZEND_ASSIGN_SL"; - case ZEND_ASSIGN_SR: return "ZEND_ASSIGN_SR"; - case ZEND_ASSIGN_CONCAT: return "ZEND_ASSIGN_CONCAT"; - case ZEND_ASSIGN_BW_OR: return "ZEND_ASSIGN_BW_OR"; - case ZEND_ASSIGN_BW_AND: return "ZEND_ASSIGN_BW_AND"; - case ZEND_ASSIGN_BW_XOR: return "ZEND_ASSIGN_BW_XOR"; - case ZEND_PRE_INC: return "ZEND_PRE_INC"; - case ZEND_PRE_DEC: return "ZEND_PRE_DEC"; - case ZEND_POST_INC: return "ZEND_POST_INC"; - case ZEND_POST_DEC: return "ZEND_POST_DEC"; - case ZEND_ASSIGN: return "ZEND_ASSIGN"; - case ZEND_ASSIGN_REF: return "ZEND_ASSIGN_REF"; - case ZEND_ECHO: return "ZEND_ECHO"; - case ZEND_PRINT: return "ZEND_PRINT"; - case ZEND_JMP: return "ZEND_JMP"; - case ZEND_JMPZ: return "ZEND_JMPZ"; - case ZEND_JMPNZ: return "ZEND_JMPNZ"; - case ZEND_JMPZNZ: return "ZEND_JMPZNZ"; - case ZEND_JMPZ_EX: return "ZEND_JMPZ_EX"; - case ZEND_JMPNZ_EX: return "ZEND_JMPNZ_EX"; - case ZEND_CASE: return "ZEND_CASE"; - case ZEND_SWITCH_FREE: return "ZEND_SWITCH_FREE"; - case ZEND_BRK: return "ZEND_BRK"; - case ZEND_CONT: return "ZEND_CONT"; - case ZEND_BOOL: return "ZEND_BOOL"; - case ZEND_INIT_STRING: return "ZEND_INIT_STRING"; - case ZEND_ADD_CHAR: return "ZEND_ADD_CHAR"; - case ZEND_ADD_STRING: return "ZEND_ADD_STRING"; - case ZEND_ADD_VAR: return "ZEND_ADD_VAR"; - case ZEND_BEGIN_SILENCE: return "ZEND_BEGIN_SILENCE"; - case ZEND_END_SILENCE: return "ZEND_END_SILENCE"; - case ZEND_INIT_FCALL_BY_NAME: return "ZEND_INIT_FCALL_BY_NAME"; - case ZEND_DO_FCALL: return "ZEND_DO_FCALL"; - case ZEND_DO_FCALL_BY_NAME: return "ZEND_DO_FCALL_BY_NAME"; - case ZEND_RETURN: return "ZEND_RETURN"; - case ZEND_RECV: return "ZEND_RECV"; - case ZEND_RECV_INIT: return "ZEND_RECV_INIT"; - case ZEND_SEND_VAL: return "ZEND_SEND_VAL"; - case ZEND_SEND_VAR: return "ZEND_SEND_VAR"; - case ZEND_SEND_REF: return "ZEND_SEND_REF"; - case ZEND_NEW: return "ZEND_NEW"; - case ZEND_INIT_NS_FCALL_BY_NAME: return "ZEND_INIT_NS_FCALL_BY_NAME"; - case ZEND_FREE: return "ZEND_FREE"; - case ZEND_INIT_ARRAY: return "ZEND_INIT_ARRAY"; - case ZEND_ADD_ARRAY_ELEMENT: return "ZEND_ADD_ARRAY_ELEMENT"; - case ZEND_INCLUDE_OR_EVAL: return "ZEND_INCLUDE_OR_EVAL"; - case ZEND_UNSET_VAR: return "ZEND_UNSET_VAR"; - case ZEND_UNSET_DIM: return "ZEND_UNSET_DIM"; - case ZEND_UNSET_OBJ: return "ZEND_UNSET_OBJ"; - case ZEND_FE_RESET: return "ZEND_FE_RESET"; - case ZEND_FE_FETCH: return "ZEND_FE_FETCH"; - case ZEND_EXIT: return "ZEND_EXIT"; - case ZEND_FETCH_R: return "ZEND_FETCH_R"; - case ZEND_FETCH_DIM_R: return "ZEND_FETCH_DIM_R"; - case ZEND_FETCH_OBJ_R: return "ZEND_FETCH_OBJ_R"; - case ZEND_FETCH_W: return "ZEND_FETCH_W"; - case ZEND_FETCH_DIM_W: return "ZEND_FETCH_DIM_W"; - case ZEND_FETCH_OBJ_W: return "ZEND_FETCH_OBJ_W"; - case ZEND_FETCH_RW: return "ZEND_FETCH_RW"; - case ZEND_FETCH_DIM_RW: return "ZEND_FETCH_DIM_RW"; - case ZEND_FETCH_OBJ_RW: return "ZEND_FETCH_OBJ_RW"; - case ZEND_FETCH_IS: return "ZEND_FETCH_IS"; - case ZEND_FETCH_DIM_IS: return "ZEND_FETCH_DIM_IS"; - case ZEND_FETCH_OBJ_IS: return "ZEND_FETCH_OBJ_IS"; - case ZEND_FETCH_FUNC_ARG: return "ZEND_FETCH_FUNC_ARG"; - case ZEND_FETCH_DIM_FUNC_ARG: return "ZEND_FETCH_DIM_FUNC_ARG"; - case ZEND_FETCH_OBJ_FUNC_ARG: return "ZEND_FETCH_OBJ_FUNC_ARG"; - case ZEND_FETCH_UNSET: return "ZEND_FETCH_UNSET"; - case ZEND_FETCH_DIM_UNSET: return "ZEND_FETCH_DIM_UNSET"; - case ZEND_FETCH_OBJ_UNSET: return "ZEND_FETCH_OBJ_UNSET"; - case ZEND_FETCH_DIM_TMP_VAR: return "ZEND_FETCH_DIM_TMP_VAR"; - case ZEND_FETCH_CONSTANT: return "ZEND_FETCH_CONSTANT"; - case ZEND_GOTO: return "ZEND_GOTO"; - case ZEND_EXT_STMT: return "ZEND_EXT_STMT"; - case ZEND_EXT_FCALL_BEGIN: return "ZEND_EXT_FCALL_BEGIN"; - case ZEND_EXT_FCALL_END: return "ZEND_EXT_FCALL_END"; - case ZEND_EXT_NOP: return "ZEND_EXT_NOP"; - case ZEND_TICKS: return "ZEND_TICKS"; - case ZEND_SEND_VAR_NO_REF: return "ZEND_SEND_VAR_NO_REF"; - case ZEND_CATCH: return "ZEND_CATCH"; - case ZEND_THROW: return "ZEND_THROW"; - case ZEND_FETCH_CLASS: return "ZEND_FETCH_CLASS"; - case ZEND_CLONE: return "ZEND_CLONE"; - case ZEND_RETURN_BY_REF: return "ZEND_RETURN_BY_REF"; - case ZEND_INIT_METHOD_CALL: return "ZEND_INIT_METHOD_CALL"; - case ZEND_INIT_STATIC_METHOD_CALL: return "ZEND_INIT_STATIC_METHOD_CALL"; - case ZEND_ISSET_ISEMPTY_VAR: return "ZEND_ISSET_ISEMPTY_VAR"; - case ZEND_ISSET_ISEMPTY_DIM_OBJ: return "ZEND_ISSET_ISEMPTY_DIM_OBJ"; - case ZEND_PRE_INC_OBJ: return "ZEND_PRE_INC_OBJ"; - case ZEND_PRE_DEC_OBJ: return "ZEND_PRE_DEC_OBJ"; - case ZEND_POST_INC_OBJ: return "ZEND_POST_INC_OBJ"; - case ZEND_POST_DEC_OBJ: return "ZEND_POST_DEC_OBJ"; - case ZEND_ASSIGN_OBJ: return "ZEND_ASSIGN_OBJ"; - case ZEND_INSTANCEOF: return "ZEND_INSTANCEOF"; - case ZEND_DECLARE_CLASS: return "ZEND_DECLARE_CLASS"; - case ZEND_DECLARE_INHERITED_CLASS: return "ZEND_DECLARE_INHERITED_CLASS"; - case ZEND_DECLARE_FUNCTION: return "ZEND_DECLARE_FUNCTION"; - case ZEND_RAISE_ABSTRACT_ERROR: return "ZEND_RAISE_ABSTRACT_ERROR"; - case ZEND_DECLARE_CONST: return "ZEND_DECLARE_CONST"; - case ZEND_ADD_INTERFACE: return "ZEND_ADD_INTERFACE"; - case ZEND_DECLARE_INHERITED_CLASS_DELAYED: return "ZEND_DECLARE_INHERITED_CLASS_DELAYED"; - case ZEND_VERIFY_ABSTRACT_CLASS: return "ZEND_VERIFY_ABSTRACT_CLASS"; - case ZEND_ASSIGN_DIM: return "ZEND_ASSIGN_DIM"; - case ZEND_ISSET_ISEMPTY_PROP_OBJ: return "ZEND_ISSET_ISEMPTY_PROP_OBJ"; - case ZEND_HANDLE_EXCEPTION: return "ZEND_HANDLE_EXCEPTION"; - case ZEND_USER_OPCODE: return "ZEND_USER_OPCODE"; -#ifdef ZEND_JMP_SET - case ZEND_JMP_SET: return "ZEND_JMP_SET"; -#endif - case ZEND_DECLARE_LAMBDA_FUNCTION: return "ZEND_DECLARE_LAMBDA_FUNCTION"; -#ifdef ZEND_ADD_TRAIT - case ZEND_ADD_TRAIT: return "ZEND_ADD_TRAIT"; -#endif -#ifdef ZEND_BIND_TRAITS - case ZEND_BIND_TRAITS: return "ZEND_BIND_TRAITS"; -#endif -#ifdef ZEND_SEPARATE - case ZEND_SEPARATE: return "ZEND_SEPARATE"; -#endif -#ifdef ZEND_QM_ASSIGN_VAR - case ZEND_QM_ASSIGN_VAR: return "ZEND_QM_ASSIGN_VAR"; -#endif -#ifdef ZEND_JMP_SET_VAR - case ZEND_JMP_SET_VAR: return "ZEND_JMP_SET_VAR"; -#endif - case ZEND_DISCARD_EXCEPTION: return "ZEND_DISCARD_EXCEPTION"; - case ZEND_YIELD: return "ZEND_YIELD"; - case ZEND_GENERATOR_RETURN: return "ZEND_GENERATOR_RETURN"; -#ifdef ZEND_FAST_CALL - case ZEND_FAST_CALL: return "ZEND_FAST_CALL"; -#endif -#ifdef ZEND_FAST_RET - case ZEND_FAST_RET: return "ZEND_FAST_RET"; -#endif -#ifdef ZEND_RECV_VARIADIC - case ZEND_RECV_VARIADIC: return "ZEND_RECV_VARIADIC"; -#endif - case ZEND_OP_DATA: return "ZEND_OP_DATA"; - - default: return "UNKNOWN"; - } -} /* }}} */ - static void phpdbg_print_opline(zend_execute_data *execute_data TSRMLS_DC) { /* {{{ */ zend_op *opline = execute_data->opline; - printf( - "[OPLINE: %p:%s]\n", opline, phpdbg_decode_opcode(opline->opcode TSRMLS_CC)); + printf("[OPLINE: %p:%s]\n", opline, phpdbg_decode_opcode(opline->opcode)); } /* }}} */ void phpdbg_execute_ex(zend_execute_data *execute_data TSRMLS_DC) /* {{{ */ From 5b6982796d6d535ec868b3e07585d44423b725dc Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 10 Nov 2013 18:06:19 -0200 Subject: [PATCH 055/771] - Renamed breakpoint find functions --- phpdbg_bp.c | 4 ++-- phpdbg_bp.h | 3 +++ phpdbg_prompt.c | 9 +++++---- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/phpdbg_bp.c b/phpdbg_bp.c index a531f4f1af3..2db30d33663 100644 --- a/phpdbg_bp.c +++ b/phpdbg_bp.c @@ -103,7 +103,7 @@ void phpdbg_set_breakpoint_symbol(const char *expr, const char *opline_num_pos T zend_llist_add_element(break_sym_ptr, &new_break); } /* }}} */ -int phpdbg_breakpoint_file(zend_op_array *op_array TSRMLS_DC) /* {{{ */ +int phpdbg_find_breakpoint_file(zend_op_array *op_array TSRMLS_DC) /* {{{ */ { size_t name_len = strlen(op_array->filename); zend_llist *break_list; @@ -126,7 +126,7 @@ int phpdbg_breakpoint_file(zend_op_array *op_array TSRMLS_DC) /* {{{ */ return FAILURE; } /* }}} */ -int phpdbg_breakpoint_symbol(zend_function *fbc TSRMLS_DC) /* {{{ */ +int phpdbg_find_breakpoint_symbol(zend_function *fbc TSRMLS_DC) /* {{{ */ { const char *fname; zend_llist *break_list; diff --git a/phpdbg_bp.h b/phpdbg_bp.h index c6d057c2806..e8cb84b92e6 100644 --- a/phpdbg_bp.h +++ b/phpdbg_bp.h @@ -41,4 +41,7 @@ typedef struct _phpdbg_breaksymbol_t { void phpdbg_set_breakpoint_file(const char*, const char* TSRMLS_DC); void phpdbg_set_breakpoint_symbol(const char*, const char* TSRMLS_DC); +int phpdbg_find_breakpoint_file(zend_op_array* TSRMLS_DC); +int phpdbg_find_breakpoint_symbol(zend_function* TSRMLS_DC); + #endif /* PHPDBG_BP_H */ diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index cd432fbf612..fc559dd2df5 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -254,7 +254,7 @@ static PHPDBG_COMMAND(help) /* {{{ */ ++help_command; } } else { - if (phpdbg_do_cmd(phpdbg_help_commands, expr, expr_len TSRMLS_CC) == FAILURE) { + if (phpdbg_do_cmd(phpdbg_help_commands, (char*)expr, expr_len TSRMLS_CC) == FAILURE) { printf("failed to find help command: %s\n", expr); } } @@ -334,7 +334,8 @@ int phpdbg_interactive(int argc, char **argv TSRMLS_DC) /* {{{ */ return SUCCESS; } /* }}} */ -static void phpdbg_print_opline(zend_execute_data *execute_data TSRMLS_DC) { /* {{{ */ +static void phpdbg_print_opline(zend_execute_data *execute_data TSRMLS_DC) /* {{{ */ +{ zend_op *opline = execute_data->opline; printf("[OPLINE: %p:%s]\n", opline, phpdbg_decode_opcode(opline->opcode)); @@ -361,7 +362,7 @@ zend_vm_enter: phpdbg_print_opline(execute_data TSRMLS_CC); if (PHPDBG_G(has_file_bp) - && phpdbg_breakpoint_file(execute_data->op_array TSRMLS_CC) == SUCCESS) { + && phpdbg_find_breakpoint_file(execute_data->op_array TSRMLS_CC) == SUCCESS) { while (phpdbg_interactive(0, NULL TSRMLS_CC) != PHPDBG_NEXT) { continue; } @@ -369,7 +370,7 @@ zend_vm_enter: if (PHPDBG_G(has_sym_bp) && (execute_data->opline->opcode == ZEND_DO_FCALL || execute_data->opline->opcode == ZEND_DO_FCALL_BY_NAME) - && phpdbg_breakpoint_symbol(execute_data->function_state.function TSRMLS_CC) == SUCCESS) { + && phpdbg_find_breakpoint_symbol(execute_data->function_state.function TSRMLS_CC) == SUCCESS) { while (phpdbg_interactive(0, NULL TSRMLS_CC) != PHPDBG_NEXT) { continue; } From 972550a1206f02bc3fa6774c1ce740704729e8b0 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 10 Nov 2013 18:07:56 -0200 Subject: [PATCH 056/771] - Change header inclusion order --- phpdbg_opcode.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpdbg_opcode.c b/phpdbg_opcode.c index b77cfb730bd..60d40756254 100644 --- a/phpdbg_opcode.c +++ b/phpdbg_opcode.c @@ -17,8 +17,8 @@ +----------------------------------------------------------------------+ */ -#include "phpdbg_opcode.h" #include "zend_vm_opcodes.h" +#include "phpdbg_opcode.h" const char *phpdbg_decode_opcode(zend_uchar opcode) /* {{{ */ { From eaf5d892928f7ca4af42cdd98bfb9f0f9adc06d3 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 10 Nov 2013 18:10:54 -0200 Subject: [PATCH 057/771] - Change breakpoint id to int --- phpdbg.h | 2 +- phpdbg_bp.c | 1 + phpdbg_bp.h | 4 ++-- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/phpdbg.h b/phpdbg.h index c2f949bc899..c5f6104cefb 100644 --- a/phpdbg.h +++ b/phpdbg.h @@ -51,7 +51,7 @@ ZEND_BEGIN_MODULE_GLOBALS(phpdbg) size_t exec_len; /* size of exec */ zend_op_array *ops; /* op_array */ zval *retval; /* return value */ - size_t bp_count; /* breakpoint count */ + int bp_count; /* breakpoint count */ int stepping; /* stepping */ int vmret; /* return from last opcode handler execution */ zend_bool has_file_bp; /* file-based breakpoint has been set */ diff --git a/phpdbg_bp.c b/phpdbg_bp.c index 2db30d33663..7114ff0530c 100644 --- a/phpdbg_bp.c +++ b/phpdbg_bp.c @@ -19,6 +19,7 @@ #include "zend.h" #include "zend_hash.h" +#include "zend_llist.h" #include "phpdbg.h" #include "phpdbg_bp.h" diff --git a/phpdbg_bp.h b/phpdbg_bp.h index e8cb84b92e6..38b9c6174c6 100644 --- a/phpdbg_bp.h +++ b/phpdbg_bp.h @@ -26,7 +26,7 @@ typedef struct _phpdbg_breakfile_t { const char *filename; long line; - size_t id; + int id; } phpdbg_breakfile_t; /** @@ -35,7 +35,7 @@ typedef struct _phpdbg_breakfile_t { typedef struct _phpdbg_breaksymbol_t { const char *symbol; long opline_num; - size_t id; + int id; } phpdbg_breaksymbol_t; void phpdbg_set_breakpoint_file(const char*, const char* TSRMLS_DC); From 341468055759c4cd0247b460536d25a44a11551b Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 10 Nov 2013 18:24:13 -0200 Subject: [PATCH 058/771] - Improved phpdbg_set_breakpoint_file function --- phpdbg_bp.c | 20 +++++--------------- phpdbg_bp.h | 2 +- phpdbg_prompt.c | 12 +++++++++++- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/phpdbg_bp.c b/phpdbg_bp.c index 7114ff0530c..5229a0b7b55 100644 --- a/phpdbg_bp.c +++ b/phpdbg_bp.c @@ -39,36 +39,26 @@ static void phpdbg_llist_breaksym_dtor(void *data) /* {{{ */ efree((char*)bp->symbol); } /* }}} */ -void phpdbg_set_breakpoint_file(const char *expr, const char *line_pos TSRMLS_DC) /* {{{ */ +void phpdbg_set_breakpoint_file(const char *path, long line_num TSRMLS_DC) /* {{{ */ { - char resolved_name[MAXPATHLEN]; - long line_num = strtol(line_pos+1, NULL, 0); phpdbg_breakfile_t new_break; zend_llist *break_files_ptr; - size_t name_len; - char *path = estrndup(expr, line_pos - expr); + size_t path_len = strlen(path); - if (expand_filepath(path, resolved_name TSRMLS_CC) == NULL) { - efree(path); - return; - } - efree(path); - - name_len = strlen(resolved_name); - new_break.filename = estrndup(resolved_name, name_len + 1); + new_break.filename = estrndup(path, path_len + 1); new_break.line = line_num; PHPDBG_G(has_file_bp) = 1; if (zend_hash_find(&PHPDBG_G(bp_files), - new_break.filename, name_len, (void**)&break_files_ptr) == FAILURE) { + new_break.filename, path_len, (void**)&break_files_ptr) == FAILURE) { zend_llist break_files; zend_llist_init(&break_files, sizeof(phpdbg_breakfile_t), phpdbg_llist_breakfile_dtor, 0); zend_hash_update(&PHPDBG_G(bp_files), - new_break.filename, name_len, &break_files, sizeof(zend_llist), + new_break.filename, path_len, &break_files, sizeof(zend_llist), (void**)&break_files_ptr); } diff --git a/phpdbg_bp.h b/phpdbg_bp.h index 38b9c6174c6..49035be550c 100644 --- a/phpdbg_bp.h +++ b/phpdbg_bp.h @@ -38,7 +38,7 @@ typedef struct _phpdbg_breaksymbol_t { int id; } phpdbg_breaksymbol_t; -void phpdbg_set_breakpoint_file(const char*, const char* TSRMLS_DC); +void phpdbg_set_breakpoint_file(const char*, long TSRMLS_DC); void phpdbg_set_breakpoint_symbol(const char*, const char* TSRMLS_DC); int phpdbg_find_breakpoint_file(zend_op_array* TSRMLS_DC); diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index fc559dd2df5..5e3b968b9f2 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -213,7 +213,17 @@ static PHPDBG_COMMAND(break) /* {{{ */ const char *line_pos = zend_memrchr(expr, ':', expr_len); if (line_pos) { - phpdbg_set_breakpoint_file(expr, line_pos TSRMLS_CC); + char path[MAXPATHLEN], resolved_name[MAXPATHLEN]; + long line_num = strtol(line_pos+1, NULL, 0); + + memcpy(path, expr, line_pos - expr); + path[line_pos - expr] = 0; + + if (expand_filepath(path, resolved_name TSRMLS_CC) == NULL) { + return FAILURE; + } + + phpdbg_set_breakpoint_file(resolved_name, line_num TSRMLS_CC); } else { const char *opline_num_pos = zend_memrchr(expr, '#', expr_len); From fb4f94c52c81fc7be5b16d814c362de310deff38 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 10 Nov 2013 18:30:24 -0200 Subject: [PATCH 059/771] - Improved phpdbg_set_breakpoint_symbol function --- phpdbg_bp.c | 7 +++---- phpdbg_bp.h | 2 +- phpdbg_prompt.c | 10 ++++++++-- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/phpdbg_bp.c b/phpdbg_bp.c index 5229a0b7b55..9085533c0ca 100644 --- a/phpdbg_bp.c +++ b/phpdbg_bp.c @@ -66,14 +66,13 @@ void phpdbg_set_breakpoint_file(const char *path, long line_num TSRMLS_DC) /* {{ zend_llist_add_element(break_files_ptr, &new_break); } /* }}} */ -void phpdbg_set_breakpoint_symbol(const char *expr, const char *opline_num_pos TSRMLS_DC) /* {{{ */ +void phpdbg_set_breakpoint_symbol(const char *name, long opline_num TSRMLS_DC) /* {{{ */ { - long opline_num = opline_num_pos ? strtol(opline_num_pos+1, NULL, 0) : 0; phpdbg_breaksymbol_t new_break; zend_llist *break_sym_ptr; - size_t name_len = opline_num_pos ? opline_num_pos - expr : strlen(expr); + size_t name_len = strlen(name); - new_break.symbol = estrndup(expr, name_len); + new_break.symbol = estrndup(name, name_len + 1); new_break.opline_num = opline_num; PHPDBG_G(has_sym_bp) = 1; diff --git a/phpdbg_bp.h b/phpdbg_bp.h index 49035be550c..45f4239eafd 100644 --- a/phpdbg_bp.h +++ b/phpdbg_bp.h @@ -39,7 +39,7 @@ typedef struct _phpdbg_breaksymbol_t { } phpdbg_breaksymbol_t; void phpdbg_set_breakpoint_file(const char*, long TSRMLS_DC); -void phpdbg_set_breakpoint_symbol(const char*, const char* TSRMLS_DC); +void phpdbg_set_breakpoint_symbol(const char*, long TSRMLS_DC); int phpdbg_find_breakpoint_file(zend_op_array* TSRMLS_DC); int phpdbg_find_breakpoint_symbol(zend_function* TSRMLS_DC); diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 5e3b968b9f2..8591d02945a 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -225,9 +225,15 @@ static PHPDBG_COMMAND(break) /* {{{ */ phpdbg_set_breakpoint_file(resolved_name, line_num TSRMLS_CC); } else { - const char *opline_num_pos = zend_memrchr(expr, '#', expr_len); + char name[200]; + const char *opnum_pos = zend_memrchr(expr, '#', expr_len); + long opline_num = opnum_pos ? strtol(opnum_pos+1, NULL, 0) : 0; + size_t name_len = opnum_pos ? opnum_pos - expr : strlen(expr); - phpdbg_set_breakpoint_symbol(expr, opline_num_pos TSRMLS_CC); + memcpy(name, expr, name_len); + name[name_len] = 0; + + phpdbg_set_breakpoint_symbol(name, opline_num TSRMLS_CC); } return SUCCESS; From ac0ecc476c6b5a562b98026acc76390c2597392b Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 10 Nov 2013 19:00:58 -0200 Subject: [PATCH 060/771] - Fix code --- phpdbg_opcode.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/phpdbg_opcode.c b/phpdbg_opcode.c index 60d40756254..5796678cad1 100644 --- a/phpdbg_opcode.c +++ b/phpdbg_opcode.c @@ -18,11 +18,12 @@ */ #include "zend_vm_opcodes.h" +#include "zend_compile.h" #include "phpdbg_opcode.h" const char *phpdbg_decode_opcode(zend_uchar opcode) /* {{{ */ { -#define CASE(s) return #s +#define CASE(s) case s: return #s switch (opcode) { CASE(ZEND_NOP); CASE(ZEND_ADD); From 05c9f82a159a674f9ccf2178c05d2e84c78963e9 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 20:59:35 +0000 Subject: [PATCH 061/771] ... --- phpdbg.c | 4 +++- phpdbg_prompt.c | 29 ++++++++++++++++++----------- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/phpdbg.c b/phpdbg.c index feed5ecd398..c15c718b9d1 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -241,7 +241,9 @@ int main(int argc, char **argv) /* {{{ */ } zend_end_try(); zend_try { - phpdbg_interactive(argc, argv TSRMLS_CC); + do { + phpdbg_interactive(argc, argv TSRMLS_CC); + } while(!PHPDBG_G(quitting)); } zend_end_try(); if (ini_file) { diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 6a43d0edf79..9ef5ecfd358 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -59,7 +59,7 @@ static inline int phpdbg_compile(TSRMLS_D) /* {{{ */ printf("Attempting compilation of %s\n", PHPDBG_G(exec)); if (php_stream_open_for_zend_ex(PHPDBG_G(exec), &fh, - USE_PATH|STREAM_OPEN_FOR_INCLUDE TSRMLS_CC) == SUCCESS) { + USE_PATH|STREAM_OPEN_FOR_INCLUDE TSRMLS_CC) == SUCCESS) { PHPDBG_G(ops) = zend_compile_file(&fh, ZEND_INCLUDE TSRMLS_CC); zend_destroy_file_handle(&fh TSRMLS_CC); printf("Success\n"); @@ -335,9 +335,8 @@ int phpdbg_interactive(int argc, char **argv TSRMLS_DC) /* {{{ */ } break; - case PHPDBG_NEXT: if (PHPDBG_G(stepping)) { + case PHPDBG_NEXT: return PHPDBG_NEXT; - } } } @@ -375,20 +374,28 @@ zend_vm_enter: } #endif - if (PHPDBG_G(has_file_bp) + if (PHPDBG_G(has_file_bp) && phpdbg_find_breakpoint_file(execute_data->op_array TSRMLS_CC) == SUCCESS) { while (phpdbg_interactive(0, NULL TSRMLS_CC) != PHPDBG_NEXT) { continue; } } - if (PHPDBG_G(has_sym_bp) - && (execute_data->opline->opcode == ZEND_DO_FCALL || execute_data->opline->opcode == ZEND_DO_FCALL_BY_NAME) - && phpdbg_find_breakpoint_symbol(execute_data->function_state.function TSRMLS_CC) == SUCCESS) { - while (phpdbg_interactive(0, NULL TSRMLS_CC) != PHPDBG_NEXT) { - continue; - } - } + if (PHPDBG_G(has_sym_bp)) { + zend_execute_data *previous = execute_data->prev_execute_data; + if (previous && (previous != execute_data)) { + if (previous->opline) { + if (previous->opline->opcode == ZEND_DO_FCALL || previous->opline->opcode == ZEND_DO_FCALL_BY_NAME) { + if (phpdbg_find_breakpoint_symbol(previous->function_state.function TSRMLS_CC) == SUCCESS) { + while (phpdbg_interactive(0, NULL TSRMLS_CC) != PHPDBG_NEXT) { + continue; + } + printf("out\n"); + } + } + } + } + } PHPDBG_G(vmret) = execute_data->opline->handler(execute_data TSRMLS_CC); From 6203c96061501091ba6851fca655c5c02252581d Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 21:07:29 +0000 Subject: [PATCH 062/771] ... --- phpdbg_prompt.c | 29 ++++++++++++++++++----------- test.php | 3 +++ 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 9ef5ecfd358..483835f4b96 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -56,17 +56,23 @@ static inline int phpdbg_compile(TSRMLS_D) /* {{{ */ { zend_file_handle fh; - printf("Attempting compilation of %s\n", PHPDBG_G(exec)); - - if (php_stream_open_for_zend_ex(PHPDBG_G(exec), &fh, - USE_PATH|STREAM_OPEN_FOR_INCLUDE TSRMLS_CC) == SUCCESS) { - PHPDBG_G(ops) = zend_compile_file(&fh, ZEND_INCLUDE TSRMLS_CC); - zend_destroy_file_handle(&fh TSRMLS_CC); - printf("Success\n"); - return SUCCESS; - } - - printf("Could not open file %s\n", PHPDBG_G(exec)); + if (!EG(in_execution)) { + printf("Attempting compilation of %s\n", PHPDBG_G(exec)); + + if (php_stream_open_for_zend_ex(PHPDBG_G(exec), &fh, + USE_PATH|STREAM_OPEN_FOR_INCLUDE TSRMLS_CC) == SUCCESS) { + PHPDBG_G(ops) = zend_compile_file( + &fh, ZEND_INCLUDE TSRMLS_CC); + zend_destroy_file_handle(&fh TSRMLS_CC); + printf("Success\n"); + return SUCCESS; + } else { + printf("Could not open file %s\n", PHPDBG_G(exec)); + } + } else { + printf("Cannot compile while in execution\n"); + } + return FAILURE; } /* }}} */ @@ -77,6 +83,7 @@ static PHPDBG_COMMAND(compile) /* {{{ */ printf("Destroying compiled opcodes\n"); destroy_op_array(PHPDBG_G(ops) TSRMLS_CC); efree(PHPDBG_G(ops)); + PHPDBG_G(ops)=NULL; } return phpdbg_compile(TSRMLS_C); diff --git a/test.php b/test.php index d67540e1ed9..a433605823b 100644 --- a/test.php +++ b/test.php @@ -2,6 +2,9 @@ function test() { echo "Hello World\n"; } +function test2() { + echo "Hello World 2\n"; +} if (!isset($greeting)) { echo test(); } From 1591b0e5f6c495f29e0f2394505e62300dfe512a Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 21:09:35 +0000 Subject: [PATCH 063/771] remove cont --- phpdbg_help.c | 9 +-------- phpdbg_help.h | 4 +--- phpdbg_prompt.c | 8 +------- 3 files changed, 3 insertions(+), 18 deletions(-) diff --git a/phpdbg_help.c b/phpdbg_help.c index 370c15eba0f..f1e7cc7568d 100644 --- a/phpdbg_help.c +++ b/phpdbg_help.c @@ -41,7 +41,7 @@ PHPDBG_HELP(step) /* {{{ */ PHPDBG_HELP(next) /* {{{ */ { - printf("While stepping through execution, use the next command to step back into the vm and execute the next opcode"); + printf("While stepping through execution, or after a breakpoint, use the next command to step back into the vm and execute the next opcode\n"); return SUCCESS; } /* }}} */ @@ -91,13 +91,6 @@ PHPDBG_HELP(break) /* {{{ */ return SUCCESS; } /* }}} */ -PHPDBG_HELP(cont) /* {{{ */ -{ - printf("Continues execution after a breakpoint is met\n"); - printf("[Warnings about using stepping and break points here]\n"); - return SUCCESS; -} /* }}} */ - PHPDBG_HELP(back) /* {{{ */ { printf("The backtrace is gathered with the default debug_backtrace functionality.\n"); diff --git a/phpdbg_help.h b/phpdbg_help.h index 8ce6f9691d2..4b683b6893b 100644 --- a/phpdbg_help.h +++ b/phpdbg_help.h @@ -41,7 +41,6 @@ PHPDBG_HELP(run); PHPDBG_HELP(eval); PHPDBG_HELP(print); PHPDBG_HELP(break); -PHPDBG_HELP(cont); PHPDBG_HELP(back); /** @@ -51,12 +50,11 @@ static const phpdbg_command_t phpdbg_help_commands[] = { PHPDBG_HELP_D(exec, "the execution context should be a valid phpdbg path"), PHPDBG_HELP_D(compile, "pre-compilation allows inspection of code before execution"), PHPDBG_HELP_D(step, "stepping through execution allows inspection of the opline after every opcode"), - PHPDBG_HELP_D(next, "execute the next opcode"), + PHPDBG_HELP_D(next, "continue executing while stepping or after breaking"), PHPDBG_HELP_D(run, "execution inside the phpdbg vm allows detailed inspection and debugging"), PHPDBG_HELP_D(eval, "access to eval() allows you to affect the environment during execution"), PHPDBG_HELP_D(print, "printing allows inspection of the execution environment"), PHPDBG_HELP_D(break, "breakpoints allow execution interruption"), - PHPDBG_HELP_D(cont, "use continue when a break point is met"), PHPDBG_HELP_D(back, "show debug backtrace information during execution"), {NULL, 0, 0} diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 483835f4b96..407a2041684 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -104,11 +104,6 @@ static PHPDBG_COMMAND(next) /* {{{ */ return PHPDBG_NEXT; } /* }}} */ -static PHPDBG_COMMAND(cont) /* {{{ */ -{ - return SUCCESS; -} /* }}} */ - static PHPDBG_COMMAND(run) /* {{{ */ { if (PHPDBG_G(ops) || PHPDBG_G(exec)) { @@ -290,12 +285,11 @@ static const phpdbg_command_t phpdbg_prompt_commands[] = { PHPDBG_COMMAND_D(exec, "set execution context"), PHPDBG_COMMAND_D(compile, "attempt to pre-compile execution context"), PHPDBG_COMMAND_D(step, "step through execution"), - PHPDBG_COMMAND_D(next, "next opcode"), + PHPDBG_COMMAND_D(next, "continue execution"), PHPDBG_COMMAND_D(run, "attempt execution"), PHPDBG_COMMAND_D(eval, "evaluate some code"), PHPDBG_COMMAND_D(print, "print something"), PHPDBG_COMMAND_D(break, "set breakpoint"), - PHPDBG_COMMAND_D(cont, "continue execution"), PHPDBG_COMMAND_D(back, "show backtrace"), PHPDBG_COMMAND_D(help, "show help menu"), PHPDBG_COMMAND_D(quit, "exit phpdbg"), From 7d99241455639e2333572f285a7a449fa2d7af10 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 21:12:41 +0000 Subject: [PATCH 064/771] ... --- phpdbg_prompt.c | 1 - 1 file changed, 1 deletion(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 407a2041684..284f32d8619 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -391,7 +391,6 @@ zend_vm_enter: while (phpdbg_interactive(0, NULL TSRMLS_CC) != PHPDBG_NEXT) { continue; } - printf("out\n"); } } } From 26ec44350e6dc9ae489c04d51f1bfa5ccaad66e3 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 21:15:45 +0000 Subject: [PATCH 065/771] ... --- phpdbg.png | Bin 116358 -> 109358 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/phpdbg.png b/phpdbg.png index 96768f7834ac4a7cde8792a09299e79d44464fce..85f9815526f2344bdb29b76c70bf97db1111639a 100644 GIT binary patch literal 109358 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

JRH8w|Af?=*M7$=o)|Ed8@2)n1O?w_+xaR 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

!}>49 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 literal 116358 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 Orl)NLt-5|U>i+=#Sr{n* From 9ba19e82240ec3a37f861f2400d1702ecdc4e655 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 21:23:18 +0000 Subject: [PATCH 066/771] quiet --- phpdbg.c | 1 + phpdbg.h | 1 + phpdbg_help.c | 12 ++++++++++++ phpdbg_help.h | 3 ++- phpdbg_prompt.c | 12 ++++++++++-- 5 files changed, 26 insertions(+), 3 deletions(-) diff --git a/phpdbg.c b/phpdbg.c index c15c718b9d1..e07cb4ad36b 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -32,6 +32,7 @@ static inline void php_phpdbg_globals_ctor(zend_phpdbg_globals *pg) /* {{{ */ pg->vmret = 0; pg->quitting = 0; pg->bp_count = 0; + pg->quiet = 0; } /* }}} */ static PHP_MINIT_FUNCTION(phpdbg) /* {{{ */ diff --git a/phpdbg.h b/phpdbg.h index c5f6104cefb..c9f3e5ee3df 100644 --- a/phpdbg.h +++ b/phpdbg.h @@ -57,6 +57,7 @@ ZEND_BEGIN_MODULE_GLOBALS(phpdbg) zend_bool has_file_bp; /* file-based breakpoint has been set */ zend_bool has_sym_bp; /* symbol-based breakpoint has been set */ zend_bool quitting; /* quitting flag */ + int quiet; /* quiet */ ZEND_END_MODULE_GLOBALS(phpdbg) #endif /* PHPDBG_H */ diff --git a/phpdbg_help.c b/phpdbg_help.c index f1e7cc7568d..4b218f31d2f 100644 --- a/phpdbg_help.c +++ b/phpdbg_help.c @@ -91,6 +91,18 @@ PHPDBG_HELP(break) /* {{{ */ return SUCCESS; } /* }}} */ +PHPDBG_HELP(quiet) /* {{{ */ +{ + printf("Setting quietness on will stop the OPLINE output during execution\n"); + printf("For example:\n"); + printf("\tphpdbg> quiet 1\n"); + printf("Will silence OPLINE output, while\n"); + printf("\tphpdbg> quiet 0\n"); + printf("Will enable OPLINE output again\n"); + + return SUCCESS; +} /* }}} */ + PHPDBG_HELP(back) /* {{{ */ { printf("The backtrace is gathered with the default debug_backtrace functionality.\n"); diff --git a/phpdbg_help.h b/phpdbg_help.h index 4b683b6893b..ed67a3fec21 100644 --- a/phpdbg_help.h +++ b/phpdbg_help.h @@ -42,6 +42,7 @@ PHPDBG_HELP(eval); PHPDBG_HELP(print); PHPDBG_HELP(break); PHPDBG_HELP(back); +PHPDBG_HELP(quiet); /** * Commands @@ -56,7 +57,7 @@ static const phpdbg_command_t phpdbg_help_commands[] = { PHPDBG_HELP_D(print, "printing allows inspection of the execution environment"), PHPDBG_HELP_D(break, "breakpoints allow execution interruption"), PHPDBG_HELP_D(back, "show debug backtrace information during execution"), - + PHPDBG_HELP_D(quiet, "be quiet during execution"), {NULL, 0, 0} }; diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 284f32d8619..55bf0482ec4 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -281,6 +281,11 @@ static PHPDBG_COMMAND(help) /* {{{ */ return SUCCESS; } /* }}} */ +static PHPDBG_COMMAND(quiet) { /* {{{ */ + PHPDBG_G(quiet) = atoi(expr); + return SUCCESS; +} /* }}} */ + static const phpdbg_command_t phpdbg_prompt_commands[] = { PHPDBG_COMMAND_D(exec, "set execution context"), PHPDBG_COMMAND_D(compile, "attempt to pre-compile execution context"), @@ -292,6 +297,7 @@ static const phpdbg_command_t phpdbg_prompt_commands[] = { PHPDBG_COMMAND_D(break, "set breakpoint"), PHPDBG_COMMAND_D(back, "show backtrace"), PHPDBG_COMMAND_D(help, "show help menu"), + PHPDBG_COMMAND_D(quiet, "silence some output"), PHPDBG_COMMAND_D(quit, "exit phpdbg"), {NULL, 0, 0} }; @@ -352,9 +358,11 @@ int phpdbg_interactive(int argc, char **argv TSRMLS_DC) /* {{{ */ static void phpdbg_print_opline(zend_execute_data *execute_data TSRMLS_DC) /* {{{ */ { - zend_op *opline = execute_data->opline; + if (!PHPDBG_G(quiet)) { + zend_op *opline = execute_data->opline; - printf("[OPLINE: %p:%s]\n", opline, phpdbg_decode_opcode(opline->opcode)); + printf("[OPLINE: %p:%s]\n", opline, phpdbg_decode_opcode(opline->opcode)); + } } /* }}} */ void phpdbg_execute_ex(zend_execute_data *execute_data TSRMLS_DC) /* {{{ */ From fedd47e383c9a747560dd506e9b81a6bd231d9f2 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 21:28:12 +0000 Subject: [PATCH 067/771] ... --- phpdbg.c | 1 + phpdbg_prompt.c | 4 ++-- test.php | 3 +++ 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/phpdbg.c b/phpdbg.c index e07cb4ad36b..997c2738366 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -27,6 +27,7 @@ void (*zend_execute_internal_old)(zend_execute_data *execute_data_ptr, zend_fcal static inline void php_phpdbg_globals_ctor(zend_phpdbg_globals *pg) /* {{{ */ { pg->exec = NULL; + pg->exec_len = 0; pg->ops = NULL; pg->stepping = 0; pg->vmret = 0; diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 55bf0482ec4..7671b2234b0 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -383,7 +383,7 @@ zend_vm_enter: } #endif - if (PHPDBG_G(has_file_bp) + if (PHPDBG_G(has_file_bp) && phpdbg_find_breakpoint_file(execute_data->op_array TSRMLS_CC) == SUCCESS) { while (phpdbg_interactive(0, NULL TSRMLS_CC) != PHPDBG_NEXT) { continue; @@ -393,7 +393,7 @@ zend_vm_enter: if (PHPDBG_G(has_sym_bp)) { zend_execute_data *previous = execute_data->prev_execute_data; if (previous && (previous != execute_data)) { - if (previous->opline) { + if (previous->opline && execute_data->opline->opcode != ZEND_RETURN) { if (previous->opline->opcode == ZEND_DO_FCALL || previous->opline->opcode == ZEND_DO_FCALL_BY_NAME) { if (phpdbg_find_breakpoint_symbol(previous->function_state.function TSRMLS_CC) == SUCCESS) { while (phpdbg_interactive(0, NULL TSRMLS_CC) != PHPDBG_NEXT) { diff --git a/test.php b/test.php index a433605823b..bed99d3e9b7 100644 --- a/test.php +++ b/test.php @@ -5,8 +5,11 @@ function test() { function test2() { echo "Hello World 2\n"; } + if (!isset($greeting)) { echo test(); } + +test2(); return true; ?> From 493e81e4c70e28e440544df372536c5171089fff Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 21:29:14 +0000 Subject: [PATCH 068/771] ... --- phpdbg_prompt.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 7671b2234b0..684e88c64b5 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -390,10 +390,10 @@ zend_vm_enter: } } - if (PHPDBG_G(has_sym_bp)) { + if (PHPDBG_G(has_sym_bp) && execute_data->opline->opcode != ZEND_RETURN) { zend_execute_data *previous = execute_data->prev_execute_data; if (previous && (previous != execute_data)) { - if (previous->opline && execute_data->opline->opcode != ZEND_RETURN) { + if (previous->opline) { if (previous->opline->opcode == ZEND_DO_FCALL || previous->opline->opcode == ZEND_DO_FCALL_BY_NAME) { if (phpdbg_find_breakpoint_symbol(previous->function_state.function TSRMLS_CC) == SUCCESS) { while (phpdbg_interactive(0, NULL TSRMLS_CC) != PHPDBG_NEXT) { From d141bf4ea873d40cc2ee7daa554ff394bcf28356 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 10 Nov 2013 19:38:58 -0200 Subject: [PATCH 069/771] - Get rid llist from symbol breakpoint --- phpdbg.c | 12 +++++++++--- phpdbg_bp.c | 42 +++++++++++++----------------------------- phpdbg_bp.h | 3 +-- phpdbg_prompt.c | 39 +++++++++++++++++++-------------------- 4 files changed, 42 insertions(+), 54 deletions(-) diff --git a/phpdbg.c b/phpdbg.c index c15c718b9d1..1a62bcac612 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -18,6 +18,7 @@ #include "phpdbg.h" #include "phpdbg_prompt.h" +#include "phpdbg_bp.h" ZEND_DECLARE_MODULE_GLOBALS(phpdbg); @@ -44,15 +45,20 @@ static PHP_MINIT_FUNCTION(phpdbg) /* {{{ */ return SUCCESS; } /* }}} */ -static void php_phpdbg_destroy_break(void *brake) /* {{{ */ +static void php_phpdbg_destroy_bp_file(void *brake) /* {{{ */ { zend_llist_destroy((zend_llist*)brake); } /* }}} */ +static void php_phpdbg_destroy_bp_symbol(void *brake) /* {{{ */ +{ + efree(((phpdbg_breaksymbol_t*)brake)->symbol); +} /* }}} */ + static PHP_RINIT_FUNCTION(phpdbg) /* {{{ */ { - zend_hash_init(&PHPDBG_G(bp_files), 8, NULL, php_phpdbg_destroy_break, 0); - zend_hash_init(&PHPDBG_G(bp_symbols), 8, NULL, php_phpdbg_destroy_break, 0); + zend_hash_init(&PHPDBG_G(bp_files), 8, NULL, php_phpdbg_destroy_bp_file, 0); + zend_hash_init(&PHPDBG_G(bp_symbols), 8, NULL, php_phpdbg_destroy_bp_symbol, 0); return SUCCESS; } /* }}} */ diff --git a/phpdbg_bp.c b/phpdbg_bp.c index d3787349600..4680e3ab505 100644 --- a/phpdbg_bp.c +++ b/phpdbg_bp.c @@ -32,13 +32,6 @@ static void phpdbg_llist_breakfile_dtor(void *data) /* {{{ */ efree((char*)bp->filename); } /* }}} */ -static void phpdbg_llist_breaksym_dtor(void *data) /* {{{ */ -{ - phpdbg_breaksymbol_t *bp = (phpdbg_breaksymbol_t*) data; - - efree((char*)bp->symbol); -} /* }}} */ - void phpdbg_set_breakpoint_file(const char *path, long line_num TSRMLS_DC) /* {{{ */ { phpdbg_breakfile_t new_break; @@ -66,31 +59,21 @@ void phpdbg_set_breakpoint_file(const char *path, long line_num TSRMLS_DC) /* {{ zend_llist_add_element(break_files_ptr, &new_break); } /* }}} */ -void phpdbg_set_breakpoint_symbol(const char *name, long opline_num TSRMLS_DC) /* {{{ */ +void phpdbg_set_breakpoint_symbol(const char *name TSRMLS_DC) /* {{{ */ { - phpdbg_breaksymbol_t new_break; - zend_llist *break_sym_ptr; size_t name_len = strlen(name); - new_break.symbol = estrndup(name, name_len + 1); - new_break.opline_num = opline_num; - - PHPDBG_G(has_sym_bp) = 1; + if (!zend_hash_exists(&PHPDBG_G(bp_symbols), name, name_len)) { + phpdbg_breaksymbol_t new_break; - if (zend_hash_find(&PHPDBG_G(bp_symbols), - new_break.symbol, name_len, (void**)&break_sym_ptr) == FAILURE) { - zend_llist break_syms; + PHPDBG_G(has_sym_bp) = 1; - zend_llist_init(&break_syms, sizeof(phpdbg_breaksymbol_t), - phpdbg_llist_breaksym_dtor, 0); + new_break.symbol = estrndup(name, name_len + 1); + new_break.id = PHPDBG_G(bp_count)++; - zend_hash_update(&PHPDBG_G(bp_symbols), - new_break.symbol, name_len, &break_syms, sizeof(zend_llist), - (void**)&break_sym_ptr); + zend_hash_update(&PHPDBG_G(bp_symbols), new_break.symbol, + name_len, &new_break, sizeof(phpdbg_breaksymbol_t), NULL); } - - new_break.id = PHPDBG_G(bp_count)++; - zend_llist_add_element(break_sym_ptr, &new_break); } /* }}} */ int phpdbg_find_breakpoint_file(zend_op_array *op_array TSRMLS_DC) /* {{{ */ @@ -119,7 +102,7 @@ int phpdbg_find_breakpoint_file(zend_op_array *op_array TSRMLS_DC) /* {{{ */ int phpdbg_find_breakpoint_symbol(zend_function *fbc TSRMLS_DC) /* {{{ */ { const char *fname; - zend_llist *break_list; + phpdbg_breaksymbol_t *bp; if (fbc->type != ZEND_USER_FUNCTION) { return FAILURE; @@ -130,10 +113,11 @@ int phpdbg_find_breakpoint_symbol(zend_function *fbc TSRMLS_DC) /* {{{ */ if (!fname) { fname = "main"; } - + if (zend_hash_find(&PHPDBG_G(bp_symbols), fname, strlen(fname), - (void**)&break_list) == SUCCESS) { - printf("breakpoint reached!\n"); + (void**)&bp) == SUCCESS) { + printf("Breakpoint #%d in %s() at %s\n", bp->id, bp->symbol, + zend_get_executed_filename(TSRMLS_C)); return SUCCESS; } diff --git a/phpdbg_bp.h b/phpdbg_bp.h index 45f4239eafd..104e9d0c1d9 100644 --- a/phpdbg_bp.h +++ b/phpdbg_bp.h @@ -34,12 +34,11 @@ typedef struct _phpdbg_breakfile_t { */ typedef struct _phpdbg_breaksymbol_t { const char *symbol; - long opline_num; int id; } phpdbg_breaksymbol_t; void phpdbg_set_breakpoint_file(const char*, long TSRMLS_DC); -void phpdbg_set_breakpoint_symbol(const char*, long TSRMLS_DC); +void phpdbg_set_breakpoint_symbol(const char* TSRMLS_DC); int phpdbg_find_breakpoint_file(zend_op_array* TSRMLS_DC); int phpdbg_find_breakpoint_symbol(zend_function* TSRMLS_DC); diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 284f32d8619..d064d2dd378 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -72,7 +72,7 @@ static inline int phpdbg_compile(TSRMLS_D) /* {{{ */ } else { printf("Cannot compile while in execution\n"); } - + return FAILURE; } /* }}} */ @@ -228,14 +228,13 @@ static PHPDBG_COMMAND(break) /* {{{ */ phpdbg_set_breakpoint_file(resolved_name, line_num TSRMLS_CC); } else { char name[200]; - const char *opnum_pos = zend_memrchr(expr, '#', expr_len); - long opline_num = opnum_pos ? strtol(opnum_pos+1, NULL, 0) : 0; - size_t name_len = opnum_pos ? opnum_pos - expr : strlen(expr); + size_t name_len = strlen(expr); + name_len = MIN(name_len, 200); memcpy(name, expr, name_len); name[name_len] = 0; - phpdbg_set_breakpoint_symbol(name, opline_num TSRMLS_CC); + phpdbg_set_breakpoint_symbol(name TSRMLS_CC); } return SUCCESS; @@ -336,7 +335,7 @@ int phpdbg_interactive(int argc, char **argv TSRMLS_DC) /* {{{ */ } break; - case PHPDBG_NEXT: + case PHPDBG_NEXT: return PHPDBG_NEXT; } @@ -375,7 +374,7 @@ zend_vm_enter: } #endif - if (PHPDBG_G(has_file_bp) + if (PHPDBG_G(has_file_bp) && phpdbg_find_breakpoint_file(execute_data->op_array TSRMLS_CC) == SUCCESS) { while (phpdbg_interactive(0, NULL TSRMLS_CC) != PHPDBG_NEXT) { continue; @@ -384,21 +383,21 @@ zend_vm_enter: if (PHPDBG_G(has_sym_bp)) { zend_execute_data *previous = execute_data->prev_execute_data; - if (previous && (previous != execute_data)) { - if (previous->opline) { - if (previous->opline->opcode == ZEND_DO_FCALL || previous->opline->opcode == ZEND_DO_FCALL_BY_NAME) { - if (phpdbg_find_breakpoint_symbol(previous->function_state.function TSRMLS_CC) == SUCCESS) { - while (phpdbg_interactive(0, NULL TSRMLS_CC) != PHPDBG_NEXT) { - continue; - } - } - } - } - } + if (previous && previous != execute_data && previous->opline) { + if (previous->opline->opcode == ZEND_DO_FCALL + || previous->opline->opcode == ZEND_DO_FCALL_BY_NAME) { + if (phpdbg_find_breakpoint_symbol( + previous->function_state.function TSRMLS_CC) == SUCCESS) { + while (phpdbg_interactive(0, NULL TSRMLS_CC) != PHPDBG_NEXT) { + continue; + } + } + } + } } - + PHPDBG_G(vmret) = execute_data->opline->handler(execute_data TSRMLS_CC); - + phpdbg_print_opline( execute_data TSRMLS_CC); From 587003ee488189e78585047149c751c2e815d7be Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 21:49:37 +0000 Subject: [PATCH 070/771] exec last command automatically on enter --- phpdbg.c | 3 +++ phpdbg.h | 5 +++++ phpdbg_prompt.c | 11 +++++++++-- phpdbg_prompt.h | 4 ++-- 4 files changed, 19 insertions(+), 4 deletions(-) diff --git a/phpdbg.c b/phpdbg.c index 997c2738366..744565fb48d 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -34,6 +34,9 @@ static inline void php_phpdbg_globals_ctor(zend_phpdbg_globals *pg) /* {{{ */ pg->quitting = 0; pg->bp_count = 0; pg->quiet = 0; + pg->last = NULL; + pg->last_params = NULL; + pg->last_params_len = 0; } /* }}} */ static PHP_MINIT_FUNCTION(phpdbg) /* {{{ */ diff --git a/phpdbg.h b/phpdbg.h index c9f3e5ee3df..0ac807d9874 100644 --- a/phpdbg.h +++ b/phpdbg.h @@ -44,6 +44,8 @@ #define PHPDBG_NEXT 2 +typedef struct _phpdbg_command_t phpdbg_command_t; + ZEND_BEGIN_MODULE_GLOBALS(phpdbg) HashTable bp_files; HashTable bp_symbols; @@ -58,6 +60,9 @@ ZEND_BEGIN_MODULE_GLOBALS(phpdbg) zend_bool has_sym_bp; /* symbol-based breakpoint has been set */ zend_bool quitting; /* quitting flag */ int quiet; /* quiet */ + phpdbg_command_t *last; /* last command */ + const char *last_params;/* last expression */ + size_t last_params_len; /* last expression length */ ZEND_END_MODULE_GLOBALS(phpdbg) #endif /* PHPDBG_H */ diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 684e88c64b5..4c5b51712e1 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -58,7 +58,7 @@ static inline int phpdbg_compile(TSRMLS_D) /* {{{ */ if (!EG(in_execution)) { printf("Attempting compilation of %s\n", PHPDBG_G(exec)); - + if (php_stream_open_for_zend_ex(PHPDBG_G(exec), &fh, USE_PATH|STREAM_OPEN_FOR_INCLUDE TSRMLS_CC) == SUCCESS) { PHPDBG_G(ops) = zend_compile_file( @@ -310,7 +310,10 @@ int phpdbg_do_cmd(const phpdbg_command_t *command, char *cmd_line, size_t cmd_le while (command && command->name) { if (command->name_len == expr_len - && memcmp(cmd, command->name, expr_len) == 0) { + && memcmp(cmd, command->name, expr_len) == 0) { + PHPDBG_G(last) = command; + PHPDBG_G(last_params) = params; + PHPDBG_G(last_params_len) = cmd_len - expr_len; return command->handler(params, cmd_len - expr_len TSRMLS_CC); } ++command; @@ -346,11 +349,15 @@ int phpdbg_interactive(int argc, char **argv TSRMLS_DC) /* {{{ */ return PHPDBG_NEXT; } + } else if (PHPDBG_G(last)) { + PHPDBG_G(last)->handler( + PHPDBG_G(last_params), PHPDBG_G(last_params_len) TSRMLS_CC); } if (!PHPDBG_G(quitting)) { printf("phpdbg> "); } + } return SUCCESS; diff --git a/phpdbg_prompt.h b/phpdbg_prompt.h index b6921d671e4..c0590e25970 100644 --- a/phpdbg_prompt.h +++ b/phpdbg_prompt.h @@ -35,13 +35,13 @@ typedef int (*phpdbg_command_handler_t)(const char* expr, size_t expr_len TSRMLS /** * Command representation */ -typedef struct _phpdbg_command_t { +struct _phpdbg_command_t { const char *name; /* Command name */ size_t name_len; /* Command name length */ const char *tip; /* Menu tip */ size_t tip_len; /* Menu tip length */ phpdbg_command_handler_t handler; /* Command handler */ -} phpdbg_command_t; +} ; /** * Command Executor From e1931c14a5ae9f37bf13e7bccc06390d298d3e3d Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 10 Nov 2013 19:51:44 -0200 Subject: [PATCH 071/771] - Move PHPDBG_NEXT to prompt header --- phpdbg.h | 2 -- phpdbg_prompt.h | 6 ++++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/phpdbg.h b/phpdbg.h index c9f3e5ee3df..acfabafb5df 100644 --- a/phpdbg.h +++ b/phpdbg.h @@ -42,8 +42,6 @@ # define PHPDBG_G(v) (phpdbg_globals.v) #endif -#define PHPDBG_NEXT 2 - ZEND_BEGIN_MODULE_GLOBALS(phpdbg) HashTable bp_files; HashTable bp_symbols; diff --git a/phpdbg_prompt.h b/phpdbg_prompt.h index b6921d671e4..f14b656541e 100644 --- a/phpdbg_prompt.h +++ b/phpdbg_prompt.h @@ -27,6 +27,8 @@ #define PHPDBG_STRL(s) s, sizeof(s)-1 +#define PHPDBG_NEXT 2 + /** * Command handler */ @@ -52,9 +54,9 @@ int phpdbg_do_cmd(const phpdbg_command_t *command, char *cmd_line, size_t cmd_le * Command Declarators */ #define PHPDBG_COMMAND_D(name, tip) \ - {PHPDBG_STRL(#name), tip, sizeof(tip)-1, phpdbg_do_##name} + {PHPDBG_STRL(#name), tip, sizeof(tip)-1, phpdbg_do_##name} #define PHPDBG_COMMAND(name) \ - int phpdbg_do_##name(const char *expr, size_t expr_len TSRMLS_DC) + int phpdbg_do_##name(const char *expr, size_t expr_len TSRMLS_DC) int phpdbg_interactive(int argc, char **argv TSRMLS_DC); void phpdbg_execute_ex(zend_execute_data *execute_data TSRMLS_DC); From 7886665b520cae75861f87ba0c8b9a2a32beb88a Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 10 Nov 2013 19:57:43 -0200 Subject: [PATCH 072/771] - Cosmetic changes --- phpdbg_bp.c | 3 +-- phpdbg_prompt.c | 3 ++- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/phpdbg_bp.c b/phpdbg_bp.c index 4680e3ab505..4ae8863534b 100644 --- a/phpdbg_bp.c +++ b/phpdbg_bp.c @@ -122,5 +122,4 @@ int phpdbg_find_breakpoint_symbol(zend_function *fbc TSRMLS_DC) /* {{{ */ } return FAILURE; -} -/* }}} */ +} /* }}} */ diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index de28d8f559b..2a2cf81a2b5 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -138,7 +138,8 @@ static PHPDBG_COMMAND(eval) /* {{{ */ zval retval; if (expr) { - if (zend_eval_stringl((char*)expr, expr_len-1, &retval, "eval()'d code" TSRMLS_CC) == SUCCESS) { + if (zend_eval_stringl((char*)expr, expr_len-1, + &retval, "eval()'d code" TSRMLS_CC) == SUCCESS) { printf("Success: "); zend_print_zval_r(&retval, 0 TSRMLS_CC); printf("\n"); From f45f2ab8f88858dea62b756276cdcc569d3f1e69 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 10 Nov 2013 20:01:40 -0200 Subject: [PATCH 073/771] - Fix comment --- phpdbg.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpdbg.c b/phpdbg.c index 84547801937..73108d799f0 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -136,7 +136,7 @@ static sapi_module_struct phpdbg_sapi_module = { }; /* }}} */ -const opt_struct OPTIONS[] = { /* }}} */ +const opt_struct OPTIONS[] = { /* {{{ */ {'c', 1, "ini path override"}, {'d', 1, "define ini entry on command line"}, {'-', 0, NULL} From 8ffa4025fbbca506b15fb71ee12804e50cf7defb Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 10 Nov 2013 20:04:22 -0200 Subject: [PATCH 074/771] - Cosmetics --- phpdbg_prompt.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 2a2cf81a2b5..a4812c0bd31 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -411,8 +411,7 @@ zend_vm_enter: execute_data TSRMLS_CC); if (PHPDBG_G(stepping)) { - while (phpdbg_interactive( - 0, NULL TSRMLS_CC) != PHPDBG_NEXT) { + while (phpdbg_interactive(0, NULL TSRMLS_CC) != PHPDBG_NEXT) { continue; } } From 7de0b76ba89cf3eb46080e2d314e9b582082f4ad Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 22:44:28 +0000 Subject: [PATCH 075/771] ... --- config.m4 | 7 ++-- phpdbg.c | 90 ++++++++++++++++++++++++++++++++++++++++++------- phpdbg_prompt.c | 2 +- 3 files changed, 83 insertions(+), 16 deletions(-) diff --git a/config.m4 b/config.m4 index f3671f4b10d..33ea65b3963 100644 --- a/config.m4 +++ b/config.m4 @@ -8,9 +8,12 @@ PHP_ARG_ENABLE(phpdbg, for phpdbg support, if test "$PHP_PHPDBG" != "no"; then AC_DEFINE(HAVE_PHPDBG, 1, [ ]) - PHP_PHPDBG_CFLAGS=-I$abs_srcdir/sapi/phpdbg + PHP_PHPDBG_CFLAGS="-I$abc_srcdir" PHP_PHPDBG_FILES="phpdbg.c phpdbg_prompt.c phpdbg_help.c phpdbg_bp.c phpdbg_opcode.c" + PHP_SUBST(PHP_PHPDBG_CFLAGS) + PHP_SUBST(PHP_PHPDBG_FILES) + PHP_ADD_MAKEFILE_FRAGMENT([$abs_srcdir/sapi/phpdbg/Makefile.frag]) PHP_SELECT_SAPI(phpdbg, program, $PHP_PHPDBG_FILES, $PHP_PHPDBG_CFLAGS, [$(SAPI_PHPDBG_PATH)]) @@ -24,7 +27,7 @@ if test "$PHP_PHPDBG" != "no"; then \$(PHPDBG_EXTRA_LIBS) \ \$(ZEND_EXTRA_LIBS) \ -o \$(BUILD_BINARY)" - + PHP_SUBST(BUILD_BINARY) PHP_SUBST(BUILD_PHPDBG) fi diff --git a/phpdbg.c b/phpdbg.c index 744565fb48d..491b55b5f4b 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -99,6 +99,46 @@ static inline int php_sapi_phpdbg_module_startup(sapi_module_struct *module) /* return SUCCESS; } /* }}} */ +static char* php_sapi_phpdbg_read_cookies(TSRMLS_D) { /* {{{ */ + return NULL; +} /* }}} */ + +static int php_sapi_phpdbg_header_handler(sapi_header_struct *h, sapi_header_op_enum op, sapi_headers_struct *s TSRMLS_DC) /* {{{ */ +{ + return 0; +} +/* }}} */ + +static int php_sapi_phpdbg_send_headers(sapi_headers_struct *sapi_headers TSRMLS_DC) /* {{{ */ +{ + /* We do nothing here, this function is needed to prevent that the fallback + * header handling is called. */ + return SAPI_HEADER_SENT_SUCCESSFULLY; +} +/* }}} */ + +static void php_sapi_phpdbg_send_header(sapi_header_struct *sapi_header, void *server_context TSRMLS_DC) /* {{{ */ +{ +} +/* }}} */ + +static void php_sapi_phpdbg_log_message(char *message TSRMLS_DC) /* {{{ */ +{ + fprintf(stderr, "%s\n", message); +} +/* }}} */ + +static int php_sapi_phpdbg_deactivate(TSRMLS_D) /* {{{ */ +{ + fflush(stdout); + if(SG(request_info).argv0) { + free(SG(request_info).argv0); + SG(request_info).argv0 = NULL; + } + return SUCCESS; +} +/* }}} */ + /* {{{ sapi_module_struct phpdbg_sapi_module */ static sapi_module_struct phpdbg_sapi_module = { @@ -109,7 +149,7 @@ static sapi_module_struct phpdbg_sapi_module = { php_module_shutdown_wrapper, /* shutdown */ NULL, /* activate */ - NULL, /* deactivate */ + php_sapi_phpdbg_deactivate, /* deactivate */ NULL, /* unbuffered write */ NULL, /* flush */ @@ -118,27 +158,35 @@ static sapi_module_struct phpdbg_sapi_module = { php_error, /* error handler */ - NULL, /* header handler */ - NULL, /* send headers handler */ - NULL, /* send header handler */ + php_sapi_phpdbg_header_handler, /* header handler */ + php_sapi_phpdbg_send_headers, /* send headers handler */ + php_sapi_phpdbg_send_header, /* send header handler */ NULL, /* read POST data */ - NULL, /* read Cookies */ + php_sapi_phpdbg_read_cookies, /* read Cookies */ NULL, /* register server variables */ - NULL, /* Log message */ + php_sapi_phpdbg_log_message, /* Log message */ NULL, /* Get request time */ NULL, /* Child terminate */ STANDARD_SAPI_MODULE_PROPERTIES }; /* }}} */ -const opt_struct OPTIONS[] = { /* }}} */ +const opt_struct phpdbg_options[] = { /* }}} */ {'c', 1, "ini path override"}, {'d', 1, "define ini entry on command line"}, {'-', 0, NULL} }; /* }}} */ +const char phpdbg_ini_hardcoded[] = + "html_errors=0\n" + "register_argc_argv=1\n" + "implicit_flush=1\n" + "output_buffering=0\n" + "max_execution_time=0\n" + "max_input_time=-1\n\0"; + /* overwriteable ini defaults must be set in phpdbg_ini_defaults() */ #define INI_DEFAULT(name,value)\ Z_SET_REFCOUNT(tmp, 0);\ @@ -152,7 +200,7 @@ void phpdbg_ini_defaults(HashTable *configuration_hash) { /* {{{ */ INI_DEFAULT("display_errors", "1"); } /* }}} */ -int main(int argc, char **argv) /* {{{ */ +int main(int argc, char *argv[]) /* {{{ */ { sapi_module_struct *phpdbg = &phpdbg_sapi_module; char *ini_file = NULL; @@ -162,12 +210,9 @@ int main(int argc, char **argv) /* {{{ */ char *php_optarg = NULL; int php_optind = 0; int opt; - + #ifdef ZTS void ***tsrm_ls; - tsrm_startup(1, 1, 0, NULL); - - tsrm_ls = ts_resource(0); #endif #ifdef PHP_WIN32 @@ -177,7 +222,14 @@ int main(int argc, char **argv) /* {{{ */ setmode(_fileno(stderr), O_BINARY); /* make the stdio mode be binary */ #endif - while ((opt = php_getopt(argc, argv, OPTIONS, &php_optarg, &php_optind, 1, 1)) != -1) { +#ifdef ZTS + tsrm_startup(1, 1, 0, NULL); + + tsrm_ls = ts_resource(0); +#endif + + while ((opt = php_getopt(argc, argv, phpdbg_options, &php_optarg, &php_optind, 0, 2)) != -1) { + printf("OPT: %d\n", opt); switch (opt) { case 'c': if (ini_path_override) { @@ -228,6 +280,18 @@ int main(int argc, char **argv) /* {{{ */ phpdbg->phpinfo_as_text = 1; phpdbg->php_ini_ignore_cwd = 0; phpdbg->php_ini_ignore = 0; + + if (ini_entries) { + ini_entries = realloc(ini_entries, ini_entries_len + sizeof(phpdbg_ini_hardcoded)); + memmove(ini_entries + sizeof(phpdbg_ini_hardcoded) - 2, ini_entries, ini_entries_len + 1); + memcpy(ini_entries, phpdbg_ini_hardcoded, sizeof(phpdbg_ini_hardcoded) - 2); + } else { + ini_entries = malloc(sizeof(phpdbg_ini_hardcoded)); + memcpy(ini_entries, phpdbg_ini_hardcoded, sizeof(phpdbg_ini_hardcoded)); + } + ini_entries_len += sizeof(phpdbg_ini_hardcoded) - 2; + printf("ini_entries: %d\n", ini_entries_len); + phpdbg->ini_entries = ini_entries; if (phpdbg->startup(phpdbg) == SUCCESS) { diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 4c5b51712e1..a5bca2d142f 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -345,7 +345,7 @@ int phpdbg_interactive(int argc, char **argv TSRMLS_DC) /* {{{ */ } break; - case PHPDBG_NEXT: + case PHPDBG_NEXT: return PHPDBG_NEXT; } From 4f9f86a15dbbec28c37a9f7ade85545124d2c764 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 22:55:07 +0000 Subject: [PATCH 076/771] update to default on --- config.m4 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.m4 b/config.m4 index 33ea65b3963..bb9719015e5 100644 --- a/config.m4 +++ b/config.m4 @@ -3,7 +3,7 @@ dnl $Id$ dnl PHP_ARG_ENABLE(phpdbg, for phpdbg support, -[ --enable-phpdbg Build phpdbg], no, no) +[ --enable-phpdbg Build phpdbg], yes, yes) if test "$PHP_PHPDBG" != "no"; then AC_DEFINE(HAVE_PHPDBG, 1, [ ]) From 92c0fbebeda49a9e5d327f4b08e89df2d1af98ff Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 23:06:20 +0000 Subject: [PATCH 077/771] ini working --- phpdbg.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/phpdbg.c b/phpdbg.c index 2ebc5184842..a4984bb7aa7 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -214,7 +214,7 @@ int main(int argc, char *argv[]) /* {{{ */ int ini_entries_len = 0; char *ini_path_override = NULL; char *php_optarg = NULL; - int php_optind = 0; + int php_optind = 1; int opt; #ifdef ZTS @@ -235,7 +235,6 @@ int main(int argc, char *argv[]) /* {{{ */ #endif while ((opt = php_getopt(argc, argv, OPTIONS, &php_optarg, &php_optind, 0, 2)) != -1) { - printf("OPT: %d\n", opt); switch (opt) { case 'c': if (ini_path_override) { From 4f5096af3ceaf5670050353fc8a41d164b8b058b Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 23:30:52 +0000 Subject: [PATCH 078/771] register server vars --- phpdbg.c | 60 ++++++++++++++++++++++++++++++++++++++++++++------------ phpdbg.h | 5 +++-- 2 files changed, 51 insertions(+), 14 deletions(-) diff --git a/phpdbg.c b/phpdbg.c index a4984bb7aa7..e7cb57d10c7 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -38,6 +38,8 @@ static inline void php_phpdbg_globals_ctor(zend_phpdbg_globals *pg) /* {{{ */ pg->last = NULL; pg->last_params = NULL; pg->last_params_len = 0; + pg->has_file_bp = 0; + pg->has_sym_bp = 0; } /* }}} */ static PHP_MINIT_FUNCTION(phpdbg) /* {{{ */ @@ -145,6 +147,40 @@ static int php_sapi_phpdbg_deactivate(TSRMLS_D) /* {{{ */ } /* }}} */ +static void php_sapi_phpdbg_register_vars(zval *track_vars_array TSRMLS_DC) /* {{{ */ +{ + unsigned int len; + char *docroot = ""; + + /* In phpdbg mode, we consider the environment to be a part of the server variables + */ + php_import_environment_variables(track_vars_array TSRMLS_CC); + + if (PHPDBG_G(exec)) { + len = PHPDBG_G(exec_len); + if (sapi_module.input_filter(PARSE_SERVER, "PHP_SELF", &PHPDBG_G(exec), PHPDBG_G(exec_len), &len TSRMLS_CC)) { + php_register_variable("PHP_SELF", PHPDBG_G(exec), track_vars_array TSRMLS_CC); + } + if (sapi_module.input_filter(PARSE_SERVER, "SCRIPT_NAME", &PHPDBG_G(exec), PHPDBG_G(exec_len), &len TSRMLS_CC)) { + php_register_variable("SCRIPT_NAME", PHPDBG_G(exec), track_vars_array TSRMLS_CC); + } + + if (sapi_module.input_filter(PARSE_SERVER, "SCRIPT_FILENAME", &PHPDBG_G(exec), PHPDBG_G(exec_len), &len TSRMLS_CC)) { + php_register_variable("SCRIPT_FILENAME", PHPDBG_G(exec), track_vars_array TSRMLS_CC); + } + if (sapi_module.input_filter(PARSE_SERVER, "PATH_TRANSLATED", &PHPDBG_G(exec), PHPDBG_G(exec_len), &len TSRMLS_CC)) { + php_register_variable("PATH_TRANSLATED", PHPDBG_G(exec), track_vars_array TSRMLS_CC); + } + } + + /* any old docroot will doo */ + len = 0U; + if (sapi_module.input_filter(PARSE_SERVER, "DOCUMENT_ROOT", &docroot, len, &len TSRMLS_CC)) { + php_register_variable("DOCUMENT_ROOT", docroot, track_vars_array TSRMLS_CC); + } +} +/* }}} */ + /* {{{ sapi_module_struct phpdbg_sapi_module */ static sapi_module_struct phpdbg_sapi_module = { @@ -171,7 +207,7 @@ static sapi_module_struct phpdbg_sapi_module = { NULL, /* read POST data */ php_sapi_phpdbg_read_cookies, /* read Cookies */ - NULL, /* register server variables */ + php_sapi_phpdbg_register_vars, /* register server variables */ php_sapi_phpdbg_log_message, /* Log message */ NULL, /* Get request time */ NULL, /* Child terminate */ @@ -182,6 +218,8 @@ static sapi_module_struct phpdbg_sapi_module = { const opt_struct OPTIONS[] = { /* {{{ */ {'c', 1, "ini path override"}, {'d', 1, "define ini entry on command line"}, + {'n', 0, "no php.ini"}, + {'z', 1, "load zend_extension"}, {'-', 0, NULL} }; /* }}} */ @@ -209,10 +247,8 @@ void phpdbg_ini_defaults(HashTable *configuration_hash) { /* {{{ */ int main(int argc, char *argv[]) /* {{{ */ { sapi_module_struct *phpdbg = &phpdbg_sapi_module; - char *ini_file = NULL; char *ini_entries = NULL; int ini_entries_len = 0; - char *ini_path_override = NULL; char *php_optarg = NULL; int php_optind = 1; int opt; @@ -236,11 +272,14 @@ int main(int argc, char *argv[]) /* {{{ */ while ((opt = php_getopt(argc, argv, OPTIONS, &php_optarg, &php_optind, 0, 2)) != -1) { switch (opt) { + case 'n': + phpdbg->php_ini_ignore = 1; + break; case 'c': - if (ini_path_override) { - free(ini_path_override); + if (phpdbg->php_ini_path_override) { + free(phpdbg->php_ini_path_override); } - ini_path_override = strdup(php_optarg); + phpdbg->php_ini_path_override = strdup(php_optarg); break; case 'd': { int len = strlen(php_optarg); @@ -271,11 +310,13 @@ int main(int argc, char *argv[]) /* {{{ */ ini_entries_len += len + sizeof("=1\n\0") - 2; } } break; + case 'z': + zend_load_extension(php_optarg); + break; } } phpdbg->ini_defaults = phpdbg_ini_defaults; - phpdbg->php_ini_path_override = ini_path_override; phpdbg->phpinfo_as_text = 1; phpdbg->php_ini_ignore_cwd = 1; @@ -283,7 +324,6 @@ int main(int argc, char *argv[]) /* {{{ */ phpdbg->executable_location = argv[0]; phpdbg->phpinfo_as_text = 1; - phpdbg->php_ini_ignore_cwd = 0; phpdbg->php_ini_ignore = 0; if (ini_entries) { @@ -319,10 +359,6 @@ int main(int argc, char *argv[]) /* {{{ */ } while(!PHPDBG_G(quitting)); } zend_end_try(); - if (ini_file) { - pefree(ini_file, 1); - } - if (ini_entries) { free(ini_entries); } diff --git a/phpdbg.h b/phpdbg.h index 0ac807d9874..e8c02da70ad 100644 --- a/phpdbg.h +++ b/phpdbg.h @@ -23,11 +23,12 @@ #include "php_globals.h" #include "php_variables.h" #include "php_getopt.h" +#include "zend_builtin_functions.h" +#include "zend_extensions.h" #include "zend_modules.h" -#include "zend_ini_scanner.h" #include "zend_globals.h" +#include "zend_ini_scanner.h" #include "zend_stream.h" -#include "zend_builtin_functions.h" #include "SAPI.h" #include #include "php_main.h" From a6864679a2866e69a3659e29e9b112353764560d Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 23:38:55 +0000 Subject: [PATCH 079/771] ... --- README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/README.md b/README.md index a15e556226f..78d811f5759 100644 --- a/README.md +++ b/README.md @@ -29,6 +29,16 @@ make -j8 make install-phpdbg ``` +Command Line Options +==================== + +The following switches are implemented (just like cli SAPI): + + - -n ignore php ini + - -c search for php ini in path + - -z load zend extension + - -d define php ini entry + Screeny ======= From f745c841b8e9104874a1f4c83b603d4e090b1be3 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 23:40:57 +0000 Subject: [PATCH 080/771] ... --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 78d811f5759..5fd6514d692 100644 --- a/README.md +++ b/README.md @@ -9,9 +9,9 @@ Features ======== - step through debugging - - setting break points + - break at function entry or file:line - showing debug backtraces - - access to eval during execution + - easy manipulation of the environment with built-in eval() - sapi agnositicism, easy integration Installation From b5da4267761367f0c8eecdad6fe830e784e74bdc Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sun, 10 Nov 2013 23:44:16 +0000 Subject: [PATCH 081/771] ... --- README.md | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 5fd6514d692..51f7be3041f 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,12 @@ -phpdbg - The interactive PHP debugger -===================================== +The interactive PHP debugger +============================ phpdbg is an interactive debugger for PHP. Implemented as a SAPI module, phpdbg can excerpt complete control over the environment without impacting the functionality or performance of your code. +phpdbg aims to be a lightweight, easy to use debugging platform for PHP5.5+ + Features ======== @@ -14,6 +16,13 @@ Features - easy manipulation of the environment with built-in eval() - sapi agnositicism, easy integration +Planned +======= + + - mocking server environments/requests + - userland script-ability + - improve everything + Installation ============ From b77508f25094684f0197e1a2337ddec6143512ec Mon Sep 17 00:00:00 2001 From: krakjoe Date: Mon, 11 Nov 2013 08:02:04 +0000 Subject: [PATCH 082/771] noquit on fatal errors clean command to clear environment --- phpdbg.c | 14 ++++++++------ phpdbg_help.c | 7 +++++++ phpdbg_help.h | 2 ++ phpdbg_prompt.c | 25 +++++++++++++++++++++++++ 4 files changed, 42 insertions(+), 6 deletions(-) diff --git a/phpdbg.c b/phpdbg.c index e7cb57d10c7..3d4908cf62b 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -353,12 +353,14 @@ int main(int argc, char *argv[]) /* {{{ */ zend_activate_modules(TSRMLS_C); } zend_end_try(); - zend_try { - do { - phpdbg_interactive(argc, argv TSRMLS_CC); - } while(!PHPDBG_G(quitting)); - } zend_end_try(); - + do { + zend_try { + phpdbg_interactive(argc, argv TSRMLS_CC); + } zend_catch { + + } zend_end_try(); + } while(!PHPDBG_G(quitting)); + if (ini_entries) { free(ini_entries); } diff --git a/phpdbg_help.c b/phpdbg_help.c index 4b218f31d2f..11430916c80 100644 --- a/phpdbg_help.c +++ b/phpdbg_help.c @@ -91,6 +91,13 @@ PHPDBG_HELP(break) /* {{{ */ return SUCCESS; } /* }}} */ +PHPDBG_HELP(clean) /* {{{ */ +{ + printf("While debugging you may experience errors because of attempts to redeclare classes, constants or functions.\n"); + printf("Cleaning the environment cleans these tables, so that files can be recompiled without exiting phpdbg.\n"); + return SUCCESS; +} /* }}} */ + PHPDBG_HELP(quiet) /* {{{ */ { printf("Setting quietness on will stop the OPLINE output during execution\n"); diff --git a/phpdbg_help.h b/phpdbg_help.h index ed67a3fec21..b48409f487e 100644 --- a/phpdbg_help.h +++ b/phpdbg_help.h @@ -41,6 +41,7 @@ PHPDBG_HELP(run); PHPDBG_HELP(eval); PHPDBG_HELP(print); PHPDBG_HELP(break); +PHPDBG_HELP(clean); PHPDBG_HELP(back); PHPDBG_HELP(quiet); @@ -56,6 +57,7 @@ static const phpdbg_command_t phpdbg_help_commands[] = { PHPDBG_HELP_D(eval, "access to eval() allows you to affect the environment during execution"), PHPDBG_HELP_D(print, "printing allows inspection of the execution environment"), PHPDBG_HELP_D(break, "breakpoints allow execution interruption"), + PHPDBG_HELP_D(clean, "resetting the environment is useful while debugging and recompiling"), PHPDBG_HELP_D(back, "show debug backtrace information during execution"), PHPDBG_HELP_D(quiet, "be quiet during execution"), {NULL, 0, 0} diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 9c0517119e0..f8a203c50ec 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -250,6 +250,30 @@ static PHPDBG_COMMAND(quit) /* {{{ */ return SUCCESS; } /* }}} */ +static int clean_non_persistent_constant_full(const zend_constant *c TSRMLS_DC) /* {{{ */ +{ + return (c->flags & CONST_PERSISTENT) ? 0 : 1; +} /* }}} */ + +static int clean_non_persistent_class_full(zend_class_entry **ce TSRMLS_DC) /* {{{ */ +{ + return ((*ce)->type == ZEND_INTERNAL_CLASS) ? ZEND_HASH_APPLY_KEEP : ZEND_HASH_APPLY_REMOVE; +} /* }}} */ + +static int clean_non_persistent_function_full(zend_function *function TSRMLS_DC) /* {{{ */ +{ + return (function->type == ZEND_INTERNAL_FUNCTION) ? ZEND_HASH_APPLY_KEEP : ZEND_HASH_APPLY_REMOVE; +} /* }}} */ + +static PHPDBG_COMMAND(clean) /* {{{ */ +{ + zend_hash_reverse_apply(EG(function_table), (apply_func_t) clean_non_persistent_function_full TSRMLS_CC); + zend_hash_reverse_apply(EG(class_table), (apply_func_t) clean_non_persistent_class_full TSRMLS_CC); + zend_hash_reverse_apply(EG(zend_constants), (apply_func_t) clean_non_persistent_constant_full TSRMLS_CC); + zend_hash_destroy(&EG(included_files)); + return SUCCESS; +} /* }}} */ + static PHPDBG_COMMAND(help) /* {{{ */ { printf("Welcome to phpdbg, the interactive PHP debugger.\n"); @@ -296,6 +320,7 @@ static const phpdbg_command_t phpdbg_prompt_commands[] = { PHPDBG_COMMAND_D(print, "print something"), PHPDBG_COMMAND_D(break, "set breakpoint"), PHPDBG_COMMAND_D(back, "show backtrace"), + PHPDBG_COMMAND_D(clean, "clean the execution environment"), PHPDBG_COMMAND_D(help, "show help menu"), PHPDBG_COMMAND_D(quiet, "silence some output"), PHPDBG_COMMAND_D(quit, "exit phpdbg"), From 5f82f002f0d72d948c1e52f79a2a66d5d00a3581 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Mon, 11 Nov 2013 08:08:26 +0000 Subject: [PATCH 083/771] clean not destroy included files remove argc, argv from phpdbg_interactive, unused --- phpdbg.c | 2 +- phpdbg_prompt.c | 10 +++++----- phpdbg_prompt.h | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/phpdbg.c b/phpdbg.c index 3d4908cf62b..bae33aab91b 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -355,7 +355,7 @@ int main(int argc, char *argv[]) /* {{{ */ do { zend_try { - phpdbg_interactive(argc, argv TSRMLS_CC); + phpdbg_interactive(TSRMLS_C); } zend_catch { } zend_end_try(); diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index f8a203c50ec..8238ea32cf6 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -270,7 +270,7 @@ static PHPDBG_COMMAND(clean) /* {{{ */ zend_hash_reverse_apply(EG(function_table), (apply_func_t) clean_non_persistent_function_full TSRMLS_CC); zend_hash_reverse_apply(EG(class_table), (apply_func_t) clean_non_persistent_class_full TSRMLS_CC); zend_hash_reverse_apply(EG(zend_constants), (apply_func_t) clean_non_persistent_constant_full TSRMLS_CC); - zend_hash_destroy(&EG(included_files)); + zend_hash_clean(&EG(included_files)); return SUCCESS; } /* }}} */ @@ -347,7 +347,7 @@ int phpdbg_do_cmd(const phpdbg_command_t *command, char *cmd_line, size_t cmd_le return FAILURE; } /* }}} */ -int phpdbg_interactive(int argc, char **argv TSRMLS_DC) /* {{{ */ +int phpdbg_interactive(TSRMLS_D) /* {{{ */ { char cmd[PHPDBG_MAX_CMD]; @@ -417,7 +417,7 @@ zend_vm_enter: if (PHPDBG_G(has_file_bp) && phpdbg_find_breakpoint_file(execute_data->op_array TSRMLS_CC) == SUCCESS) { - while (phpdbg_interactive(0, NULL TSRMLS_CC) != PHPDBG_NEXT) { + while (phpdbg_interactive(TSRMLS_C) != PHPDBG_NEXT) { continue; } } @@ -429,7 +429,7 @@ zend_vm_enter: || previous->opline->opcode == ZEND_DO_FCALL_BY_NAME) { if (phpdbg_find_breakpoint_symbol( previous->function_state.function TSRMLS_CC) == SUCCESS) { - while (phpdbg_interactive(0, NULL TSRMLS_CC) != PHPDBG_NEXT) { + while (phpdbg_interactive(TSRMLS_C) != PHPDBG_NEXT) { continue; } } @@ -443,7 +443,7 @@ zend_vm_enter: execute_data TSRMLS_CC); if (PHPDBG_G(stepping)) { - while (phpdbg_interactive(0, NULL TSRMLS_CC) != PHPDBG_NEXT) { + while (phpdbg_interactive(TSRMLS_C) != PHPDBG_NEXT) { continue; } } diff --git a/phpdbg_prompt.h b/phpdbg_prompt.h index 6675624dbd1..bddc7f99f7d 100644 --- a/phpdbg_prompt.h +++ b/phpdbg_prompt.h @@ -58,7 +58,7 @@ int phpdbg_do_cmd(const phpdbg_command_t *command, char *cmd_line, size_t cmd_le #define PHPDBG_COMMAND(name) \ int phpdbg_do_##name(const char *expr, size_t expr_len TSRMLS_DC) -int phpdbg_interactive(int argc, char **argv TSRMLS_DC); +int phpdbg_interactive(TSRMLS_D); void phpdbg_execute_ex(zend_execute_data *execute_data TSRMLS_DC); #endif /* PHPDBG_PROMPT_H */ From 3955dcf67313053ced77706e48d96c3f01eda631 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Mon, 11 Nov 2013 09:14:30 +0000 Subject: [PATCH 084/771] more output on setting break points output breaks with print command --- phpdbg_bp.c | 11 ++++++-- phpdbg_prompt.c | 70 ++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 75 insertions(+), 6 deletions(-) diff --git a/phpdbg_bp.c b/phpdbg_bp.c index 4ae8863534b..236c0b4e0eb 100644 --- a/phpdbg_bp.c +++ b/phpdbg_bp.c @@ -38,9 +38,9 @@ void phpdbg_set_breakpoint_file(const char *path, long line_num TSRMLS_DC) /* {{ zend_llist *break_files_ptr; size_t path_len = strlen(path); - new_break.filename = estrndup(path, path_len + 1); + new_break.filename = estrndup(path, path_len); new_break.line = line_num; - + PHPDBG_G(has_file_bp) = 1; if (zend_hash_find(&PHPDBG_G(bp_files), @@ -57,6 +57,9 @@ void phpdbg_set_breakpoint_file(const char *path, long line_num TSRMLS_DC) /* {{ new_break.id = PHPDBG_G(bp_count)++; zend_llist_add_element(break_files_ptr, &new_break); + + printf( + "Breakpoint #%d added at %s:%d\n", new_break.id, new_break.filename, new_break.line); } /* }}} */ void phpdbg_set_breakpoint_symbol(const char *name TSRMLS_DC) /* {{{ */ @@ -73,6 +76,10 @@ void phpdbg_set_breakpoint_symbol(const char *name TSRMLS_DC) /* {{{ */ zend_hash_update(&PHPDBG_G(bp_symbols), new_break.symbol, name_len, &new_break, sizeof(phpdbg_breaksymbol_t), NULL); + + printf("Breakpoint #%d added at %s\n", new_break.id, new_break.symbol); + } else { + printf("Breakpoint exists at %s\n", name); } } /* }}} */ diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 8238ea32cf6..cc109e8f8b0 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -187,8 +187,9 @@ static PHPDBG_COMMAND(print) /* {{{ */ printf("%s\n", expr); return SUCCESS; } - - printf("Showing Execution Context Information:\n"); + + printf("--------------------------------------\n"); + printf("Execution Context Information:\n"); printf("Exec\t\t%s\n", PHPDBG_G(exec) ? PHPDBG_G(exec) : "none"); printf("Compiled\t%s\n", PHPDBG_G(ops) ? "yes" : "no"); printf("Stepping\t%s\n", PHPDBG_G(stepping) ? "on" : "off"); @@ -203,11 +204,59 @@ static PHPDBG_COMMAND(print) /* {{{ */ } } printf("Executing\t%s\n", EG(in_execution) ? "yes" : "no"); - if (EG(in_execution)) { printf("VM Return\t%d\n", PHPDBG_G(vmret)); } - + printf("Classes\t\t%d\n", zend_hash_num_elements(EG(class_table))); + printf("Functions\t%d\n", zend_hash_num_elements(EG(function_table))); + printf("Constants\t%d\n", zend_hash_num_elements(EG(zend_constants))); + printf("Included\t%d\n", zend_hash_num_elements(&EG(included_files))); + + if (PHPDBG_G(has_file_bp)) { + HashPosition position; + zend_llist *points; + + printf("--------------------------------------\n"); + printf("File Break Point Information:\n"); + for (zend_hash_internal_pointer_reset_ex(&PHPDBG_G(bp_files), &position); + zend_hash_get_current_data_ex(&PHPDBG_G(bp_files), (void**) &points, &position) == SUCCESS; + zend_hash_move_forward_ex(&PHPDBG_G(bp_files), &position)) { + zend_llist_position lposition; + phpdbg_breakfile_t *brake; + + if ((brake = zend_llist_get_first_ex(points, &lposition))) { + printf("%s:\n", brake->filename); + do { + printf("\t%lu\n", brake->line); + } while ((brake = zend_llist_get_next_ex(points, &lposition))); + } + } + } + +#if 0 + if (PHPDBG_G(has_sym_bp)) { + HashPosition position; + zend_llist *points; + + printf("--------------------------------------\n"); + printf("Symbol Break Point Information:\n"); + for (zend_hash_internal_pointer_reset_ex(&PHPDBG_G(bp_symbols), &position); + zend_hash_get_current_data_ex(&PHPDBG_G(bp_symbols), (void**) &points, &position) == SUCCESS; + zend_hash_move_forward_ex(&PHPDBG_G(bp_symbols), &position)) { + zend_llist_position lposition; + phpdbg_breaksymbol_t *brake; + + if ((brake = zend_llist_get_first_ex(points, &lposition))) { + printf("%s:\n", brake->symbol); + do { + printf("\t%d\n", brake->id); + } while ((brake = zend_llist_get_next_ex(points, &lposition))); + } + } + } +#endif + + printf("--------------------------------------\n"); return SUCCESS; } /* }}} */ @@ -267,10 +316,23 @@ static int clean_non_persistent_function_full(zend_function *function TSRMLS_DC) static PHPDBG_COMMAND(clean) /* {{{ */ { + printf("Cleaning Environment:\n"); + printf("\tClasses: %d\n", zend_hash_num_elements(EG(class_table))); + printf("\tFunctions: %d\n", zend_hash_num_elements(EG(function_table))); + printf("\tConstants: %d\n", zend_hash_num_elements(EG(zend_constants))); + printf("\tIncluded: %d\n", zend_hash_num_elements(&EG(included_files))); + zend_hash_reverse_apply(EG(function_table), (apply_func_t) clean_non_persistent_function_full TSRMLS_CC); zend_hash_reverse_apply(EG(class_table), (apply_func_t) clean_non_persistent_class_full TSRMLS_CC); zend_hash_reverse_apply(EG(zend_constants), (apply_func_t) clean_non_persistent_constant_full TSRMLS_CC); zend_hash_clean(&EG(included_files)); + + printf("Clean Environment:\n"); + printf("\tClasses: %d\n", zend_hash_num_elements(EG(class_table))); + printf("\tFunctions: %d\n", zend_hash_num_elements(EG(function_table))); + printf("\tConstants: %d\n", zend_hash_num_elements(EG(zend_constants))); + printf("\tIncluded: %d\n", zend_hash_num_elements(&EG(included_files))); + return SUCCESS; } /* }}} */ From cb24989f0633e02156c3e56e2c3f2bbbda601b9c Mon Sep 17 00:00:00 2001 From: krakjoe Date: Mon, 11 Nov 2013 09:36:33 +0000 Subject: [PATCH 085/771] updates to break setting --- phpdbg_prompt.c | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index cc109e8f8b0..283b66bebd4 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -140,7 +140,6 @@ static PHPDBG_COMMAND(eval) /* {{{ */ if (expr) { if (zend_eval_stringl((char*)expr, expr_len-1, &retval, "eval()'d code" TSRMLS_CC) == SUCCESS) { - printf("Success: "); zend_print_zval_r(&retval, 0 TSRMLS_CC); printf("\n"); zval_dtor(&retval); @@ -263,19 +262,25 @@ static PHPDBG_COMMAND(print) /* {{{ */ static PHPDBG_COMMAND(break) /* {{{ */ { const char *line_pos = zend_memrchr(expr, ':', expr_len); - + if (line_pos) { char path[MAXPATHLEN], resolved_name[MAXPATHLEN]; long line_num = strtol(line_pos+1, NULL, 0); + + if (line_num) { + memcpy(path, expr, line_pos - expr); + path[line_pos - expr] = 0; + + if (expand_filepath(path, resolved_name TSRMLS_CC) == NULL) { + printf("Failed to expand path %s\n", path); + return FAILURE; + } - memcpy(path, expr, line_pos - expr); - path[line_pos - expr] = 0; - - if (expand_filepath(path, resolved_name TSRMLS_CC) == NULL) { - return FAILURE; + phpdbg_set_breakpoint_file(resolved_name, line_num TSRMLS_CC); + } else { + printf("No line specified in expression %s\n", expr); + return FAILURE; } - - phpdbg_set_breakpoint_file(resolved_name, line_num TSRMLS_CC); } else { char name[200]; size_t name_len = strlen(expr); From 67dc98732ea2ff0edda1d5d1440a0e1d593aa949 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Mon, 11 Nov 2013 11:54:41 +0000 Subject: [PATCH 086/771] break on opline --- phpdbg.c | 7 +++++-- phpdbg.h | 30 ++++++++++++++++-------------- phpdbg_bp.c | 47 ++++++++++++++++++++++++++++++++++++++++++++++- phpdbg_bp.h | 10 ++++++++++ phpdbg_prompt.c | 34 +++++++++++++++++++++++++--------- 5 files changed, 102 insertions(+), 26 deletions(-) diff --git a/phpdbg.c b/phpdbg.c index bae33aab91b..3aa8c035241 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -40,6 +40,7 @@ static inline void php_phpdbg_globals_ctor(zend_phpdbg_globals *pg) /* {{{ */ pg->last_params_len = 0; pg->has_file_bp = 0; pg->has_sym_bp = 0; + pg->has_opline_bp = 0; } /* }}} */ static PHP_MINIT_FUNCTION(phpdbg) /* {{{ */ @@ -66,7 +67,8 @@ static PHP_RINIT_FUNCTION(phpdbg) /* {{{ */ { zend_hash_init(&PHPDBG_G(bp_files), 8, NULL, php_phpdbg_destroy_bp_file, 0); zend_hash_init(&PHPDBG_G(bp_symbols), 8, NULL, php_phpdbg_destroy_bp_symbol, 0); - + zend_hash_init(&PHPDBG_G(bp_oplines), 8, NULL, NULL, 0); + return SUCCESS; } /* }}} */ @@ -74,7 +76,8 @@ static PHP_RSHUTDOWN_FUNCTION(phpdbg) /* {{{ */ { zend_hash_destroy(&PHPDBG_G(bp_files)); zend_hash_destroy(&PHPDBG_G(bp_symbols)); - + zend_hash_destroy(&PHPDBG_G(bp_oplines)); + if (PHPDBG_G(exec)) { efree(PHPDBG_G(exec)); } diff --git a/phpdbg.h b/phpdbg.h index e8c02da70ad..8adc69cf4f2 100644 --- a/phpdbg.h +++ b/phpdbg.h @@ -50,20 +50,22 @@ typedef struct _phpdbg_command_t phpdbg_command_t; ZEND_BEGIN_MODULE_GLOBALS(phpdbg) HashTable bp_files; HashTable bp_symbols; - char *exec; /* file to execute */ - size_t exec_len; /* size of exec */ - zend_op_array *ops; /* op_array */ - zval *retval; /* return value */ - int bp_count; /* breakpoint count */ - int stepping; /* stepping */ - int vmret; /* return from last opcode handler execution */ - zend_bool has_file_bp; /* file-based breakpoint has been set */ - zend_bool has_sym_bp; /* symbol-based breakpoint has been set */ - zend_bool quitting; /* quitting flag */ - int quiet; /* quiet */ - phpdbg_command_t *last; /* last command */ - const char *last_params;/* last expression */ - size_t last_params_len; /* last expression length */ + HashTable bp_oplines; + char *exec; /* file to execute */ + size_t exec_len; /* size of exec */ + zend_op_array *ops; /* op_array */ + zval *retval; /* return value */ + int bp_count; /* breakpoint count */ + int stepping; /* stepping */ + int vmret; /* return from last opcode handler execution */ + zend_bool has_file_bp; /* file-based breakpoint has been set */ + zend_bool has_sym_bp; /* symbol-based breakpoint has been set */ + zend_bool has_opline_bp; /* opline-based breakpoint has been set */ + zend_bool quitting; /* quitting flag */ + int quiet; /* quiet */ + phpdbg_command_t *last; /* last command */ + const char *last_params; /* last expression */ + size_t last_params_len; /* last expression length */ ZEND_END_MODULE_GLOBALS(phpdbg) #endif /* PHPDBG_H */ diff --git a/phpdbg_bp.c b/phpdbg_bp.c index 236c0b4e0eb..b8b2d35113e 100644 --- a/phpdbg_bp.c +++ b/phpdbg_bp.c @@ -59,7 +59,7 @@ void phpdbg_set_breakpoint_file(const char *path, long line_num TSRMLS_DC) /* {{ zend_llist_add_element(break_files_ptr, &new_break); printf( - "Breakpoint #%d added at %s:%d\n", new_break.id, new_break.filename, new_break.line); + "Breakpoint #%d added at %s:%ld\n", new_break.id, new_break.filename, new_break.line); } /* }}} */ void phpdbg_set_breakpoint_symbol(const char *name TSRMLS_DC) /* {{{ */ @@ -83,6 +83,29 @@ void phpdbg_set_breakpoint_symbol(const char *name TSRMLS_DC) /* {{{ */ } } /* }}} */ +void phpdbg_set_breakpoint_opline(const char *name TSRMLS_DC) /* {{{ */ +{ + size_t name_len = strlen(name); + + if (!zend_hash_exists(&PHPDBG_G(bp_oplines), name, name_len)) { + phpdbg_breakline_t new_break; + + PHPDBG_G(has_opline_bp) = 1; + + sscanf( + name, "%x", &new_break.opline); + + new_break.id = PHPDBG_G(bp_count)++; + + zend_hash_update(&PHPDBG_G(bp_oplines), name, + name_len, &new_break, sizeof(phpdbg_breakline_t), NULL); + + printf("Breakpoint #%d added at 0x%x\n", new_break.id, new_break.opline); + } else { + printf("Breakpoint exists at %s\n", name); + } +} /* }}} */ + int phpdbg_find_breakpoint_file(zend_op_array *op_array TSRMLS_DC) /* {{{ */ { size_t name_len = strlen(op_array->filename); @@ -130,3 +153,25 @@ int phpdbg_find_breakpoint_symbol(zend_function *fbc TSRMLS_DC) /* {{{ */ return FAILURE; } /* }}} */ + +int phpdbg_find_breakpoint_opline(void *opline TSRMLS_DC) /* {{{ */ +{ + char *opstring = NULL; + size_t opstring_len; + phpdbg_breakline_t *bp; + + opstring_len = asprintf( + &opstring, "0x%x", (unsigned int) opline); + + if (zend_hash_find(&PHPDBG_G(bp_oplines), opstring, opstring_len, + (void**)&bp) == SUCCESS) { + printf("Breakpoint #%d in 0x%x at %s\n", bp->id, bp->opline, + zend_get_executed_filename(TSRMLS_C)); + free(opstring); + + return SUCCESS; + } + + free(opstring); + return FAILURE; +} /* }}} */ diff --git a/phpdbg_bp.h b/phpdbg_bp.h index 104e9d0c1d9..3ab00048d95 100644 --- a/phpdbg_bp.h +++ b/phpdbg_bp.h @@ -37,10 +37,20 @@ typedef struct _phpdbg_breaksymbol_t { int id; } phpdbg_breaksymbol_t; +/** + * Breakpoint opline based representation + */ +typedef struct _phpdbg_breakline_t { + zend_uint opline; + int id; +} phpdbg_breakline_t; + void phpdbg_set_breakpoint_file(const char*, long TSRMLS_DC); void phpdbg_set_breakpoint_symbol(const char* TSRMLS_DC); +void phpdbg_set_breakpoint_opline(const char* TSRMLS_DC); int phpdbg_find_breakpoint_file(zend_op_array* TSRMLS_DC); int phpdbg_find_breakpoint_symbol(zend_function* TSRMLS_DC); +int phpdbg_find_breakpoint_opline(void * TSRMLS_DC); #endif /* PHPDBG_BP_H */ diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 283b66bebd4..9ab039e476b 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -80,7 +80,7 @@ static PHPDBG_COMMAND(compile) /* {{{ */ { if (PHPDBG_G(exec)) { if (PHPDBG_G(ops)) { - printf("Destroying compiled opcodes\n"); + printf("Destroying previously compiled opcodes\n"); destroy_op_array(PHPDBG_G(ops) TSRMLS_CC); efree(PHPDBG_G(ops)); PHPDBG_G(ops)=NULL; @@ -96,6 +96,8 @@ static PHPDBG_COMMAND(compile) /* {{{ */ static PHPDBG_COMMAND(step) /* {{{ */ { PHPDBG_G(stepping) = atoi(expr); + printf( + "Stepping %s\n", PHPDBG_G(stepping) ? "on" : "off"); return SUCCESS; } /* }}} */ @@ -186,7 +188,10 @@ static PHPDBG_COMMAND(print) /* {{{ */ printf("%s\n", expr); return SUCCESS; } - +#ifdef HAVE_READLINE_H + printf("HAVE READLINE\n"); +#endif + printf("--------------------------------------\n"); printf("Execution Context Information:\n"); printf("Exec\t\t%s\n", PHPDBG_G(exec) ? PHPDBG_G(exec) : "none"); @@ -282,14 +287,18 @@ static PHPDBG_COMMAND(break) /* {{{ */ return FAILURE; } } else { - char name[200]; - size_t name_len = strlen(expr); + if (expr_len > 2 && expr[0] == '0' && expr[1] == 'x') { + phpdbg_set_breakpoint_opline(expr TSRMLS_CC); + } else { + char name[200]; + size_t name_len = strlen(expr); - name_len = MIN(name_len, 200); - memcpy(name, expr, name_len); - name[name_len] = 0; + name_len = MIN(name_len, 200); + memcpy(name, expr, name_len); + name[name_len] = 0; - phpdbg_set_breakpoint_symbol(name TSRMLS_CC); + phpdbg_set_breakpoint_symbol(name TSRMLS_CC); + } } return SUCCESS; @@ -403,7 +412,7 @@ int phpdbg_do_cmd(const phpdbg_command_t *command, char *cmd_line, size_t cmd_le while (command && command->name) { if (command->name_len == expr_len && memcmp(cmd, command->name, expr_len) == 0) { - PHPDBG_G(last) = command; + PHPDBG_G(last) = (phpdbg_command_t*) command; PHPDBG_G(last_params) = params; PHPDBG_G(last_params_len) = cmd_len - expr_len; return command->handler(params, cmd_len - expr_len TSRMLS_CC); @@ -503,6 +512,13 @@ zend_vm_enter: } } } + + if (PHPDBG_G(has_opline_bp) + && phpdbg_find_breakpoint_opline(execute_data->opline TSRMLS_CC) == SUCCESS) { + while (phpdbg_interactive(TSRMLS_C) != PHPDBG_NEXT) { + continue; + } + } PHPDBG_G(vmret) = execute_data->opline->handler(execute_data TSRMLS_CC); From 28848919cf19edcb8035b1709e465173ab679b0a Mon Sep 17 00:00:00 2001 From: krakjoe Date: Mon, 11 Nov 2013 12:07:11 +0000 Subject: [PATCH 087/771] break opline help --- phpdbg_help.c | 3 +++ phpdbg_prompt.c | 13 +++++++++++++ 2 files changed, 16 insertions(+) diff --git a/phpdbg_help.c b/phpdbg_help.c index 11430916c80..9fbd7bd1379 100644 --- a/phpdbg_help.c +++ b/phpdbg_help.c @@ -83,11 +83,14 @@ PHPDBG_HELP(break) /* {{{ */ printf("Setting a breakpoint stops execution at a specific stage, the syntax is:\n"); printf("\tfile:line\n"); printf("\tfunction\n"); + printf("\t0x12345678\n"); printf("For example:\n"); printf("\tphpdbg> break test.php:1\n"); printf("Will break execution on line 1 of test.php\n"); printf("\tphpdbg> break my_function\n"); printf("Will break execution on entry to my_function\n"); + printf("\tphpdbg> break 0x4c79a40\n"); + printf("Will break at the opline with the address provided\n"); return SUCCESS; } /* }}} */ diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 9ab039e476b..e6b17912e80 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -259,6 +259,19 @@ static PHPDBG_COMMAND(print) /* {{{ */ } } #endif + + if (PHPDBG_G(has_opline_bp)) { + HashPosition position; + phpdbg_breakline_t *brake; + + printf("--------------------------------------\n"); + printf("Opline Break Point Information:\n"); + for (zend_hash_internal_pointer_reset_ex(&PHPDBG_G(bp_oplines), &position); + zend_hash_get_current_data_ex(&PHPDBG_G(bp_oplines), (void**) &brake, &position) == SUCCESS; + zend_hash_move_forward_ex(&PHPDBG_G(bp_oplines), &position)) { + printf("#%d\t0x%x\n", brake->id, brake->opline); + } + } printf("--------------------------------------\n"); return SUCCESS; From 616cb9c35f2b0a54300e0484a180090570485f1f Mon Sep 17 00:00:00 2001 From: krakjoe Date: Mon, 11 Nov 2013 12:09:57 +0000 Subject: [PATCH 088/771] ... --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 51f7be3041f..8dbc3861394 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ Features ======== - step through debugging - - break at function entry or file:line + - break at function entry, file:line or address - showing debug backtraces - easy manipulation of the environment with built-in eval() - sapi agnositicism, easy integration From 764d7d492cfdb406df21108ce5e2280a9b077c10 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Mon, 11 Nov 2013 13:04:21 +0000 Subject: [PATCH 089/771] fix break on opline --- phpdbg.c | 7 ++++++- phpdbg_bp.c | 35 ++++++++++++++--------------------- phpdbg_bp.h | 5 +++-- phpdbg_prompt.c | 2 +- 4 files changed, 24 insertions(+), 25 deletions(-) diff --git a/phpdbg.c b/phpdbg.c index 3aa8c035241..214a6fb0fba 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -63,11 +63,16 @@ static void php_phpdbg_destroy_bp_symbol(void *brake) /* {{{ */ efree((char*)((phpdbg_breaksymbol_t*)brake)->symbol); } /* }}} */ +static void php_phpdbg_destroy_bp_opline(void *brake) /* {{{ */ +{ + efree((char*)((phpdbg_breakline_t*)brake)->name); +} /* }}} */ + static PHP_RINIT_FUNCTION(phpdbg) /* {{{ */ { zend_hash_init(&PHPDBG_G(bp_files), 8, NULL, php_phpdbg_destroy_bp_file, 0); zend_hash_init(&PHPDBG_G(bp_symbols), 8, NULL, php_phpdbg_destroy_bp_symbol, 0); - zend_hash_init(&PHPDBG_G(bp_oplines), 8, NULL, NULL, 0); + zend_hash_init(&PHPDBG_G(bp_oplines), 8, NULL, php_phpdbg_destroy_bp_opline, 0); return SUCCESS; } /* }}} */ diff --git a/phpdbg_bp.c b/phpdbg_bp.c index b8b2d35113e..799ea11357c 100644 --- a/phpdbg_bp.c +++ b/phpdbg_bp.c @@ -85,22 +85,20 @@ void phpdbg_set_breakpoint_symbol(const char *name TSRMLS_DC) /* {{{ */ void phpdbg_set_breakpoint_opline(const char *name TSRMLS_DC) /* {{{ */ { - size_t name_len = strlen(name); - - if (!zend_hash_exists(&PHPDBG_G(bp_oplines), name, name_len)) { + zend_ulong opline = strtoul(name, 0, 16); + + if (!zend_hash_index_exists(&PHPDBG_G(bp_oplines), opline)) { phpdbg_breakline_t new_break; PHPDBG_G(has_opline_bp) = 1; - - sscanf( - name, "%x", &new_break.opline); - + + new_break.name = estrdup(name); + new_break.opline = opline; new_break.id = PHPDBG_G(bp_count)++; - zend_hash_update(&PHPDBG_G(bp_oplines), name, - name_len, &new_break, sizeof(phpdbg_breakline_t), NULL); + zend_hash_index_update(&PHPDBG_G(bp_oplines), opline, &new_break, sizeof(phpdbg_breakline_t), NULL); - printf("Breakpoint #%d added at 0x%x\n", new_break.id, new_break.opline); + printf("Breakpoint #%d added at %s\n", new_break.id, new_break.name); } else { printf("Breakpoint exists at %s\n", name); } @@ -154,24 +152,19 @@ int phpdbg_find_breakpoint_symbol(zend_function *fbc TSRMLS_DC) /* {{{ */ return FAILURE; } /* }}} */ -int phpdbg_find_breakpoint_opline(void *opline TSRMLS_DC) /* {{{ */ +typedef struct _zend_op *zend_op_ptr; + +int phpdbg_find_breakpoint_opline(zend_op_ptr opline TSRMLS_DC) /* {{{ */ { - char *opstring = NULL; - size_t opstring_len; phpdbg_breakline_t *bp; - opstring_len = asprintf( - &opstring, "0x%x", (unsigned int) opline); - - if (zend_hash_find(&PHPDBG_G(bp_oplines), opstring, opstring_len, - (void**)&bp) == SUCCESS) { - printf("Breakpoint #%d in 0x%x at %s\n", bp->id, bp->opline, + if (zend_hash_index_find(&PHPDBG_G(bp_oplines), (zend_ulong) opline, + (void**)&bp) == SUCCESS) { + printf("Breakpoint #%d in %s at %s\n", bp->id, bp->name, zend_get_executed_filename(TSRMLS_C)); - free(opstring); return SUCCESS; } - free(opstring); return FAILURE; } /* }}} */ diff --git a/phpdbg_bp.h b/phpdbg_bp.h index 3ab00048d95..164ff48facb 100644 --- a/phpdbg_bp.h +++ b/phpdbg_bp.h @@ -41,7 +41,8 @@ typedef struct _phpdbg_breaksymbol_t { * Breakpoint opline based representation */ typedef struct _phpdbg_breakline_t { - zend_uint opline; + const char *name; + zend_ulong opline; int id; } phpdbg_breakline_t; @@ -51,6 +52,6 @@ void phpdbg_set_breakpoint_opline(const char* TSRMLS_DC); int phpdbg_find_breakpoint_file(zend_op_array* TSRMLS_DC); int phpdbg_find_breakpoint_symbol(zend_function* TSRMLS_DC); -int phpdbg_find_breakpoint_opline(void * TSRMLS_DC); +int phpdbg_find_breakpoint_opline(zend_op* TSRMLS_DC); #endif /* PHPDBG_BP_H */ diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index e6b17912e80..5f8c56a0c5d 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -269,7 +269,7 @@ static PHPDBG_COMMAND(print) /* {{{ */ for (zend_hash_internal_pointer_reset_ex(&PHPDBG_G(bp_oplines), &position); zend_hash_get_current_data_ex(&PHPDBG_G(bp_oplines), (void**) &brake, &position) == SUCCESS; zend_hash_move_forward_ex(&PHPDBG_G(bp_oplines), &position)) { - printf("#%d\t0x%x\n", brake->id, brake->opline); + printf("#%d\t%s\n", brake->id, brake->name); } } From be460647ef869b602ca3cd98ae2560446547500f Mon Sep 17 00:00:00 2001 From: krakjoe Date: Mon, 11 Nov 2013 13:07:02 +0000 Subject: [PATCH 090/771] ... --- phpdbg_bp.c | 4 +--- phpdbg_bp.h | 5 ++++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/phpdbg_bp.c b/phpdbg_bp.c index 799ea11357c..c261ecc1060 100644 --- a/phpdbg_bp.c +++ b/phpdbg_bp.c @@ -152,9 +152,7 @@ int phpdbg_find_breakpoint_symbol(zend_function *fbc TSRMLS_DC) /* {{{ */ return FAILURE; } /* }}} */ -typedef struct _zend_op *zend_op_ptr; - -int phpdbg_find_breakpoint_opline(zend_op_ptr opline TSRMLS_DC) /* {{{ */ +int phpdbg_find_breakpoint_opline(phpdbg_opline_ptr_t opline TSRMLS_DC) /* {{{ */ { phpdbg_breakline_t *bp; diff --git a/phpdbg_bp.h b/phpdbg_bp.h index 164ff48facb..f6a8b6bcd7c 100644 --- a/phpdbg_bp.h +++ b/phpdbg_bp.h @@ -20,6 +20,9 @@ #ifndef PHPDBG_BP_H #define PHPDBG_BP_H +/* {{{ */ +typedef struct _zend_op *phpdbg_opline_ptr_t; /* }}} */ + /** * Breakpoint file-based representation */ @@ -52,6 +55,6 @@ void phpdbg_set_breakpoint_opline(const char* TSRMLS_DC); int phpdbg_find_breakpoint_file(zend_op_array* TSRMLS_DC); int phpdbg_find_breakpoint_symbol(zend_function* TSRMLS_DC); -int phpdbg_find_breakpoint_opline(zend_op* TSRMLS_DC); +int phpdbg_find_breakpoint_opline(phpdbg_opline_ptr_t TSRMLS_DC); #endif /* PHPDBG_BP_H */ From 207e54a1c5c32c71ef8fe0a036f105b9286d1f4f Mon Sep 17 00:00:00 2001 From: krakjoe Date: Mon, 11 Nov 2013 13:31:41 +0000 Subject: [PATCH 091/771] ... --- phpdbg_help.c | 14 +++++++++++--- phpdbg_help.h | 2 ++ phpdbg_prompt.c | 15 +++++++++++++++ 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/phpdbg_help.c b/phpdbg_help.c index 9fbd7bd1379..711dffa74a7 100644 --- a/phpdbg_help.c +++ b/phpdbg_help.c @@ -50,6 +50,7 @@ PHPDBG_HELP(compile) /* {{{ */ printf("Pre-compilation of the execution context provides the opportunity to inspect the opcodes before they are executed\n"); printf("The execution context must be set for compilation to succeed\n"); printf("If errors occur during compilation they must be resolved before execution can take place.\n"); + printf("It is a good idea to clean the environment between each compilation with the clean command\n"); printf("You do not need to exit phpdbg to retry compilation\n"); return SUCCESS; } /* }}} */ @@ -83,14 +84,14 @@ PHPDBG_HELP(break) /* {{{ */ printf("Setting a breakpoint stops execution at a specific stage, the syntax is:\n"); printf("\tfile:line\n"); printf("\tfunction\n"); - printf("\t0x12345678\n"); + printf("\t0x16\n"); printf("For example:\n"); printf("\tphpdbg> break test.php:1\n"); printf("Will break execution on line 1 of test.php\n"); printf("\tphpdbg> break my_function\n"); printf("Will break execution on entry to my_function\n"); - printf("\tphpdbg> break 0x4c79a40\n"); - printf("Will break at the opline with the address provided\n"); + printf("\tphpdbg> break 0x7ff68f570e08\n"); + printf("Will break at the opline with the address provided (addresses are shown during execution)\n"); return SUCCESS; } /* }}} */ @@ -101,6 +102,13 @@ PHPDBG_HELP(clean) /* {{{ */ return SUCCESS; } /* }}} */ +PHPDBG_HELP(clear) /* {{{ */ +{ + printf("Clearing breakpoints means you can once again run code without interruption\n"); + printf("Careful though, all breakpoints are lost; be sure debugging is complete before clearing\n"); + return SUCCESS; +} /* }}} */ + PHPDBG_HELP(quiet) /* {{{ */ { printf("Setting quietness on will stop the OPLINE output during execution\n"); diff --git a/phpdbg_help.h b/phpdbg_help.h index b48409f487e..449f4d1c586 100644 --- a/phpdbg_help.h +++ b/phpdbg_help.h @@ -42,6 +42,7 @@ PHPDBG_HELP(eval); PHPDBG_HELP(print); PHPDBG_HELP(break); PHPDBG_HELP(clean); +PHPDBG_HELP(clear); PHPDBG_HELP(back); PHPDBG_HELP(quiet); @@ -58,6 +59,7 @@ static const phpdbg_command_t phpdbg_help_commands[] = { PHPDBG_HELP_D(print, "printing allows inspection of the execution environment"), PHPDBG_HELP_D(break, "breakpoints allow execution interruption"), PHPDBG_HELP_D(clean, "resetting the environment is useful while debugging and recompiling"), + PHPDBG_HELP_D(clear, "clearing breakpoints allows you to run code without interruption"), PHPDBG_HELP_D(back, "show debug backtrace information during execution"), PHPDBG_HELP_D(quiet, "be quiet during execution"), {NULL, 0, 0} diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 5f8c56a0c5d..abc2b7fc775 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -363,6 +363,20 @@ static PHPDBG_COMMAND(clean) /* {{{ */ return SUCCESS; } /* }}} */ +static PHPDBG_COMMAND(clear) /* {{{ */ +{ + printf("Clearing Breakpoints:\n"); + printf("\tFile\t%d\n", zend_hash_num_elements(&PHPDBG_G(bp_files))); + printf("\tSymbols\t%d\n", zend_hash_num_elements(&PHPDBG_G(bp_symbols))); + printf("\tOplines\t%d\n", zend_hash_num_elements(&PHPDBG_G(bp_oplines))); + + zend_hash_clean(&PHPDBG_G(bp_files)); + zend_hash_clean(&PHPDBG_G(bp_symbols)); + zend_hash_clean(&PHPDBG_G(bp_oplines)); + + return SUCCESS; +} /* }}} */ + static PHPDBG_COMMAND(help) /* {{{ */ { printf("Welcome to phpdbg, the interactive PHP debugger.\n"); @@ -410,6 +424,7 @@ static const phpdbg_command_t phpdbg_prompt_commands[] = { PHPDBG_COMMAND_D(break, "set breakpoint"), PHPDBG_COMMAND_D(back, "show backtrace"), PHPDBG_COMMAND_D(clean, "clean the execution environment"), + PHPDBG_COMMAND_D(clear, "clear breakpoints"), PHPDBG_COMMAND_D(help, "show help menu"), PHPDBG_COMMAND_D(quiet, "silence some output"), PHPDBG_COMMAND_D(quit, "exit phpdbg"), From 56957d9e2596853b2c67c90011f408c8b5745dab Mon Sep 17 00:00:00 2001 From: krakjoe Date: Mon, 11 Nov 2013 14:03:14 +0000 Subject: [PATCH 092/771] output [] around phpdbg text --- phpdbg_bp.c | 16 ++++++------ phpdbg_prompt.c | 68 ++++++++++++++++++++++++------------------------- 2 files changed, 42 insertions(+), 42 deletions(-) diff --git a/phpdbg_bp.c b/phpdbg_bp.c index c261ecc1060..8185196bd12 100644 --- a/phpdbg_bp.c +++ b/phpdbg_bp.c @@ -59,7 +59,7 @@ void phpdbg_set_breakpoint_file(const char *path, long line_num TSRMLS_DC) /* {{ zend_llist_add_element(break_files_ptr, &new_break); printf( - "Breakpoint #%d added at %s:%ld\n", new_break.id, new_break.filename, new_break.line); + "[Breakpoint #%d added at %s:%ld]\n", new_break.id, new_break.filename, new_break.line); } /* }}} */ void phpdbg_set_breakpoint_symbol(const char *name TSRMLS_DC) /* {{{ */ @@ -77,9 +77,9 @@ void phpdbg_set_breakpoint_symbol(const char *name TSRMLS_DC) /* {{{ */ zend_hash_update(&PHPDBG_G(bp_symbols), new_break.symbol, name_len, &new_break, sizeof(phpdbg_breaksymbol_t), NULL); - printf("Breakpoint #%d added at %s\n", new_break.id, new_break.symbol); + printf("[Breakpoint #%d added at %s]\n", new_break.id, new_break.symbol); } else { - printf("Breakpoint exists at %s\n", name); + printf("[Breakpoint exists at %s]\n", name); } } /* }}} */ @@ -98,9 +98,9 @@ void phpdbg_set_breakpoint_opline(const char *name TSRMLS_DC) /* {{{ */ zend_hash_index_update(&PHPDBG_G(bp_oplines), opline, &new_break, sizeof(phpdbg_breakline_t), NULL); - printf("Breakpoint #%d added at %s\n", new_break.id, new_break.name); + printf("[Breakpoint #%d added at %s]\n", new_break.id, new_break.name); } else { - printf("Breakpoint exists at %s\n", name); + printf("[Breakpoint exists at %s]\n", name); } } /* }}} */ @@ -119,7 +119,7 @@ int phpdbg_find_breakpoint_file(zend_op_array *op_array TSRMLS_DC) /* {{{ */ const phpdbg_breakfile_t *bp = (phpdbg_breakfile_t*)le->data; if (bp->line == (*EG(opline_ptr))->lineno) { - printf("Breakpoint #%d at %s:%ld\n", bp->id, bp->filename, bp->line); + printf("[Breakpoint #%d at %s:%ld]\n", bp->id, bp->filename, bp->line); return SUCCESS; } } @@ -144,7 +144,7 @@ int phpdbg_find_breakpoint_symbol(zend_function *fbc TSRMLS_DC) /* {{{ */ if (zend_hash_find(&PHPDBG_G(bp_symbols), fname, strlen(fname), (void**)&bp) == SUCCESS) { - printf("Breakpoint #%d in %s() at %s\n", bp->id, bp->symbol, + printf("[Breakpoint #%d in %s() at %s]\n", bp->id, bp->symbol, zend_get_executed_filename(TSRMLS_C)); return SUCCESS; } @@ -158,7 +158,7 @@ int phpdbg_find_breakpoint_opline(phpdbg_opline_ptr_t opline TSRMLS_DC) /* {{{ * if (zend_hash_index_find(&PHPDBG_G(bp_oplines), (zend_ulong) opline, (void**)&bp) == SUCCESS) { - printf("Breakpoint #%d in %s at %s\n", bp->id, bp->name, + printf("[Breakpoint #%d in %s at %s]\n", bp->id, bp->name, zend_get_executed_filename(TSRMLS_C)); return SUCCESS; diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index abc2b7fc775..24199067c70 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -33,13 +33,13 @@ ZEND_EXTERN_MODULE_GLOBALS(phpdbg); static PHPDBG_COMMAND(exec) /* {{{ */ { if (PHPDBG_G(exec)) { - printf("Unsetting old execution context: %s\n", PHPDBG_G(exec)); + printf("[Unsetting old execution context: %s]\n", PHPDBG_G(exec)); efree(PHPDBG_G(exec)); PHPDBG_G(exec) = NULL; } if (PHPDBG_G(ops)) { - printf("Destroying compiled opcodes\n"); + printf("[Destroying compiled opcodes]\n"); destroy_op_array(PHPDBG_G(ops) TSRMLS_CC); efree(PHPDBG_G(ops)); PHPDBG_G(ops) = NULL; @@ -47,7 +47,7 @@ static PHPDBG_COMMAND(exec) /* {{{ */ PHPDBG_G(exec) = estrndup(expr, PHPDBG_G(exec_len) = expr_len); - printf("Set execution context: %s\n", PHPDBG_G(exec)); + printf("[Set execution context: %s]\n", PHPDBG_G(exec)); return SUCCESS; } /* }}} */ @@ -57,20 +57,20 @@ static inline int phpdbg_compile(TSRMLS_D) /* {{{ */ zend_file_handle fh; if (!EG(in_execution)) { - printf("Attempting compilation of %s\n", PHPDBG_G(exec)); + printf("[Attempting compilation of %s]\n", PHPDBG_G(exec)); if (php_stream_open_for_zend_ex(PHPDBG_G(exec), &fh, USE_PATH|STREAM_OPEN_FOR_INCLUDE TSRMLS_CC) == SUCCESS) { PHPDBG_G(ops) = zend_compile_file( &fh, ZEND_INCLUDE TSRMLS_CC); zend_destroy_file_handle(&fh TSRMLS_CC); - printf("Success\n"); + printf("[Success]\n"); return SUCCESS; } else { - printf("Could not open file %s\n", PHPDBG_G(exec)); + printf("[Could not open file %s]\n", PHPDBG_G(exec)); } } else { - printf("Cannot compile while in execution\n"); + printf("[Cannot compile while in execution]\n"); } return FAILURE; @@ -80,7 +80,7 @@ static PHPDBG_COMMAND(compile) /* {{{ */ { if (PHPDBG_G(exec)) { if (PHPDBG_G(ops)) { - printf("Destroying previously compiled opcodes\n"); + printf("[Destroying previously compiled opcodes]\n"); destroy_op_array(PHPDBG_G(ops) TSRMLS_CC); efree(PHPDBG_G(ops)); PHPDBG_G(ops)=NULL; @@ -88,7 +88,7 @@ static PHPDBG_COMMAND(compile) /* {{{ */ return phpdbg_compile(TSRMLS_C); } else { - printf("No execution context\n"); + printf("[No execution context]\n"); return FAILURE; } } /* }}} */ @@ -97,7 +97,7 @@ static PHPDBG_COMMAND(step) /* {{{ */ { PHPDBG_G(stepping) = atoi(expr); printf( - "Stepping %s\n", PHPDBG_G(stepping) ? "on" : "off"); + "[Stepping %s]\n", PHPDBG_G(stepping) ? "on" : "off"); return SUCCESS; } /* }}} */ @@ -111,7 +111,7 @@ static PHPDBG_COMMAND(run) /* {{{ */ if (PHPDBG_G(ops) || PHPDBG_G(exec)) { if (!PHPDBG_G(ops)) { if (phpdbg_compile(TSRMLS_C) == FAILURE) { - printf("Failed to compile %s, cannot run\n", PHPDBG_G(exec)); + printf("[Failed to compile %s, cannot run]\n", PHPDBG_G(exec)); return FAILURE; } } @@ -123,14 +123,14 @@ static PHPDBG_COMMAND(run) /* {{{ */ zend_execute(EG(active_op_array) TSRMLS_CC); } zend_catch { if (!PHPDBG_G(quitting)) { - printf("Caught excetion in VM\n"); + printf("[Caught excetion in VM]\n"); return FAILURE; } else return SUCCESS; } zend_end_try(); return SUCCESS; } else { - printf("Nothing to execute !\n"); + printf("[Nothing to execute !]\n"); return FAILURE; } } /* }}} */ @@ -147,7 +147,7 @@ static PHPDBG_COMMAND(eval) /* {{{ */ zval_dtor(&retval); } } else { - printf("No expression provided !\n"); + printf("[No expression provided !]\n"); return FAILURE; } @@ -157,7 +157,7 @@ static PHPDBG_COMMAND(eval) /* {{{ */ static PHPDBG_COMMAND(back) /* {{{ */ { if (!EG(in_execution)) { - printf("Not executing !\n"); + printf("[Not executing !]\n"); return FAILURE; } zval zbacktrace; @@ -290,13 +290,13 @@ static PHPDBG_COMMAND(break) /* {{{ */ path[line_pos - expr] = 0; if (expand_filepath(path, resolved_name TSRMLS_CC) == NULL) { - printf("Failed to expand path %s\n", path); + printf("[Failed to expand path %s]\n", path); return FAILURE; } phpdbg_set_breakpoint_file(resolved_name, line_num TSRMLS_CC); } else { - printf("No line specified in expression %s\n", expr); + printf("[No line specified in expression %s]\n", expr); return FAILURE; } } else { @@ -343,32 +343,32 @@ static int clean_non_persistent_function_full(zend_function *function TSRMLS_DC) static PHPDBG_COMMAND(clean) /* {{{ */ { - printf("Cleaning Environment:\n"); - printf("\tClasses: %d\n", zend_hash_num_elements(EG(class_table))); - printf("\tFunctions: %d\n", zend_hash_num_elements(EG(function_table))); - printf("\tConstants: %d\n", zend_hash_num_elements(EG(zend_constants))); - printf("\tIncluded: %d\n", zend_hash_num_elements(&EG(included_files))); + printf("[Cleaning Environment:]\n"); + printf("[\tClasses: %d]\n", zend_hash_num_elements(EG(class_table))); + printf("[\tFunctions: %d]\n", zend_hash_num_elements(EG(function_table))); + printf("[\tConstants: %d]\n", zend_hash_num_elements(EG(zend_constants))); + printf("[\tIncluded: %d]\n", zend_hash_num_elements(&EG(included_files))); zend_hash_reverse_apply(EG(function_table), (apply_func_t) clean_non_persistent_function_full TSRMLS_CC); zend_hash_reverse_apply(EG(class_table), (apply_func_t) clean_non_persistent_class_full TSRMLS_CC); zend_hash_reverse_apply(EG(zend_constants), (apply_func_t) clean_non_persistent_constant_full TSRMLS_CC); zend_hash_clean(&EG(included_files)); - printf("Clean Environment:\n"); - printf("\tClasses: %d\n", zend_hash_num_elements(EG(class_table))); - printf("\tFunctions: %d\n", zend_hash_num_elements(EG(function_table))); - printf("\tConstants: %d\n", zend_hash_num_elements(EG(zend_constants))); - printf("\tIncluded: %d\n", zend_hash_num_elements(&EG(included_files))); + printf("[Clean Environment:]\n"); + printf("[\tClasses: %d]\n", zend_hash_num_elements(EG(class_table))); + printf("[\tFunctions: %d]\n", zend_hash_num_elements(EG(function_table))); + printf("[\tConstants: %d]\n", zend_hash_num_elements(EG(zend_constants))); + printf("[\tIncluded: %d]\n", zend_hash_num_elements(&EG(included_files))); return SUCCESS; } /* }}} */ static PHPDBG_COMMAND(clear) /* {{{ */ { - printf("Clearing Breakpoints:\n"); - printf("\tFile\t%d\n", zend_hash_num_elements(&PHPDBG_G(bp_files))); - printf("\tSymbols\t%d\n", zend_hash_num_elements(&PHPDBG_G(bp_symbols))); - printf("\tOplines\t%d\n", zend_hash_num_elements(&PHPDBG_G(bp_oplines))); + printf("[Clearing Breakpoints:]\n"); + printf("[\tFile\t%d]\n", zend_hash_num_elements(&PHPDBG_G(bp_files))); + printf("[\tSymbols\t%d]\n", zend_hash_num_elements(&PHPDBG_G(bp_symbols))); + printf("[\tOplines\t%d]\n", zend_hash_num_elements(&PHPDBG_G(bp_oplines))); zend_hash_clean(&PHPDBG_G(bp_files)); zend_hash_clean(&PHPDBG_G(bp_symbols)); @@ -379,7 +379,7 @@ static PHPDBG_COMMAND(clear) /* {{{ */ static PHPDBG_COMMAND(help) /* {{{ */ { - printf("Welcome to phpdbg, the interactive PHP debugger.\n"); + printf("[Welcome to phpdbg, the interactive PHP debugger.]\n"); if (!expr_len) { const phpdbg_command_t *prompt_command = phpdbg_prompt_commands; @@ -403,7 +403,7 @@ static PHPDBG_COMMAND(help) /* {{{ */ printf("failed to find help command: %s\n", expr); } } - printf("Please report bugs to \n"); + printf("[Please report bugs to ]\n"); return SUCCESS; } /* }}} */ @@ -470,7 +470,7 @@ int phpdbg_interactive(TSRMLS_D) /* {{{ */ case FAILURE: if (!PHPDBG_G(quitting)) { printf( - "Failed to execute %s !\n", cmd); + "[Failed to execute %s !]\n", cmd); } break; From 5fdae4612b817c39655f10e7619465d655c349e5 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Mon, 11 Nov 2013 14:07:07 +0000 Subject: [PATCH 093/771] ... --- phpdbg_prompt.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 24199067c70..8db72ed44a0 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -79,11 +79,13 @@ static inline int phpdbg_compile(TSRMLS_D) /* {{{ */ static PHPDBG_COMMAND(compile) /* {{{ */ { if (PHPDBG_G(exec)) { - if (PHPDBG_G(ops)) { - printf("[Destroying previously compiled opcodes]\n"); - destroy_op_array(PHPDBG_G(ops) TSRMLS_CC); - efree(PHPDBG_G(ops)); - PHPDBG_G(ops)=NULL; + if (!EG(in_execution)) { + if (PHPDBG_G(ops)) { + printf("[Destroying previously compiled opcodes]\n"); + destroy_op_array(PHPDBG_G(ops) TSRMLS_CC); + efree(PHPDBG_G(ops)); + PHPDBG_G(ops)=NULL; + } } return phpdbg_compile(TSRMLS_C); From dc3ef209641194e5ccea7ad493c1587b5f74ec4f Mon Sep 17 00:00:00 2001 From: krakjoe Date: Mon, 11 Nov 2013 14:11:06 +0000 Subject: [PATCH 094/771] ... --- phpdbg_help.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/phpdbg_help.c b/phpdbg_help.c index 711dffa74a7..6cbac92fa92 100644 --- a/phpdbg_help.c +++ b/phpdbg_help.c @@ -92,6 +92,8 @@ PHPDBG_HELP(break) /* {{{ */ printf("Will break execution on entry to my_function\n"); printf("\tphpdbg> break 0x7ff68f570e08\n"); printf("Will break at the opline with the address provided (addresses are shown during execution)\n"); + printf("It is important to note, an address is only valid for the current compiled representation of the script\n"); + printf("If you have to clean the environment and recompile then your opline break points will be invalid\n"); return SUCCESS; } /* }}} */ From 34ae94ad9a080b0a4862344a51fa0da8dfd4d80f Mon Sep 17 00:00:00 2001 From: krakjoe Date: Mon, 11 Nov 2013 14:33:53 +0000 Subject: [PATCH 095/771] phpdbg_break userland --- phpdbg.c | 19 ++++++++++++++++++- phpdbg_bp.c | 19 +++++++++++++++++++ phpdbg_bp.h | 1 + phpdbg_prompt.c | 4 ++++ test.php | 2 ++ 5 files changed, 44 insertions(+), 1 deletion(-) diff --git a/phpdbg.c b/phpdbg.c index 214a6fb0fba..6ed4e654df5 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -94,10 +94,27 @@ static PHP_RSHUTDOWN_FUNCTION(phpdbg) /* {{{ */ return SUCCESS; } /* }}} */ +static PHP_FUNCTION(phpdbg_break) /* {{{ */ +{ + if (EG(active_op_array)) { + phpdbg_set_breakpoint_opline_ex( + EG(active_op_array)->opcodes TSRMLS_CC); + } +} /* }}} */ + +zend_function_entry phpdbg_user_functions[] = { + PHP_FE(phpdbg_break, NULL) +#ifdef PHP_FE_END + PHP_FE_END +#else + {NULL,NULL,NULL} +#endif +}; + static zend_module_entry sapi_phpdbg_module_entry = { STANDARD_MODULE_HEADER, "phpdbg", - NULL, + phpdbg_user_functions, PHP_MINIT(phpdbg), NULL, PHP_RINIT(phpdbg), diff --git a/phpdbg_bp.c b/phpdbg_bp.c index 8185196bd12..e17608c6090 100644 --- a/phpdbg_bp.c +++ b/phpdbg_bp.c @@ -104,6 +104,24 @@ void phpdbg_set_breakpoint_opline(const char *name TSRMLS_DC) /* {{{ */ } } /* }}} */ +void phpdbg_set_breakpoint_opline_ex(phpdbg_opline_ptr_t opline TSRMLS_DC) /* {{{ */ +{ + if (!zend_hash_index_exists(&PHPDBG_G(bp_oplines), (zend_ulong) opline)) { + phpdbg_breakline_t new_break; + + PHPDBG_G(has_opline_bp) = 1; + + asprintf((char**)&new_break.name, "%#x", opline); + + new_break.opline = opline; + new_break.id = PHPDBG_G(bp_count)++; + + zend_hash_index_update(&PHPDBG_G(bp_oplines), opline, &new_break, sizeof(phpdbg_breakline_t), NULL); + + printf("[Breakpoint #%d added at %#x]\n", new_break.id, new_break.opline); + } +} /* }}} */ + int phpdbg_find_breakpoint_file(zend_op_array *op_array TSRMLS_DC) /* {{{ */ { size_t name_len = strlen(op_array->filename); @@ -166,3 +184,4 @@ int phpdbg_find_breakpoint_opline(phpdbg_opline_ptr_t opline TSRMLS_DC) /* {{{ * return FAILURE; } /* }}} */ + diff --git a/phpdbg_bp.h b/phpdbg_bp.h index f6a8b6bcd7c..1f04af9f6c6 100644 --- a/phpdbg_bp.h +++ b/phpdbg_bp.h @@ -52,6 +52,7 @@ typedef struct _phpdbg_breakline_t { void phpdbg_set_breakpoint_file(const char*, long TSRMLS_DC); void phpdbg_set_breakpoint_symbol(const char* TSRMLS_DC); void phpdbg_set_breakpoint_opline(const char* TSRMLS_DC); +void phpdbg_set_breakpoint_opline_ex(phpdbg_opline_ptr_t TSRMLS_DC); int phpdbg_find_breakpoint_file(zend_op_array* TSRMLS_DC); int phpdbg_find_breakpoint_symbol(zend_function* TSRMLS_DC); diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 8db72ed44a0..f0f299ec51c 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -376,6 +376,10 @@ static PHPDBG_COMMAND(clear) /* {{{ */ zend_hash_clean(&PHPDBG_G(bp_symbols)); zend_hash_clean(&PHPDBG_G(bp_oplines)); + PHPDBG_G(has_file_bp) = 0; + PHPDBG_G(has_sym_bp) = 0; + PHPDBG_G(has_opline_bp) = 0; + return SUCCESS; } /* }}} */ diff --git a/test.php b/test.php index bed99d3e9b7..3ac566ce761 100644 --- a/test.php +++ b/test.php @@ -10,6 +10,8 @@ if (!isset($greeting)) { echo test(); } +phpdbg_break(); + test2(); return true; ?> From 97fda0eaf29310df1224e2eb826eb1d41a076e0e Mon Sep 17 00:00:00 2001 From: krakjoe Date: Mon, 11 Nov 2013 14:38:11 +0000 Subject: [PATCH 096/771] precise break from userland --- phpdbg.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/phpdbg.c b/phpdbg.c index 6ed4e654df5..f686c1ac4d2 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -96,9 +96,9 @@ static PHP_RSHUTDOWN_FUNCTION(phpdbg) /* {{{ */ static PHP_FUNCTION(phpdbg_break) /* {{{ */ { - if (EG(active_op_array)) { + if (EG(current_execute_data)) { phpdbg_set_breakpoint_opline_ex( - EG(active_op_array)->opcodes TSRMLS_CC); + EG(current_execute_data)->opline TSRMLS_CC); } } /* }}} */ From e8c98020efcd9534830758bc458f4189496b54fc Mon Sep 17 00:00:00 2001 From: krakjoe Date: Mon, 11 Nov 2013 14:55:36 +0000 Subject: [PATCH 097/771] fix breakpoint in userland --- phpdbg.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/phpdbg.c b/phpdbg.c index f686c1ac4d2..2845add3c01 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -96,9 +96,11 @@ static PHP_RSHUTDOWN_FUNCTION(phpdbg) /* {{{ */ static PHP_FUNCTION(phpdbg_break) /* {{{ */ { - if (EG(current_execute_data)) { + if (EG(current_execute_data) && EG(active_op_array)) { + zend_ulong opline_num = EG(current_execute_data)->opline - EG(active_op_array)->opcodes; + phpdbg_set_breakpoint_opline_ex( - EG(current_execute_data)->opline TSRMLS_CC); + &EG(active_op_array)->opcodes[opline_num+1] TSRMLS_CC); } } /* }}} */ From 632c89b65aea9315b218ba766f092131d54f690b Mon Sep 17 00:00:00 2001 From: krakjoe Date: Mon, 11 Nov 2013 14:59:51 +0000 Subject: [PATCH 098/771] fix output from userland break point insertion --- phpdbg_bp.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/phpdbg_bp.c b/phpdbg_bp.c index e17608c6090..2bbb12f44bd 100644 --- a/phpdbg_bp.c +++ b/phpdbg_bp.c @@ -111,14 +111,15 @@ void phpdbg_set_breakpoint_opline_ex(phpdbg_opline_ptr_t opline TSRMLS_DC) /* {{ PHPDBG_G(has_opline_bp) = 1; - asprintf((char**)&new_break.name, "%#x", opline); + asprintf( + (char**)&new_break.name, "%p", (zend_op*) opline); - new_break.opline = opline; + new_break.opline = (zend_ulong) opline; new_break.id = PHPDBG_G(bp_count)++; - zend_hash_index_update(&PHPDBG_G(bp_oplines), opline, &new_break, sizeof(phpdbg_breakline_t), NULL); + zend_hash_index_update(&PHPDBG_G(bp_oplines), (zend_ulong) opline, &new_break, sizeof(phpdbg_breakline_t), NULL); - printf("[Breakpoint #%d added at %#x]\n", new_break.id, new_break.opline); + printf("[Breakpoint #%d added at %p]\n", new_break.id, (zend_op*) new_break.opline); } } /* }}} */ From da065d6fb2ad54450daf8f1b50d2934c6880a546 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Mon, 11 Nov 2013 15:14:37 +0000 Subject: [PATCH 099/771] no estrdup on opline breakpoints --- phpdbg.c | 18 +++++++++++++++--- phpdbg_bp.c | 2 +- test.php | 4 ++++ 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/phpdbg.c b/phpdbg.c index 2845add3c01..351bdc6ba26 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -65,7 +65,7 @@ static void php_phpdbg_destroy_bp_symbol(void *brake) /* {{{ */ static void php_phpdbg_destroy_bp_opline(void *brake) /* {{{ */ { - efree((char*)((phpdbg_breakline_t*)brake)->name); + free((char*)((phpdbg_breakline_t*)brake)->name); } /* }}} */ static PHP_RINIT_FUNCTION(phpdbg) /* {{{ */ @@ -94,17 +94,29 @@ static PHP_RSHUTDOWN_FUNCTION(phpdbg) /* {{{ */ return SUCCESS; } /* }}} */ -static PHP_FUNCTION(phpdbg_break) /* {{{ */ +/* {{{ proto void phpdbg_break(void) + instructs phpdbg to insert a breakpoint at the next opcode */ +static PHP_FUNCTION(phpdbg_break) { if (EG(current_execute_data) && EG(active_op_array)) { - zend_ulong opline_num = EG(current_execute_data)->opline - EG(active_op_array)->opcodes; + zend_ulong opline_num = (EG(current_execute_data)->opline - EG(active_op_array)->opcodes); phpdbg_set_breakpoint_opline_ex( &EG(active_op_array)->opcodes[opline_num+1] TSRMLS_CC); } } /* }}} */ +/* {{{ proto void phpdbg_clear(void) + instructs phpdbg to clear breakpoints */ +static PHP_FUNCTION(phpdbg_clear) +{ + zend_hash_clean(&PHPDBG_G(bp_files)); + zend_hash_clean(&PHPDBG_G(bp_symbols)); + zend_hash_clean(&PHPDBG_G(bp_oplines)); +} /* }}} */ + zend_function_entry phpdbg_user_functions[] = { + PHP_FE(phpdbg_clear, NULL) PHP_FE(phpdbg_break, NULL) #ifdef PHP_FE_END PHP_FE_END diff --git a/phpdbg_bp.c b/phpdbg_bp.c index 2bbb12f44bd..6f615992d0e 100644 --- a/phpdbg_bp.c +++ b/phpdbg_bp.c @@ -92,7 +92,7 @@ void phpdbg_set_breakpoint_opline(const char *name TSRMLS_DC) /* {{{ */ PHPDBG_G(has_opline_bp) = 1; - new_break.name = estrdup(name); + new_break.name = strdup(name); new_break.opline = opline; new_break.id = PHPDBG_G(bp_count)++; diff --git a/test.php b/test.php index 3ac566ce761..938d7d8323d 100644 --- a/test.php +++ b/test.php @@ -1,6 +1,10 @@ Date: Mon, 11 Nov 2013 15:54:33 +0000 Subject: [PATCH 100/771] stop multiple executions from occuring at once, #5 --- phpdbg.c | 2 +- phpdbg_prompt.c | 23 ++++++++++++++++++----- test.php | 1 + 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/phpdbg.c b/phpdbg.c index 351bdc6ba26..d24016275c7 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -396,7 +396,7 @@ int main(int argc, char *argv[]) /* {{{ */ zend_try { phpdbg_interactive(TSRMLS_C); } zend_catch { - + } zend_end_try(); } while(!PHPDBG_G(quitting)); diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index f0f299ec51c..3e3929ec437 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -110,6 +110,11 @@ static PHPDBG_COMMAND(next) /* {{{ */ static PHPDBG_COMMAND(run) /* {{{ */ { + if (EG(in_execution)) { + printf("[Cannot start another execution while on is in progress]\n"); + return FAILURE; + } + if (PHPDBG_G(ops) || PHPDBG_G(exec)) { if (!PHPDBG_G(ops)) { if (phpdbg_compile(TSRMLS_C) == FAILURE) { @@ -528,7 +533,9 @@ zend_vm_enter: if (PHPDBG_G(has_file_bp) && phpdbg_find_breakpoint_file(execute_data->op_array TSRMLS_CC) == SUCCESS) { while (phpdbg_interactive(TSRMLS_C) != PHPDBG_NEXT) { - continue; + if (!PHPDBG_G(quitting)) { + continue; + } } } @@ -540,7 +547,9 @@ zend_vm_enter: if (phpdbg_find_breakpoint_symbol( previous->function_state.function TSRMLS_CC) == SUCCESS) { while (phpdbg_interactive(TSRMLS_C) != PHPDBG_NEXT) { - continue; + if (!PHPDBG_G(quitting)) { + continue; + } } } } @@ -550,10 +559,12 @@ zend_vm_enter: if (PHPDBG_G(has_opline_bp) && phpdbg_find_breakpoint_opline(execute_data->opline TSRMLS_CC) == SUCCESS) { while (phpdbg_interactive(TSRMLS_C) != PHPDBG_NEXT) { - continue; + if (!PHPDBG_G(quitting)) { + continue; + } } } - + PHPDBG_G(vmret) = execute_data->opline->handler(execute_data TSRMLS_CC); phpdbg_print_opline( @@ -561,7 +572,9 @@ zend_vm_enter: if (PHPDBG_G(stepping)) { while (phpdbg_interactive(TSRMLS_C) != PHPDBG_NEXT) { - continue; + if (!PHPDBG_G(quitting)) { + continue; + } } } diff --git a/test.php b/test.php index 938d7d8323d..20fc66c7c5b 100644 --- a/test.php +++ b/test.php @@ -6,6 +6,7 @@ function test() { $hidden = "variable"; phpdbg_break(); } + function test2() { echo "Hello World 2\n"; } From 3c644612af9f896789da4dc094b7d39193185a8f Mon Sep 17 00:00:00 2001 From: krakjoe Date: Mon, 11 Nov 2013 17:01:33 +0000 Subject: [PATCH 101/771] typo --- phpdbg_prompt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 3e3929ec437..797df423dcd 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -111,7 +111,7 @@ static PHPDBG_COMMAND(next) /* {{{ */ static PHPDBG_COMMAND(run) /* {{{ */ { if (EG(in_execution)) { - printf("[Cannot start another execution while on is in progress]\n"); + printf("[Cannot start another execution while one is in progress]\n"); return FAILURE; } From f62b47c9ff3856681314495dbe3c02d8cb8a7b2f Mon Sep 17 00:00:00 2001 From: krakjoe Date: Mon, 11 Nov 2013 17:06:30 +0000 Subject: [PATCH 102/771] fix opcode missing on eval --- phpdbg_prompt.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 797df423dcd..a690f522680 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -530,6 +530,9 @@ zend_vm_enter: } #endif + phpdbg_print_opline( + execute_data TSRMLS_CC); + if (PHPDBG_G(has_file_bp) && phpdbg_find_breakpoint_file(execute_data->op_array TSRMLS_CC) == SUCCESS) { while (phpdbg_interactive(TSRMLS_C) != PHPDBG_NEXT) { @@ -567,9 +570,6 @@ zend_vm_enter: PHPDBG_G(vmret) = execute_data->opline->handler(execute_data TSRMLS_CC); - phpdbg_print_opline( - execute_data TSRMLS_CC); - if (PHPDBG_G(stepping)) { while (phpdbg_interactive(TSRMLS_C) != PHPDBG_NEXT) { if (!PHPDBG_G(quitting)) { From fb815caf7af1a570806f32c906aee5ee9018f1b0 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Mon, 11 Nov 2013 17:09:08 +0000 Subject: [PATCH 103/771] fix segfault on empty eval --- phpdbg_prompt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index a690f522680..2377a14f07f 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -146,7 +146,7 @@ static PHPDBG_COMMAND(eval) /* {{{ */ { zval retval; - if (expr) { + if (expr_len) { if (zend_eval_stringl((char*)expr, expr_len-1, &retval, "eval()'d code" TSRMLS_CC) == SUCCESS) { zend_print_zval_r(&retval, 0 TSRMLS_CC); From 5ef19b1b455f1ed503c73807182ae3d3bf49e806 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Mon, 11 Nov 2013 17:12:31 +0000 Subject: [PATCH 104/771] ws --- phpdbg_prompt.c | 99 ++++++++++++++++++++++++------------------------- 1 file changed, 49 insertions(+), 50 deletions(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 2377a14f07f..1fdf7c8e7a7 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -534,66 +534,65 @@ zend_vm_enter: execute_data TSRMLS_CC); if (PHPDBG_G(has_file_bp) - && phpdbg_find_breakpoint_file(execute_data->op_array TSRMLS_CC) == SUCCESS) { - while (phpdbg_interactive(TSRMLS_C) != PHPDBG_NEXT) { - if (!PHPDBG_G(quitting)) { - continue; - } - } - } + && phpdbg_find_breakpoint_file(execute_data->op_array TSRMLS_CC) == SUCCESS) { + while (phpdbg_interactive(TSRMLS_C) != PHPDBG_NEXT) { + if (!PHPDBG_G(quitting)) { + continue; + } + } + } if (PHPDBG_G(has_sym_bp) && execute_data->opline->opcode != ZEND_RETURN) { zend_execute_data *previous = execute_data->prev_execute_data; if (previous && previous != execute_data && previous->opline) { - if (previous->opline->opcode == ZEND_DO_FCALL - || previous->opline->opcode == ZEND_DO_FCALL_BY_NAME) { - if (phpdbg_find_breakpoint_symbol( - previous->function_state.function TSRMLS_CC) == SUCCESS) { - while (phpdbg_interactive(TSRMLS_C) != PHPDBG_NEXT) { - if (!PHPDBG_G(quitting)) { - continue; - } - } - } - } - } + if (previous->opline->opcode == ZEND_DO_FCALL + || previous->opline->opcode == ZEND_DO_FCALL_BY_NAME) { + if (phpdbg_find_breakpoint_symbol( + previous->function_state.function TSRMLS_CC) == SUCCESS) { + while (phpdbg_interactive(TSRMLS_C) != PHPDBG_NEXT) { + if (!PHPDBG_G(quitting)) { + continue; + } + } + } + } + } } - + if (PHPDBG_G(has_opline_bp) - && phpdbg_find_breakpoint_opline(execute_data->opline TSRMLS_CC) == SUCCESS) { - while (phpdbg_interactive(TSRMLS_C) != PHPDBG_NEXT) { - if (!PHPDBG_G(quitting)) { - continue; - } - } - } - - PHPDBG_G(vmret) = execute_data->opline->handler(execute_data TSRMLS_CC); - - if (PHPDBG_G(stepping)) { - while (phpdbg_interactive(TSRMLS_C) != PHPDBG_NEXT) { - if (!PHPDBG_G(quitting)) { - continue; - } - } - } + && phpdbg_find_breakpoint_opline(execute_data->opline TSRMLS_CC) == SUCCESS) { + while (phpdbg_interactive(TSRMLS_C) != PHPDBG_NEXT) { + if (!PHPDBG_G(quitting)) { + continue; + } + } + } - if (PHPDBG_G(vmret) > 0) { - switch (PHPDBG_G(vmret)) { - case 1: - EG(in_execution) = original_in_execution; - return; - case 2: - goto zend_vm_enter; - break; - case 3: - execute_data = EG(current_execute_data); - break; - default: + PHPDBG_G(vmret) = execute_data->opline->handler(execute_data TSRMLS_CC); + + if (PHPDBG_G(stepping)) { + while (phpdbg_interactive(TSRMLS_C) != PHPDBG_NEXT) { + if (!PHPDBG_G(quitting)) { + continue; + } + } + } + + if (PHPDBG_G(vmret) > 0) { + switch (PHPDBG_G(vmret)) { + case 1: + EG(in_execution) = original_in_execution; + return; + case 2: + goto zend_vm_enter; + break; + case 3: + execute_data = EG(current_execute_data); + break; + default: break; } } - } zend_error_noreturn(E_ERROR, "Arrived at end of main loop which shouldn't happen"); } /* }}} */ From 42eaa989afd524a23cf53edc2b7876bdf14d6ca4 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Mon, 11 Nov 2013 17:19:05 +0000 Subject: [PATCH 105/771] separation etc --- phpdbg_bp.c | 12 ++++++++++++ phpdbg_bp.h | 2 ++ phpdbg_prompt.c | 12 +++++------- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/phpdbg_bp.c b/phpdbg_bp.c index 6f615992d0e..4918ff99074 100644 --- a/phpdbg_bp.c +++ b/phpdbg_bp.c @@ -186,3 +186,15 @@ int phpdbg_find_breakpoint_opline(phpdbg_opline_ptr_t opline TSRMLS_DC) /* {{{ * return FAILURE; } /* }}} */ +void phpdbg_clear_breakpoints(TSRMLS_D) /* {{{ */ +{ + zend_hash_clean(&PHPDBG_G(bp_files)); + zend_hash_clean(&PHPDBG_G(bp_symbols)); + zend_hash_clean(&PHPDBG_G(bp_oplines)); + + PHPDBG_G(has_file_bp) = 0; + PHPDBG_G(has_sym_bp) = 0; + PHPDBG_G(has_opline_bp) = 0; + PHPDBG_G(bp_count) = 0; +} /* }}} */ + diff --git a/phpdbg_bp.h b/phpdbg_bp.h index 1f04af9f6c6..4f1a2e237f3 100644 --- a/phpdbg_bp.h +++ b/phpdbg_bp.h @@ -58,4 +58,6 @@ int phpdbg_find_breakpoint_file(zend_op_array* TSRMLS_DC); int phpdbg_find_breakpoint_symbol(zend_function* TSRMLS_DC); int phpdbg_find_breakpoint_opline(phpdbg_opline_ptr_t TSRMLS_DC); +void phpdbg_clear_breakpoints(TSRMLS_D); + #endif /* PHPDBG_BP_H */ diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 1fdf7c8e7a7..e47810be340 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -377,13 +377,7 @@ static PHPDBG_COMMAND(clear) /* {{{ */ printf("[\tSymbols\t%d]\n", zend_hash_num_elements(&PHPDBG_G(bp_symbols))); printf("[\tOplines\t%d]\n", zend_hash_num_elements(&PHPDBG_G(bp_oplines))); - zend_hash_clean(&PHPDBG_G(bp_files)); - zend_hash_clean(&PHPDBG_G(bp_symbols)); - zend_hash_clean(&PHPDBG_G(bp_oplines)); - - PHPDBG_G(has_file_bp) = 0; - PHPDBG_G(has_sym_bp) = 0; - PHPDBG_G(has_opline_bp) = 0; + phpdbg_clear_breakpoints(TSRMLS_C); return SUCCESS; } /* }}} */ @@ -421,6 +415,10 @@ static PHPDBG_COMMAND(help) /* {{{ */ static PHPDBG_COMMAND(quiet) { /* {{{ */ PHPDBG_G(quiet) = atoi(expr); + + printf( + "[Quietness %s]\n", PHPDBG_G(quiet) ? "enabled" : "disabled"); + return SUCCESS; } /* }}} */ From bce3481ed3f000f7fe7b013e08f9811f77be724d Mon Sep 17 00:00:00 2001 From: krakjoe Date: Mon, 11 Nov 2013 17:37:59 +0000 Subject: [PATCH 106/771] update --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 8dbc3861394..6557b750bf8 100644 --- a/README.md +++ b/README.md @@ -14,13 +14,13 @@ Features - break at function entry, file:line or address - showing debug backtraces - easy manipulation of the environment with built-in eval() + - userland API - sapi agnositicism, easy integration - + Planned ======= - mocking server environments/requests - - userland script-ability - improve everything Installation From de3daf55c5ec79249cb492550e8de9f7082521b6 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Mon, 11 Nov 2013 21:51:45 +0000 Subject: [PATCH 107/771] ... --- phpdbg_help.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/phpdbg_help.c b/phpdbg_help.c index 6cbac92fa92..ef8b6208b95 100644 --- a/phpdbg_help.c +++ b/phpdbg_help.c @@ -75,7 +75,8 @@ PHPDBG_HELP(run) /* {{{ */ PHPDBG_HELP(eval) /* {{{ */ { - printf("Access to eval() allows you to change the environment during execution, careful though !!"); + printf("Access to eval() allows you to change the environment during execution, careful though !!\n"); + printf("Note: When using eval in phpdbg do not prefix the code with return.\n"); return SUCCESS; } /* }}} */ From dd4e962c56b62c8c3f1d2d2bac1b6b0eb08b067c Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Mon, 11 Nov 2013 20:02:34 -0200 Subject: [PATCH 108/771] - WS --- phpdbg_prompt.c | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index e47810be340..306e929c5a1 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -58,7 +58,7 @@ static inline int phpdbg_compile(TSRMLS_D) /* {{{ */ if (!EG(in_execution)) { printf("[Attempting compilation of %s]\n", PHPDBG_G(exec)); - + if (php_stream_open_for_zend_ex(PHPDBG_G(exec), &fh, USE_PATH|STREAM_OPEN_FOR_INCLUDE TSRMLS_CC) == SUCCESS) { PHPDBG_G(ops) = zend_compile_file( @@ -114,7 +114,7 @@ static PHPDBG_COMMAND(run) /* {{{ */ printf("[Cannot start another execution while one is in progress]\n"); return FAILURE; } - + if (PHPDBG_G(ops) || PHPDBG_G(exec)) { if (!PHPDBG_G(ops)) { if (phpdbg_compile(TSRMLS_C) == FAILURE) { @@ -197,7 +197,7 @@ static PHPDBG_COMMAND(print) /* {{{ */ } #ifdef HAVE_READLINE_H printf("HAVE READLINE\n"); -#endif +#endif printf("--------------------------------------\n"); printf("Execution Context Information:\n"); @@ -222,11 +222,11 @@ static PHPDBG_COMMAND(print) /* {{{ */ printf("Functions\t%d\n", zend_hash_num_elements(EG(function_table))); printf("Constants\t%d\n", zend_hash_num_elements(EG(zend_constants))); printf("Included\t%d\n", zend_hash_num_elements(&EG(included_files))); - + if (PHPDBG_G(has_file_bp)) { HashPosition position; zend_llist *points; - + printf("--------------------------------------\n"); printf("File Break Point Information:\n"); for (zend_hash_internal_pointer_reset_ex(&PHPDBG_G(bp_files), &position); @@ -234,7 +234,7 @@ static PHPDBG_COMMAND(print) /* {{{ */ zend_hash_move_forward_ex(&PHPDBG_G(bp_files), &position)) { zend_llist_position lposition; phpdbg_breakfile_t *brake; - + if ((brake = zend_llist_get_first_ex(points, &lposition))) { printf("%s:\n", brake->filename); do { @@ -243,12 +243,12 @@ static PHPDBG_COMMAND(print) /* {{{ */ } } } - + #if 0 if (PHPDBG_G(has_sym_bp)) { HashPosition position; zend_llist *points; - + printf("--------------------------------------\n"); printf("Symbol Break Point Information:\n"); for (zend_hash_internal_pointer_reset_ex(&PHPDBG_G(bp_symbols), &position); @@ -256,7 +256,7 @@ static PHPDBG_COMMAND(print) /* {{{ */ zend_hash_move_forward_ex(&PHPDBG_G(bp_symbols), &position)) { zend_llist_position lposition; phpdbg_breaksymbol_t *brake; - + if ((brake = zend_llist_get_first_ex(points, &lposition))) { printf("%s:\n", brake->symbol); do { @@ -270,7 +270,7 @@ static PHPDBG_COMMAND(print) /* {{{ */ if (PHPDBG_G(has_opline_bp)) { HashPosition position; phpdbg_breakline_t *brake; - + printf("--------------------------------------\n"); printf("Opline Break Point Information:\n"); for (zend_hash_internal_pointer_reset_ex(&PHPDBG_G(bp_oplines), &position); @@ -279,7 +279,7 @@ static PHPDBG_COMMAND(print) /* {{{ */ printf("#%d\t%s\n", brake->id, brake->name); } } - + printf("--------------------------------------\n"); return SUCCESS; } /* }}} */ @@ -287,11 +287,11 @@ static PHPDBG_COMMAND(print) /* {{{ */ static PHPDBG_COMMAND(break) /* {{{ */ { const char *line_pos = zend_memrchr(expr, ':', expr_len); - + if (line_pos) { char path[MAXPATHLEN], resolved_name[MAXPATHLEN]; long line_num = strtol(line_pos+1, NULL, 0); - + if (line_num) { memcpy(path, expr, line_pos - expr); path[line_pos - expr] = 0; @@ -357,8 +357,8 @@ static PHPDBG_COMMAND(clean) /* {{{ */ printf("[\tIncluded: %d]\n", zend_hash_num_elements(&EG(included_files))); zend_hash_reverse_apply(EG(function_table), (apply_func_t) clean_non_persistent_function_full TSRMLS_CC); - zend_hash_reverse_apply(EG(class_table), (apply_func_t) clean_non_persistent_class_full TSRMLS_CC); - zend_hash_reverse_apply(EG(zend_constants), (apply_func_t) clean_non_persistent_constant_full TSRMLS_CC); + zend_hash_reverse_apply(EG(class_table), (apply_func_t) clean_non_persistent_class_full TSRMLS_CC); + zend_hash_reverse_apply(EG(zend_constants), (apply_func_t) clean_non_persistent_constant_full TSRMLS_CC); zend_hash_clean(&EG(included_files)); printf("[Clean Environment:]\n"); @@ -366,7 +366,7 @@ static PHPDBG_COMMAND(clean) /* {{{ */ printf("[\tFunctions: %d]\n", zend_hash_num_elements(EG(function_table))); printf("[\tConstants: %d]\n", zend_hash_num_elements(EG(zend_constants))); printf("[\tIncluded: %d]\n", zend_hash_num_elements(&EG(included_files))); - + return SUCCESS; } /* }}} */ @@ -376,9 +376,9 @@ static PHPDBG_COMMAND(clear) /* {{{ */ printf("[\tFile\t%d]\n", zend_hash_num_elements(&PHPDBG_G(bp_files))); printf("[\tSymbols\t%d]\n", zend_hash_num_elements(&PHPDBG_G(bp_symbols))); printf("[\tOplines\t%d]\n", zend_hash_num_elements(&PHPDBG_G(bp_oplines))); - + phpdbg_clear_breakpoints(TSRMLS_C); - + return SUCCESS; } /* }}} */ @@ -415,10 +415,10 @@ static PHPDBG_COMMAND(help) /* {{{ */ static PHPDBG_COMMAND(quiet) { /* {{{ */ PHPDBG_G(quiet) = atoi(expr); - + printf( "[Quietness %s]\n", PHPDBG_G(quiet) ? "enabled" : "disabled"); - + return SUCCESS; } /* }}} */ From b5b7935d40ed6dc2d7dc84eea18496c34152919f Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Mon, 11 Nov 2013 20:06:36 -0200 Subject: [PATCH 109/771] - Added lineno to breakpoint message --- phpdbg_bp.c | 38 ++++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/phpdbg_bp.c b/phpdbg_bp.c index 4918ff99074..2949f971898 100644 --- a/phpdbg_bp.c +++ b/phpdbg_bp.c @@ -40,7 +40,7 @@ void phpdbg_set_breakpoint_file(const char *path, long line_num TSRMLS_DC) /* {{ new_break.filename = estrndup(path, path_len); new_break.line = line_num; - + PHPDBG_G(has_file_bp) = 1; if (zend_hash_find(&PHPDBG_G(bp_files), @@ -57,7 +57,7 @@ void phpdbg_set_breakpoint_file(const char *path, long line_num TSRMLS_DC) /* {{ new_break.id = PHPDBG_G(bp_count)++; zend_llist_add_element(break_files_ptr, &new_break); - + printf( "[Breakpoint #%d added at %s:%ld]\n", new_break.id, new_break.filename, new_break.line); } /* }}} */ @@ -76,7 +76,7 @@ void phpdbg_set_breakpoint_symbol(const char *name TSRMLS_DC) /* {{{ */ zend_hash_update(&PHPDBG_G(bp_symbols), new_break.symbol, name_len, &new_break, sizeof(phpdbg_breaksymbol_t), NULL); - + printf("[Breakpoint #%d added at %s]\n", new_break.id, new_break.symbol); } else { printf("[Breakpoint exists at %s]\n", name); @@ -86,18 +86,18 @@ void phpdbg_set_breakpoint_symbol(const char *name TSRMLS_DC) /* {{{ */ void phpdbg_set_breakpoint_opline(const char *name TSRMLS_DC) /* {{{ */ { zend_ulong opline = strtoul(name, 0, 16); - + if (!zend_hash_index_exists(&PHPDBG_G(bp_oplines), opline)) { phpdbg_breakline_t new_break; PHPDBG_G(has_opline_bp) = 1; - + new_break.name = strdup(name); new_break.opline = opline; new_break.id = PHPDBG_G(bp_count)++; - + zend_hash_index_update(&PHPDBG_G(bp_oplines), opline, &new_break, sizeof(phpdbg_breakline_t), NULL); - + printf("[Breakpoint #%d added at %s]\n", new_break.id, new_break.name); } else { printf("[Breakpoint exists at %s]\n", name); @@ -110,15 +110,15 @@ void phpdbg_set_breakpoint_opline_ex(phpdbg_opline_ptr_t opline TSRMLS_DC) /* {{ phpdbg_breakline_t new_break; PHPDBG_G(has_opline_bp) = 1; - + asprintf( (char**)&new_break.name, "%p", (zend_op*) opline); - + new_break.opline = (zend_ulong) opline; new_break.id = PHPDBG_G(bp_count)++; - + zend_hash_index_update(&PHPDBG_G(bp_oplines), (zend_ulong) opline, &new_break, sizeof(phpdbg_breakline_t), NULL); - + printf("[Breakpoint #%d added at %p]\n", new_break.id, (zend_op*) new_break.opline); } } /* }}} */ @@ -163,8 +163,9 @@ int phpdbg_find_breakpoint_symbol(zend_function *fbc TSRMLS_DC) /* {{{ */ if (zend_hash_find(&PHPDBG_G(bp_symbols), fname, strlen(fname), (void**)&bp) == SUCCESS) { - printf("[Breakpoint #%d in %s() at %s]\n", bp->id, bp->symbol, - zend_get_executed_filename(TSRMLS_C)); + printf("[Breakpoint #%d in %s() at %s:%u]\n", bp->id, bp->symbol, + zend_get_executed_filename(TSRMLS_C), + zend_get_executed_lineno(TSRMLS_C)); return SUCCESS; } @@ -177,12 +178,13 @@ int phpdbg_find_breakpoint_opline(phpdbg_opline_ptr_t opline TSRMLS_DC) /* {{{ * if (zend_hash_index_find(&PHPDBG_G(bp_oplines), (zend_ulong) opline, (void**)&bp) == SUCCESS) { - printf("[Breakpoint #%d in %s at %s]\n", bp->id, bp->name, - zend_get_executed_filename(TSRMLS_C)); - + printf("[Breakpoint #%d in %s at %s:%u]\n", bp->id, bp->name, + zend_get_executed_filename(TSRMLS_C), + zend_get_executed_lineno(TSRMLS_C)); + return SUCCESS; } - + return FAILURE; } /* }}} */ @@ -191,7 +193,7 @@ void phpdbg_clear_breakpoints(TSRMLS_D) /* {{{ */ zend_hash_clean(&PHPDBG_G(bp_files)); zend_hash_clean(&PHPDBG_G(bp_symbols)); zend_hash_clean(&PHPDBG_G(bp_oplines)); - + PHPDBG_G(has_file_bp) = 0; PHPDBG_G(has_sym_bp) = 0; PHPDBG_G(has_opline_bp) = 0; From 36d2329187074fa9fda2bfbc56c3c4360cd389b5 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Mon, 11 Nov 2013 21:40:03 -0200 Subject: [PATCH 110/771] - Added initial code for list command --- config.m4 | 4 +-- phpdbg_help.c | 9 ++++++- phpdbg_help.h | 3 +++ phpdbg_list.c | 72 +++++++++++++++++++++++++++++++++++++++++++++++++ phpdbg_list.h | 25 +++++++++++++++++ phpdbg_prompt.c | 14 ++++++++++ 6 files changed, 124 insertions(+), 3 deletions(-) create mode 100644 phpdbg_list.c create mode 100644 phpdbg_list.h diff --git a/config.m4 b/config.m4 index bb9719015e5..1a99db0f24d 100644 --- a/config.m4 +++ b/config.m4 @@ -9,7 +9,7 @@ if test "$PHP_PHPDBG" != "no"; then AC_DEFINE(HAVE_PHPDBG, 1, [ ]) PHP_PHPDBG_CFLAGS="-I$abc_srcdir" - PHP_PHPDBG_FILES="phpdbg.c phpdbg_prompt.c phpdbg_help.c phpdbg_bp.c phpdbg_opcode.c" + PHP_PHPDBG_FILES="phpdbg.c phpdbg_prompt.c phpdbg_help.c phpdbg_bp.c phpdbg_opcode.c phpdbg_list.c" PHP_SUBST(PHP_PHPDBG_CFLAGS) PHP_SUBST(PHP_PHPDBG_FILES) @@ -27,7 +27,7 @@ if test "$PHP_PHPDBG" != "no"; then \$(PHPDBG_EXTRA_LIBS) \ \$(ZEND_EXTRA_LIBS) \ -o \$(BUILD_BINARY)" - + PHP_SUBST(BUILD_BINARY) PHP_SUBST(BUILD_PHPDBG) fi diff --git a/phpdbg_help.c b/phpdbg_help.c index ef8b6208b95..d91625e09e1 100644 --- a/phpdbg_help.c +++ b/phpdbg_help.c @@ -120,7 +120,6 @@ PHPDBG_HELP(quiet) /* {{{ */ printf("Will silence OPLINE output, while\n"); printf("\tphpdbg> quiet 0\n"); printf("Will enable OPLINE output again\n"); - return SUCCESS; } /* }}} */ @@ -132,3 +131,11 @@ PHPDBG_HELP(back) /* {{{ */ printf("Will limit the number of frames to 5, the default is no limit\n"); return SUCCESS; } /* }}} */ + +PHPDBG_HELP(list) /* {{{ */ +{ + printf("The list command displays N line from current context file.\n"); + printf("\tphpdbg> list 2\n"); + printf("Will print next 2 lines from the current file\n"); + return SUCCESS; +} /* }}} */ diff --git a/phpdbg_help.h b/phpdbg_help.h index 449f4d1c586..9e187a8b395 100644 --- a/phpdbg_help.h +++ b/phpdbg_help.h @@ -20,6 +20,7 @@ #ifndef PHPDBG_HELP_H #define PHPDBG_HELP_H +#include "TSRM.h" #include "phpdbg_prompt.h" /** @@ -45,6 +46,7 @@ PHPDBG_HELP(clean); PHPDBG_HELP(clear); PHPDBG_HELP(back); PHPDBG_HELP(quiet); +PHPDBG_HELP(list); /** * Commands @@ -62,6 +64,7 @@ static const phpdbg_command_t phpdbg_help_commands[] = { PHPDBG_HELP_D(clear, "clearing breakpoints allows you to run code without interruption"), PHPDBG_HELP_D(back, "show debug backtrace information during execution"), PHPDBG_HELP_D(quiet, "be quiet during execution"), + PHPDBG_HELP_D(list, "list specified line"), {NULL, 0, 0} }; diff --git a/phpdbg_list.c b/phpdbg_list.c new file mode 100644 index 00000000000..9102a797fc6 --- /dev/null +++ b/phpdbg_list.c @@ -0,0 +1,72 @@ +/* + +----------------------------------------------------------------------+ + | PHP Version 5 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997-2013 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 3.01 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | http://www.php.net/license/3_01.txt | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Authors: Felipe Pena | + | Authors: Joe Watkins | + +----------------------------------------------------------------------+ +*/ + +#include +#include +#include +#include +#include +#include +#include "phpdbg_list.h" + +void phpdbg_list_file(const char *filename, long count, long offset) /* {{{ */ +{ + unsigned char *mem, *pos, *last_pos, *end_pos; + struct stat st; + int fd, all_content = (count == 0); + unsigned int line = 0, displayed = 0; + + if ((fd = open(filename, O_RDONLY)) == -1) { + printf("[Failed to open file to list]\n"); + return; + } + + fstat(fd, &st); + + last_pos = mem = mmap(0, st.st_size, PROT_READ, MAP_SHARED, fd, 0); + end_pos = mem + st.st_size; + + while (1) { + pos = memchr(last_pos, '\n', end_pos - last_pos); + + if (!pos) { + /* No more line breaks */ + break; + } + + ++line; + + if (!offset || offset <= line) { + /* Without offset, or offset reached */ + printf("%05u: %.*s\n", line, (int)(pos - last_pos), last_pos); + ++displayed; + } + + last_pos = pos + 1; + + if (!all_content && displayed == count) { + /* Reached max line to display */ + break; + } + } + + munmap(mem, st.st_size); + close(fd); + +} /* }}} */ diff --git a/phpdbg_list.h b/phpdbg_list.h new file mode 100644 index 00000000000..4531a65d106 --- /dev/null +++ b/phpdbg_list.h @@ -0,0 +1,25 @@ +/* + +----------------------------------------------------------------------+ + | PHP Version 5 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997-2013 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 3.01 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | http://www.php.net/license/3_01.txt | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Authors: Felipe Pena | + | Authors: Joe Watkins | + +----------------------------------------------------------------------+ +*/ + +#ifndef PHPDBG_LIST_H +#define PHPDBG_LIST_H + +void phpdbg_list_file(const char*, long, long); + +#endif /* PHPDBG_LIST_H */ diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 306e929c5a1..ab04a68eeda 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -422,6 +422,19 @@ static PHPDBG_COMMAND(quiet) { /* {{{ */ return SUCCESS; } /* }}} */ +static PHPDBG_COMMAND(list) /* {{{ */ +{ + long offset = 0, count = strtol(expr, NULL, 0); + const char *filename = PHPDBG_G(exec); + + if (zend_is_executing(TSRMLS_C)) { + filename = zend_get_executed_filename(TSRMLS_C); + offset = zend_get_executed_lineno(TSRMLS_C); + } + + phpdbg_list_file(filename, count, offset); +} /* }}} */ + static const phpdbg_command_t phpdbg_prompt_commands[] = { PHPDBG_COMMAND_D(exec, "set execution context"), PHPDBG_COMMAND_D(compile, "attempt to pre-compile execution context"), @@ -432,6 +445,7 @@ static const phpdbg_command_t phpdbg_prompt_commands[] = { PHPDBG_COMMAND_D(print, "print something"), PHPDBG_COMMAND_D(break, "set breakpoint"), PHPDBG_COMMAND_D(back, "show backtrace"), + PHPDBG_COMMAND_D(list, "list specified line"), PHPDBG_COMMAND_D(clean, "clean the execution environment"), PHPDBG_COMMAND_D(clear, "clear breakpoints"), PHPDBG_COMMAND_D(help, "show help menu"), From bbc35b60f9564d556f1c0c154f69108201b4913c Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Mon, 11 Nov 2013 22:24:24 -0200 Subject: [PATCH 111/771] - Added check for no context file --- phpdbg_prompt.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index ab04a68eeda..a73459e9a80 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -25,6 +25,7 @@ #include "phpdbg_help.h" #include "phpdbg_bp.h" #include "phpdbg_opcode.h" +#include "phpdbg_list.h" static const phpdbg_command_t phpdbg_prompt_commands[]; @@ -430,9 +431,14 @@ static PHPDBG_COMMAND(list) /* {{{ */ if (zend_is_executing(TSRMLS_C)) { filename = zend_get_executed_filename(TSRMLS_C); offset = zend_get_executed_lineno(TSRMLS_C); + } else if (!filename) { + printf("[No file to list]\n"); + return SUCCESS; } phpdbg_list_file(filename, count, offset); + + return SUCCESS; } /* }}} */ static const phpdbg_command_t phpdbg_prompt_commands[] = { From e0cbd92fa484dea3549e708ffc0d8402600271fb Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 00:27:48 +0000 Subject: [PATCH 112/771] break on class methods don't dtor eval'd retval more reliable break on methods --- phpdbg.c | 9 +++ phpdbg.h | 8 ++- phpdbg_bp.c | 83 ++++++++++++++++++++++++++- phpdbg_bp.h | 13 +++++ phpdbg_help.c | 3 + phpdbg_prompt.c | 150 ++++++++++++++++++++++++++++++++---------------- test.php | 16 ++---- 7 files changed, 218 insertions(+), 64 deletions(-) diff --git a/phpdbg.c b/phpdbg.c index d24016275c7..a37781b2453 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -41,6 +41,7 @@ static inline void php_phpdbg_globals_ctor(zend_phpdbg_globals *pg) /* {{{ */ pg->has_file_bp = 0; pg->has_sym_bp = 0; pg->has_opline_bp = 0; + pg->has_method_bp = 0; } /* }}} */ static PHP_MINIT_FUNCTION(phpdbg) /* {{{ */ @@ -68,11 +69,17 @@ static void php_phpdbg_destroy_bp_opline(void *brake) /* {{{ */ free((char*)((phpdbg_breakline_t*)brake)->name); } /* }}} */ +static void php_phpdbg_destroy_bp_methods(void *brake) /* {{{ */ +{ + zend_hash_destroy((HashTable*)brake); +} /* }}} */ + static PHP_RINIT_FUNCTION(phpdbg) /* {{{ */ { zend_hash_init(&PHPDBG_G(bp_files), 8, NULL, php_phpdbg_destroy_bp_file, 0); zend_hash_init(&PHPDBG_G(bp_symbols), 8, NULL, php_phpdbg_destroy_bp_symbol, 0); zend_hash_init(&PHPDBG_G(bp_oplines), 8, NULL, php_phpdbg_destroy_bp_opline, 0); + zend_hash_init(&PHPDBG_G(bp_methods), 8, NULL, php_phpdbg_destroy_bp_methods, 0); return SUCCESS; } /* }}} */ @@ -82,6 +89,7 @@ static PHP_RSHUTDOWN_FUNCTION(phpdbg) /* {{{ */ zend_hash_destroy(&PHPDBG_G(bp_files)); zend_hash_destroy(&PHPDBG_G(bp_symbols)); zend_hash_destroy(&PHPDBG_G(bp_oplines)); + zend_hash_destroy(&PHPDBG_G(bp_methods)); if (PHPDBG_G(exec)) { efree(PHPDBG_G(exec)); @@ -113,6 +121,7 @@ static PHP_FUNCTION(phpdbg_clear) zend_hash_clean(&PHPDBG_G(bp_files)); zend_hash_clean(&PHPDBG_G(bp_symbols)); zend_hash_clean(&PHPDBG_G(bp_oplines)); + zend_hash_clean(&PHPDBG_G(bp_methods)); } /* }}} */ zend_function_entry phpdbg_user_functions[] = { diff --git a/phpdbg.h b/phpdbg.h index 8adc69cf4f2..7477c401116 100644 --- a/phpdbg.h +++ b/phpdbg.h @@ -48,9 +48,10 @@ typedef struct _phpdbg_command_t phpdbg_command_t; ZEND_BEGIN_MODULE_GLOBALS(phpdbg) - HashTable bp_files; - HashTable bp_symbols; - HashTable bp_oplines; + HashTable bp_files; /* file breakpoints */ + HashTable bp_symbols; /* symbol breakpoints */ + HashTable bp_oplines; /* opline breakpoints */ + HashTable bp_methods; /* method breakpoints */ char *exec; /* file to execute */ size_t exec_len; /* size of exec */ zend_op_array *ops; /* op_array */ @@ -61,6 +62,7 @@ ZEND_BEGIN_MODULE_GLOBALS(phpdbg) zend_bool has_file_bp; /* file-based breakpoint has been set */ zend_bool has_sym_bp; /* symbol-based breakpoint has been set */ zend_bool has_opline_bp; /* opline-based breakpoint has been set */ + zend_bool has_method_bp; /* method-based breakpoint has been set */ zend_bool quitting; /* quitting flag */ int quiet; /* quiet */ phpdbg_command_t *last; /* last command */ diff --git a/phpdbg_bp.c b/phpdbg_bp.c index 2949f971898..c6ebef3f732 100644 --- a/phpdbg_bp.c +++ b/phpdbg_bp.c @@ -32,6 +32,15 @@ static void phpdbg_llist_breakfile_dtor(void *data) /* {{{ */ efree((char*)bp->filename); } /* }}} */ + +static void phpdbg_class_breaks_dtor(void *data) /* {{{ */ +{ + phpdbg_breakmethod_t *bp = (phpdbg_breakmethod_t*) data; + + efree((char*)bp->class_name); + efree((char*)bp->func_name); +} /* }}} */ + void phpdbg_set_breakpoint_file(const char *path, long line_num TSRMLS_DC) /* {{{ */ { phpdbg_breakfile_t new_break; @@ -83,6 +92,42 @@ void phpdbg_set_breakpoint_symbol(const char *name TSRMLS_DC) /* {{{ */ } } /* }}} */ +void phpdbg_set_breakpoint_method(const char* class_name, + size_t class_len, + const char* func_name, + size_t func_len TSRMLS_DC) /* {{{ */ +{ + HashTable class_breaks, *class_table; + + if (zend_hash_find(&PHPDBG_G(bp_methods), class_name, class_len, (void**)&class_table) != SUCCESS) { + zend_hash_init( + &class_breaks, 8, NULL, phpdbg_class_breaks_dtor, 0); + zend_hash_update( + &PHPDBG_G(bp_methods), + class_name, class_len, + (void**)&class_breaks, sizeof(HashTable), (void**)&class_table); + } + + if (!zend_hash_exists(class_table, func_name, func_len)) { + phpdbg_breakmethod_t new_break; + + PHPDBG_G(has_method_bp) = 1; + + new_break.class_name = class_name; + new_break.class_len = class_len; + new_break.func_name = func_name; + new_break.func_len = func_len; + new_break.id = PHPDBG_G(bp_count)++; + + zend_hash_update(class_table, func_name, func_len, &new_break, sizeof(phpdbg_breakmethod_t), NULL); + printf( + "[Breakpoint #%d added at %s::%s]\n", new_break.id, class_name, func_name); + } else { + printf( + "[Breakpoint exists at %s::%s]\n", class_name, func_name); + } +} /* }}} */ + void phpdbg_set_breakpoint_opline(const char *name TSRMLS_DC) /* {{{ */ { zend_ulong opline = strtoul(name, 0, 16); @@ -172,6 +217,40 @@ int phpdbg_find_breakpoint_symbol(zend_function *fbc TSRMLS_DC) /* {{{ */ return FAILURE; } /* }}} */ +int phpdbg_find_breakpoint_method(zend_function *fbc TSRMLS_DC) /* {{{ */ +{ + HashTable *class_table; + phpdbg_breakmethod_t *bp; + zend_op_array *ops = NULL; + + if (fbc->type != ZEND_USER_FUNCTION) { + return FAILURE; + } + + ops = ((zend_op_array*)fbc); + + if (!ops->scope) { + return FAILURE; + } + + if (zend_hash_find(&PHPDBG_G(bp_methods), ops->scope->name, ops->scope->name_length, + (void**)&class_table) == SUCCESS) { + if (zend_hash_find( + class_table, + ops->function_name, + strlen(ops->function_name), (void**)&bp) == SUCCESS) { + + printf( + "[Breakpoint #%d in %s::%s() at %s:%u]\n", bp->id, bp->class_name, bp->func_name, + zend_get_executed_filename(TSRMLS_C), + zend_get_executed_lineno(TSRMLS_C)); + return SUCCESS; + } + } + + return FAILURE; +} /* }}} */ + int phpdbg_find_breakpoint_opline(phpdbg_opline_ptr_t opline TSRMLS_DC) /* {{{ */ { phpdbg_breakline_t *bp; @@ -193,10 +272,12 @@ void phpdbg_clear_breakpoints(TSRMLS_D) /* {{{ */ zend_hash_clean(&PHPDBG_G(bp_files)); zend_hash_clean(&PHPDBG_G(bp_symbols)); zend_hash_clean(&PHPDBG_G(bp_oplines)); - + zend_hash_clean(&PHPDBG_G(bp_methods)); + PHPDBG_G(has_file_bp) = 0; PHPDBG_G(has_sym_bp) = 0; PHPDBG_G(has_opline_bp) = 0; + PHPDBG_G(has_method_bp) = 0; PHPDBG_G(bp_count) = 0; } /* }}} */ diff --git a/phpdbg_bp.h b/phpdbg_bp.h index 4f1a2e237f3..77dfd4861e1 100644 --- a/phpdbg_bp.h +++ b/phpdbg_bp.h @@ -40,6 +40,17 @@ typedef struct _phpdbg_breaksymbol_t { int id; } phpdbg_breaksymbol_t; +/** + * Breakpoint method based representation + */ +typedef struct _phpdbg_breakmethod_t { + const char *class_name; + size_t class_len; + const char *func_name; + size_t func_len; + int id; +} phpdbg_breakmethod_t; + /** * Breakpoint opline based representation */ @@ -51,11 +62,13 @@ typedef struct _phpdbg_breakline_t { void phpdbg_set_breakpoint_file(const char*, long TSRMLS_DC); void phpdbg_set_breakpoint_symbol(const char* TSRMLS_DC); +void phpdbg_set_breakpoint_method(const char*, size_t, const char*, size_t TSRMLS_DC); void phpdbg_set_breakpoint_opline(const char* TSRMLS_DC); void phpdbg_set_breakpoint_opline_ex(phpdbg_opline_ptr_t TSRMLS_DC); int phpdbg_find_breakpoint_file(zend_op_array* TSRMLS_DC); int phpdbg_find_breakpoint_symbol(zend_function* TSRMLS_DC); +int phpdbg_find_breakpoint_method(zend_function* TSRMLS_DC); int phpdbg_find_breakpoint_opline(phpdbg_opline_ptr_t TSRMLS_DC); void phpdbg_clear_breakpoints(TSRMLS_D); diff --git a/phpdbg_help.c b/phpdbg_help.c index ef8b6208b95..00404a446b7 100644 --- a/phpdbg_help.c +++ b/phpdbg_help.c @@ -85,12 +85,15 @@ PHPDBG_HELP(break) /* {{{ */ printf("Setting a breakpoint stops execution at a specific stage, the syntax is:\n"); printf("\tfile:line\n"); printf("\tfunction\n"); + printf("\t\\my\\class::method\n"); printf("\t0x16\n"); printf("For example:\n"); printf("\tphpdbg> break test.php:1\n"); printf("Will break execution on line 1 of test.php\n"); printf("\tphpdbg> break my_function\n"); printf("Will break execution on entry to my_function\n"); + printf("\tphpdbg> break \\my\\class::method\n"); + printf("Will break execution on entry to \\my\\class::method\n"); printf("\tphpdbg> break 0x7ff68f570e08\n"); printf("Will break at the opline with the address provided (addresses are shown during execution)\n"); printf("It is important to note, an address is only valid for the current compiled representation of the script\n"); diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 306e929c5a1..a29bc75c1c4 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -149,9 +149,9 @@ static PHPDBG_COMMAND(eval) /* {{{ */ if (expr_len) { if (zend_eval_stringl((char*)expr, expr_len-1, &retval, "eval()'d code" TSRMLS_CC) == SUCCESS) { - zend_print_zval_r(&retval, 0 TSRMLS_CC); + zend_print_zval_r( + &retval, 0 TSRMLS_CC); printf("\n"); - zval_dtor(&retval); } } else { printf("[No expression provided !]\n"); @@ -286,25 +286,57 @@ static PHPDBG_COMMAND(print) /* {{{ */ static PHPDBG_COMMAND(break) /* {{{ */ { - const char *line_pos = zend_memrchr(expr, ':', expr_len); - + char *line_pos = NULL; + char *func_pos = NULL; + + if (!expr_len) { + printf( + "[No expression found]\n"); + return FAILURE; + } + + line_pos = strchr(expr, ':'); + if (line_pos) { - char path[MAXPATHLEN], resolved_name[MAXPATHLEN]; - long line_num = strtol(line_pos+1, NULL, 0); - - if (line_num) { - memcpy(path, expr, line_pos - expr); - path[line_pos - expr] = 0; - - if (expand_filepath(path, resolved_name TSRMLS_CC) == NULL) { - printf("[Failed to expand path %s]\n", path); - return FAILURE; + if (!(func_pos=strchr(line_pos+1, ':'))) { + char path[MAXPATHLEN], resolved_name[MAXPATHLEN]; + long line_num = strtol(line_pos+1, NULL, 0); + + if (line_num) { + memcpy(path, expr, line_pos - expr); + path[line_pos - expr] = 0; + + if (expand_filepath(path, resolved_name TSRMLS_CC) == NULL) { + printf("[Failed to expand path %s]\n", path); + return FAILURE; + } + + phpdbg_set_breakpoint_file(resolved_name, line_num TSRMLS_CC); + } else { + printf("[No line specified in expression %s]\n", expr); + return FAILURE; + } + } else { + char *class; + char *func; + + size_t func_len = strlen(func_pos+1), + class_len = (line_pos - expr); + + if (func_len) { + class = emalloc(class_len+1); + func = emalloc(func_len+1); + + memcpy(class, expr, class_len); + class[class_len]='\0'; + memcpy(func, func_pos+1, func_len); + func[func_len]='\0'; + + phpdbg_set_breakpoint_method(class, class_len, func, func_len TSRMLS_CC); + } else { + printf("[No function found in method expression %s]\n", expr); + return FAILURE; } - - phpdbg_set_breakpoint_file(resolved_name, line_num TSRMLS_CC); - } else { - printf("[No line specified in expression %s]\n", expr); - return FAILURE; } } else { if (expr_len > 2 && expr[0] == '0' && expr[1] == 'x') { @@ -313,11 +345,16 @@ static PHPDBG_COMMAND(break) /* {{{ */ char name[200]; size_t name_len = strlen(expr); - name_len = MIN(name_len, 200); - memcpy(name, expr, name_len); - name[name_len] = 0; + if (name_len) { + name_len = MIN(name_len, 200); + memcpy(name, expr, name_len); + name[name_len] = 0; - phpdbg_set_breakpoint_symbol(name TSRMLS_CC); + phpdbg_set_breakpoint_symbol(name TSRMLS_CC); + } else { + printf("[Malformed break command found]\n"); + return FAILURE; + } } } @@ -350,22 +387,28 @@ static int clean_non_persistent_function_full(zend_function *function TSRMLS_DC) static PHPDBG_COMMAND(clean) /* {{{ */ { - printf("[Cleaning Environment:]\n"); - printf("[\tClasses: %d]\n", zend_hash_num_elements(EG(class_table))); - printf("[\tFunctions: %d]\n", zend_hash_num_elements(EG(function_table))); - printf("[\tConstants: %d]\n", zend_hash_num_elements(EG(zend_constants))); - printf("[\tIncluded: %d]\n", zend_hash_num_elements(&EG(included_files))); - - zend_hash_reverse_apply(EG(function_table), (apply_func_t) clean_non_persistent_function_full TSRMLS_CC); - zend_hash_reverse_apply(EG(class_table), (apply_func_t) clean_non_persistent_class_full TSRMLS_CC); - zend_hash_reverse_apply(EG(zend_constants), (apply_func_t) clean_non_persistent_constant_full TSRMLS_CC); - zend_hash_clean(&EG(included_files)); - - printf("[Clean Environment:]\n"); - printf("[\tClasses: %d]\n", zend_hash_num_elements(EG(class_table))); - printf("[\tFunctions: %d]\n", zend_hash_num_elements(EG(function_table))); - printf("[\tConstants: %d]\n", zend_hash_num_elements(EG(zend_constants))); - printf("[\tIncluded: %d]\n", zend_hash_num_elements(&EG(included_files))); + if (!EG(in_execution)) { + printf("[Cleaning Environment:]\n"); + printf("[\tClasses: %d]\n", zend_hash_num_elements(EG(class_table))); + printf("[\tFunctions: %d]\n", zend_hash_num_elements(EG(function_table))); + printf("[\tConstants: %d]\n", zend_hash_num_elements(EG(zend_constants))); + printf("[\tIncluded: %d]\n", zend_hash_num_elements(&EG(included_files))); + + zend_hash_reverse_apply(EG(function_table), (apply_func_t) clean_non_persistent_function_full TSRMLS_CC); + zend_hash_reverse_apply(EG(class_table), (apply_func_t) clean_non_persistent_class_full TSRMLS_CC); + zend_hash_reverse_apply(EG(zend_constants), (apply_func_t) clean_non_persistent_constant_full TSRMLS_CC); + zend_hash_clean(&EG(included_files)); + + printf("[Clean Environment:]\n"); + printf("[\tClasses: %d]\n", zend_hash_num_elements(EG(class_table))); + printf("[\tFunctions: %d]\n", zend_hash_num_elements(EG(function_table))); + printf("[\tConstants: %d]\n", zend_hash_num_elements(EG(zend_constants))); + printf("[\tIncluded: %d]\n", zend_hash_num_elements(&EG(included_files))); + } else { + printf( + "[Cannot clean environment while executing]\n"); + return FAILURE; + } return SUCCESS; } /* }}} */ @@ -376,7 +419,8 @@ static PHPDBG_COMMAND(clear) /* {{{ */ printf("[\tFile\t%d]\n", zend_hash_num_elements(&PHPDBG_G(bp_files))); printf("[\tSymbols\t%d]\n", zend_hash_num_elements(&PHPDBG_G(bp_symbols))); printf("[\tOplines\t%d]\n", zend_hash_num_elements(&PHPDBG_G(bp_oplines))); - + printf("[\tMethods\t%d]\n", zend_hash_num_elements(&PHPDBG_G(bp_methods))); + phpdbg_clear_breakpoints(TSRMLS_C); return SUCCESS; @@ -540,23 +584,29 @@ zend_vm_enter: } } - if (PHPDBG_G(has_sym_bp) && execute_data->opline->opcode != ZEND_RETURN) { + if ((PHPDBG_G(has_sym_bp)||PHPDBG_G(has_method_bp))) { zend_execute_data *previous = execute_data->prev_execute_data; if (previous && previous != execute_data && previous->opline) { - if (previous->opline->opcode == ZEND_DO_FCALL - || previous->opline->opcode == ZEND_DO_FCALL_BY_NAME) { - if (phpdbg_find_breakpoint_symbol( - previous->function_state.function TSRMLS_CC) == SUCCESS) { - while (phpdbg_interactive(TSRMLS_C) != PHPDBG_NEXT) { - if (!PHPDBG_G(quitting)) { - continue; + /* check we are the beginning of a function entry */ + if (execute_data->opline == EG(active_op_array)->opcodes) { + switch (previous->opline->opcode) { + case ZEND_DO_FCALL: + case ZEND_DO_FCALL_BY_NAME: + case ZEND_INIT_STATIC_METHOD_CALL: { + if (phpdbg_find_breakpoint_symbol(previous->function_state.function TSRMLS_CC) == SUCCESS || + phpdbg_find_breakpoint_method(previous->function_state.function TSRMLS_CC) == SUCCESS) { + while (phpdbg_interactive(TSRMLS_C) != PHPDBG_NEXT) { + if (!PHPDBG_G(quitting)) { + continue; + } + } } - } + } break; } } } } - + if (PHPDBG_G(has_opline_bp) && phpdbg_find_breakpoint_opline(execute_data->opline TSRMLS_CC) == SUCCESS) { while (phpdbg_interactive(TSRMLS_C) != PHPDBG_NEXT) { diff --git a/test.php b/test.php index 20fc66c7c5b..457e487db70 100644 --- a/test.php +++ b/test.php @@ -1,22 +1,18 @@ method()); -test2(); return true; ?> From 217c906ea57fecdf78469048bb1384c0e1ff2a19 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Mon, 11 Nov 2013 22:33:17 -0200 Subject: [PATCH 113/771] - Improve error message and added check for fstat return --- phpdbg_list.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/phpdbg_list.c b/phpdbg_list.c index 9102a797fc6..d4603155312 100644 --- a/phpdbg_list.c +++ b/phpdbg_list.c @@ -33,11 +33,14 @@ void phpdbg_list_file(const char *filename, long count, long offset) /* {{{ */ unsigned int line = 0, displayed = 0; if ((fd = open(filename, O_RDONLY)) == -1) { - printf("[Failed to open file to list]\n"); + printf("[Failed to open file %s to list]\n", filename); return; } - fstat(fd, &st); + if (fstat(fd, &st) == -1) { + printf("[Failed to stat file %s]\n", filename); + goto out; + } last_pos = mem = mmap(0, st.st_size, PROT_READ, MAP_SHARED, fd, 0); end_pos = mem + st.st_size; @@ -67,6 +70,6 @@ void phpdbg_list_file(const char *filename, long count, long offset) /* {{{ */ } munmap(mem, st.st_size); +out: close(fd); - } /* }}} */ From 179debd730113fc628047951d3f8a214447d0520 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 00:36:00 +0000 Subject: [PATCH 114/771] ... --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6557b750bf8..dcfd3317d23 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ Features ======== - step through debugging - - break at function entry, file:line or address + - break at method/function entry, file:line or address - showing debug backtraces - easy manipulation of the environment with built-in eval() - userland API From ef134e585f9c85e0f94f11b75b7da16ddb56bfbf Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 00:40:40 +0000 Subject: [PATCH 115/771] ... --- phpdbg_bp.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/phpdbg_bp.c b/phpdbg_bp.c index c6ebef3f732..44428ddf1b8 100644 --- a/phpdbg_bp.c +++ b/phpdbg_bp.c @@ -194,11 +194,19 @@ int phpdbg_find_breakpoint_file(zend_op_array *op_array TSRMLS_DC) /* {{{ */ int phpdbg_find_breakpoint_symbol(zend_function *fbc TSRMLS_DC) /* {{{ */ { const char *fname; + zend_op_array *ops; phpdbg_breaksymbol_t *bp; if (fbc->type != ZEND_USER_FUNCTION) { return FAILURE; } + + ops = (zend_op_array*)fbc; + + if (ops->scope) { + /* do not check class methods */ + return FAILURE; + } fname = ((zend_op_array*)fbc)->function_name; From 0a6804a9866f781d10c5f12e0a45406374c0bd00 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 00:47:27 +0000 Subject: [PATCH 116/771] ... --- phpdbg_bp.c | 20 +++++--------------- phpdbg_bp.h | 2 +- phpdbg_prompt.c | 3 +-- 3 files changed, 7 insertions(+), 18 deletions(-) diff --git a/phpdbg_bp.c b/phpdbg_bp.c index 44428ddf1b8..ab4bf55a0b7 100644 --- a/phpdbg_bp.c +++ b/phpdbg_bp.c @@ -204,11 +204,12 @@ int phpdbg_find_breakpoint_symbol(zend_function *fbc TSRMLS_DC) /* {{{ */ ops = (zend_op_array*)fbc; if (ops->scope) { - /* do not check class methods */ - return FAILURE; + /* find method breaks here */ + return phpdbg_find_breakpoint_method( + ops TSRMLS_CC); } - fname = ((zend_op_array*)fbc)->function_name; + fname = ops->function_name; if (!fname) { fname = "main"; @@ -225,22 +226,11 @@ int phpdbg_find_breakpoint_symbol(zend_function *fbc TSRMLS_DC) /* {{{ */ return FAILURE; } /* }}} */ -int phpdbg_find_breakpoint_method(zend_function *fbc TSRMLS_DC) /* {{{ */ +int phpdbg_find_breakpoint_method(zend_op_array *ops TSRMLS_DC) /* {{{ */ { HashTable *class_table; phpdbg_breakmethod_t *bp; - zend_op_array *ops = NULL; - - if (fbc->type != ZEND_USER_FUNCTION) { - return FAILURE; - } - ops = ((zend_op_array*)fbc); - - if (!ops->scope) { - return FAILURE; - } - if (zend_hash_find(&PHPDBG_G(bp_methods), ops->scope->name, ops->scope->name_length, (void**)&class_table) == SUCCESS) { if (zend_hash_find( diff --git a/phpdbg_bp.h b/phpdbg_bp.h index 77dfd4861e1..3eaa6e695e0 100644 --- a/phpdbg_bp.h +++ b/phpdbg_bp.h @@ -68,7 +68,7 @@ void phpdbg_set_breakpoint_opline_ex(phpdbg_opline_ptr_t TSRMLS_DC); int phpdbg_find_breakpoint_file(zend_op_array* TSRMLS_DC); int phpdbg_find_breakpoint_symbol(zend_function* TSRMLS_DC); -int phpdbg_find_breakpoint_method(zend_function* TSRMLS_DC); +int phpdbg_find_breakpoint_method(zend_op_array* TSRMLS_DC); int phpdbg_find_breakpoint_opline(phpdbg_opline_ptr_t TSRMLS_DC); void phpdbg_clear_breakpoints(TSRMLS_D); diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index df224e6ccde..27caeddcbc3 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -613,8 +613,7 @@ zend_vm_enter: case ZEND_DO_FCALL: case ZEND_DO_FCALL_BY_NAME: case ZEND_INIT_STATIC_METHOD_CALL: { - if (phpdbg_find_breakpoint_symbol(previous->function_state.function TSRMLS_CC) == SUCCESS || - phpdbg_find_breakpoint_method(previous->function_state.function TSRMLS_CC) == SUCCESS) { + if (phpdbg_find_breakpoint_symbol(previous->function_state.function TSRMLS_CC) == SUCCESS) { while (phpdbg_interactive(TSRMLS_C) != PHPDBG_NEXT) { if (!PHPDBG_G(quitting)) { continue; From 749e0cfc36aa0056eb672f3b7ec9762e9d59e5dd Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 01:24:53 +0000 Subject: [PATCH 117/771] condense globals introduce flags sensible silence and stepping --- phpdbg.c | 10 ++------ phpdbg.h | 18 +++++++------ phpdbg_bp.c | 15 +++++------ phpdbg_prompt.c | 67 ++++++++++++++++++++++++++++++++----------------- 4 files changed, 63 insertions(+), 47 deletions(-) diff --git a/phpdbg.c b/phpdbg.c index a37781b2453..794f6479c19 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -30,18 +30,12 @@ static inline void php_phpdbg_globals_ctor(zend_phpdbg_globals *pg) /* {{{ */ pg->exec = NULL; pg->exec_len = 0; pg->ops = NULL; - pg->stepping = 0; pg->vmret = 0; - pg->quitting = 0; pg->bp_count = 0; - pg->quiet = 0; pg->last = NULL; pg->last_params = NULL; pg->last_params_len = 0; - pg->has_file_bp = 0; - pg->has_sym_bp = 0; - pg->has_opline_bp = 0; - pg->has_method_bp = 0; + pg->flags = PHPDBG_IS_QUIET; } /* }}} */ static PHP_MINIT_FUNCTION(phpdbg) /* {{{ */ @@ -407,7 +401,7 @@ int main(int argc, char *argv[]) /* {{{ */ } zend_catch { } zend_end_try(); - } while(!PHPDBG_G(quitting)); + } while(!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING)); if (ini_entries) { free(ini_entries); diff --git a/phpdbg.h b/phpdbg.h index 7477c401116..457d682ce67 100644 --- a/phpdbg.h +++ b/phpdbg.h @@ -45,6 +45,16 @@ #define PHPDBG_NEXT 2 +/* {{{ flags */ +#define PHPDBG_HAS_FILE_BP 0x00000001 +#define PHPDBG_HAS_SYM_BP 0x00000010 +#define PHPDBG_HAS_OPLINE_BP 0x00000100 +#define PHPDBG_HAS_METHOD_BP 0x00001000 + +#define PHPDBG_IS_STEPPING 0x00010000 +#define PHPDBG_IS_QUIET 0x00100000 +#define PHPDBG_IS_QUITTING 0x01000000 /* }}} */ + typedef struct _phpdbg_command_t phpdbg_command_t; ZEND_BEGIN_MODULE_GLOBALS(phpdbg) @@ -57,17 +67,11 @@ ZEND_BEGIN_MODULE_GLOBALS(phpdbg) zend_op_array *ops; /* op_array */ zval *retval; /* return value */ int bp_count; /* breakpoint count */ - int stepping; /* stepping */ int vmret; /* return from last opcode handler execution */ - zend_bool has_file_bp; /* file-based breakpoint has been set */ - zend_bool has_sym_bp; /* symbol-based breakpoint has been set */ - zend_bool has_opline_bp; /* opline-based breakpoint has been set */ - zend_bool has_method_bp; /* method-based breakpoint has been set */ - zend_bool quitting; /* quitting flag */ - int quiet; /* quiet */ phpdbg_command_t *last; /* last command */ const char *last_params; /* last expression */ size_t last_params_len; /* last expression length */ + zend_ulong flags; /* phpdbg flags */ ZEND_END_MODULE_GLOBALS(phpdbg) #endif /* PHPDBG_H */ diff --git a/phpdbg_bp.c b/phpdbg_bp.c index ab4bf55a0b7..e1138193d30 100644 --- a/phpdbg_bp.c +++ b/phpdbg_bp.c @@ -50,7 +50,7 @@ void phpdbg_set_breakpoint_file(const char *path, long line_num TSRMLS_DC) /* {{ new_break.filename = estrndup(path, path_len); new_break.line = line_num; - PHPDBG_G(has_file_bp) = 1; + PHPDBG_G(flags) |= PHPDBG_HAS_FILE_BP; if (zend_hash_find(&PHPDBG_G(bp_files), new_break.filename, path_len, (void**)&break_files_ptr) == FAILURE) { @@ -78,7 +78,7 @@ void phpdbg_set_breakpoint_symbol(const char *name TSRMLS_DC) /* {{{ */ if (!zend_hash_exists(&PHPDBG_G(bp_symbols), name, name_len)) { phpdbg_breaksymbol_t new_break; - PHPDBG_G(has_sym_bp) = 1; + PHPDBG_G(flags) |= PHPDBG_HAS_SYM_BP; new_break.symbol = estrndup(name, name_len + 1); new_break.id = PHPDBG_G(bp_count)++; @@ -111,7 +111,7 @@ void phpdbg_set_breakpoint_method(const char* class_name, if (!zend_hash_exists(class_table, func_name, func_len)) { phpdbg_breakmethod_t new_break; - PHPDBG_G(has_method_bp) = 1; + PHPDBG_G(flags) |= PHPDBG_HAS_METHOD_BP; new_break.class_name = class_name; new_break.class_len = class_len; @@ -135,7 +135,7 @@ void phpdbg_set_breakpoint_opline(const char *name TSRMLS_DC) /* {{{ */ if (!zend_hash_index_exists(&PHPDBG_G(bp_oplines), opline)) { phpdbg_breakline_t new_break; - PHPDBG_G(has_opline_bp) = 1; + PHPDBG_G(flags) |= PHPDBG_HAS_OPLINE_BP; new_break.name = strdup(name); new_break.opline = opline; @@ -154,7 +154,7 @@ void phpdbg_set_breakpoint_opline_ex(phpdbg_opline_ptr_t opline TSRMLS_DC) /* {{ if (!zend_hash_index_exists(&PHPDBG_G(bp_oplines), (zend_ulong) opline)) { phpdbg_breakline_t new_break; - PHPDBG_G(has_opline_bp) = 1; + PHPDBG_G(flags) |= PHPDBG_HAS_OPLINE_BP; asprintf( (char**)&new_break.name, "%p", (zend_op*) opline); @@ -272,10 +272,7 @@ void phpdbg_clear_breakpoints(TSRMLS_D) /* {{{ */ zend_hash_clean(&PHPDBG_G(bp_oplines)); zend_hash_clean(&PHPDBG_G(bp_methods)); - PHPDBG_G(has_file_bp) = 0; - PHPDBG_G(has_sym_bp) = 0; - PHPDBG_G(has_opline_bp) = 0; - PHPDBG_G(has_method_bp) = 0; + PHPDBG_G(flags) &= ~(PHPDBG_HAS_FILE_BP|PHPDBG_HAS_SYM_BP|PHPDBG_HAS_METHOD_BP|PHPDBG_HAS_OPLINE_BP); PHPDBG_G(bp_count) = 0; } /* }}} */ diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 27caeddcbc3..eb087e00b7b 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -98,9 +98,14 @@ static PHPDBG_COMMAND(compile) /* {{{ */ static PHPDBG_COMMAND(step) /* {{{ */ { - PHPDBG_G(stepping) = atoi(expr); + if (atoi(expr)) { + PHPDBG_G(flags) |= PHPDBG_IS_STEPPING; + } else { + PHPDBG_G(flags) &= ~PHPDBG_IS_STEPPING; + } + printf( - "[Stepping %s]\n", PHPDBG_G(stepping) ? "on" : "off"); + "[Stepping %s]\n", (PHPDBG_G(flags) & PHPDBG_IS_STEPPING) ? "on" : "off"); return SUCCESS; } /* }}} */ @@ -130,7 +135,7 @@ static PHPDBG_COMMAND(run) /* {{{ */ zend_try { zend_execute(EG(active_op_array) TSRMLS_CC); } zend_catch { - if (!PHPDBG_G(quitting)) { + if (!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING)) { printf("[Caught excetion in VM]\n"); return FAILURE; } else return SUCCESS; @@ -146,14 +151,24 @@ static PHPDBG_COMMAND(run) /* {{{ */ static PHPDBG_COMMAND(eval) /* {{{ */ { zval retval; - + if (expr_len) { + zend_bool stepping = (PHPDBG_G(flags) & PHPDBG_IS_STEPPING); + + /* disable stepping while eval() in progress */ + PHPDBG_G(flags) &= ~ PHPDBG_IS_STEPPING; + if (zend_eval_stringl((char*)expr, expr_len-1, &retval, "eval()'d code" TSRMLS_CC) == SUCCESS) { zend_print_zval_r( &retval, 0 TSRMLS_CC); printf("\n"); } + + /* switch stepping back on */ + if (stepping) { + PHPDBG_G(flags) |= PHPDBG_IS_STEPPING; + } } else { printf("[No expression provided !]\n"); return FAILURE; @@ -204,7 +219,7 @@ static PHPDBG_COMMAND(print) /* {{{ */ printf("Execution Context Information:\n"); printf("Exec\t\t%s\n", PHPDBG_G(exec) ? PHPDBG_G(exec) : "none"); printf("Compiled\t%s\n", PHPDBG_G(ops) ? "yes" : "no"); - printf("Stepping\t%s\n", PHPDBG_G(stepping) ? "on" : "off"); + printf("Stepping\t%s\n", (PHPDBG_G(flags) & PHPDBG_IS_STEPPING) ? "on" : "off"); if (PHPDBG_G(ops)) { printf("Opcodes\t\t%d\n", PHPDBG_G(ops)->last); @@ -224,7 +239,7 @@ static PHPDBG_COMMAND(print) /* {{{ */ printf("Constants\t%d\n", zend_hash_num_elements(EG(zend_constants))); printf("Included\t%d\n", zend_hash_num_elements(&EG(included_files))); - if (PHPDBG_G(has_file_bp)) { + if ((PHPDBG_G(flags) & PHPDBG_HAS_FILE_BP)) { HashPosition position; zend_llist *points; @@ -268,7 +283,7 @@ static PHPDBG_COMMAND(print) /* {{{ */ } #endif - if (PHPDBG_G(has_opline_bp)) { + if ((PHPDBG_G(flags) & PHPDBG_HAS_OPLINE_BP)) { HashPosition position; phpdbg_breakline_t *brake; @@ -364,7 +379,7 @@ static PHPDBG_COMMAND(break) /* {{{ */ static PHPDBG_COMMAND(quit) /* {{{ */ { - PHPDBG_G(quitting)=1; + PHPDBG_G(flags) |= PHPDBG_IS_QUITTING; zend_bailout(); @@ -459,10 +474,14 @@ static PHPDBG_COMMAND(help) /* {{{ */ } /* }}} */ static PHPDBG_COMMAND(quiet) { /* {{{ */ - PHPDBG_G(quiet) = atoi(expr); + if (atoi(expr)) { + PHPDBG_G(flags) |= PHPDBG_IS_QUIET; + } else { + PHPDBG_G(flags) &= ~PHPDBG_IS_QUIET; + } printf( - "[Quietness %s]\n", PHPDBG_G(quiet) ? "enabled" : "disabled"); + "[Quietness %s]\n", (PHPDBG_G(flags) & PHPDBG_IS_QUIET) ? "enabled" : "disabled"); return SUCCESS; } /* }}} */ @@ -530,7 +549,7 @@ int phpdbg_interactive(TSRMLS_D) /* {{{ */ printf("phpdbg> "); - while (!PHPDBG_G(quitting) && + while (!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING) && fgets(cmd, PHPDBG_MAX_CMD, stdin) != NULL) { size_t cmd_len = strlen(cmd) - 1; @@ -541,7 +560,7 @@ int phpdbg_interactive(TSRMLS_D) /* {{{ */ if (cmd_len) { switch (phpdbg_do_cmd(phpdbg_prompt_commands, cmd, cmd_len TSRMLS_CC)) { case FAILURE: - if (!PHPDBG_G(quitting)) { + if (!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING)) { printf( "[Failed to execute %s !]\n", cmd); } @@ -556,7 +575,7 @@ int phpdbg_interactive(TSRMLS_D) /* {{{ */ PHPDBG_G(last_params), PHPDBG_G(last_params_len) TSRMLS_CC); } - if (!PHPDBG_G(quitting)) { + if (!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING)) { printf("phpdbg> "); } @@ -567,10 +586,12 @@ int phpdbg_interactive(TSRMLS_D) /* {{{ */ static void phpdbg_print_opline(zend_execute_data *execute_data TSRMLS_DC) /* {{{ */ { - if (!PHPDBG_G(quiet)) { + /* force out a line while stepping so the user knows what is happening */ + if (!(PHPDBG_G(flags) & PHPDBG_IS_QUIET) || (PHPDBG_G(flags) & PHPDBG_IS_STEPPING)) { zend_op *opline = execute_data->opline; - printf("[OPLINE: %p:%s]\n", opline, phpdbg_decode_opcode(opline->opcode)); + printf( + "[OPLINE: %p:%s]\n", opline, phpdbg_decode_opcode(opline->opcode)); } } /* }}} */ @@ -595,16 +616,16 @@ zend_vm_enter: phpdbg_print_opline( execute_data TSRMLS_CC); - if (PHPDBG_G(has_file_bp) + if ((PHPDBG_G(flags) & PHPDBG_HAS_FILE_BP) && phpdbg_find_breakpoint_file(execute_data->op_array TSRMLS_CC) == SUCCESS) { while (phpdbg_interactive(TSRMLS_C) != PHPDBG_NEXT) { - if (!PHPDBG_G(quitting)) { + if (!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING)) { continue; } } } - if ((PHPDBG_G(has_sym_bp)||PHPDBG_G(has_method_bp))) { + if ((PHPDBG_G(flags) & (PHPDBG_HAS_METHOD_BP|PHPDBG_HAS_SYM_BP))) { zend_execute_data *previous = execute_data->prev_execute_data; if (previous && previous != execute_data && previous->opline) { /* check we are the beginning of a function entry */ @@ -615,7 +636,7 @@ zend_vm_enter: case ZEND_INIT_STATIC_METHOD_CALL: { if (phpdbg_find_breakpoint_symbol(previous->function_state.function TSRMLS_CC) == SUCCESS) { while (phpdbg_interactive(TSRMLS_C) != PHPDBG_NEXT) { - if (!PHPDBG_G(quitting)) { + if (!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING)) { continue; } } @@ -626,10 +647,10 @@ zend_vm_enter: } } - if (PHPDBG_G(has_opline_bp) + if ((PHPDBG_G(flags) & PHPDBG_HAS_OPLINE_BP) && phpdbg_find_breakpoint_opline(execute_data->opline TSRMLS_CC) == SUCCESS) { while (phpdbg_interactive(TSRMLS_C) != PHPDBG_NEXT) { - if (!PHPDBG_G(quitting)) { + if (!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING)) { continue; } } @@ -637,9 +658,9 @@ zend_vm_enter: PHPDBG_G(vmret) = execute_data->opline->handler(execute_data TSRMLS_CC); - if (PHPDBG_G(stepping)) { + if ((PHPDBG_G(flags) & PHPDBG_IS_STEPPING)) { while (phpdbg_interactive(TSRMLS_C) != PHPDBG_NEXT) { - if (!PHPDBG_G(quitting)) { + if (!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING)) { continue; } } From 8586a1b4cc6bae64812f51f7e75863352ebc5f5b Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 01:27:48 +0000 Subject: [PATCH 118/771] ... --- phpdbg_prompt.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index eb087e00b7b..69c64a1bf49 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -220,7 +220,8 @@ static PHPDBG_COMMAND(print) /* {{{ */ printf("Exec\t\t%s\n", PHPDBG_G(exec) ? PHPDBG_G(exec) : "none"); printf("Compiled\t%s\n", PHPDBG_G(ops) ? "yes" : "no"); printf("Stepping\t%s\n", (PHPDBG_G(flags) & PHPDBG_IS_STEPPING) ? "on" : "off"); - + printf("Quietness\t%s\n", (PHPDBG_G(flags) & PHPDBG_IS_QUIET) ? "on" : "off"); + if (PHPDBG_G(ops)) { printf("Opcodes\t\t%d\n", PHPDBG_G(ops)->last); From 8de21cb2e295751ec96e1a9b20ca79605cb252af Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 01:31:51 +0000 Subject: [PATCH 119/771] [Not running] --- README.md | 2 -- phpdbg_prompt.c | 7 ++++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index dcfd3317d23..580538f20e9 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,6 @@ The interactive PHP debugger ============================ -phpdbg is an interactive debugger for PHP. - Implemented as a SAPI module, phpdbg can excerpt complete control over the environment without impacting the functionality or performance of your code. phpdbg aims to be a lightweight, easy to use debugging platform for PHP5.5+ diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 69c64a1bf49..9565ee61e81 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -567,8 +567,13 @@ int phpdbg_interactive(TSRMLS_D) /* {{{ */ } break; - case PHPDBG_NEXT: + case PHPDBG_NEXT: { + if (!EG(in_execution)) { + printf("[Not running]\n"); + } return PHPDBG_NEXT; + } + } } else if (PHPDBG_G(last)) { From 8ec5d30097e83ec753153a9504c8755f719c5f82 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Mon, 11 Nov 2013 23:41:14 -0200 Subject: [PATCH 120/771] - Added PHPDBG_BP_MASK macro --- phpdbg.h | 1 + phpdbg_bp.c | 32 ++++++++++++++++---------------- 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/phpdbg.h b/phpdbg.h index 457d682ce67..2e392e9dbb1 100644 --- a/phpdbg.h +++ b/phpdbg.h @@ -50,6 +50,7 @@ #define PHPDBG_HAS_SYM_BP 0x00000010 #define PHPDBG_HAS_OPLINE_BP 0x00000100 #define PHPDBG_HAS_METHOD_BP 0x00001000 +#define PHPDBG_BP_MASK (PHPDBG_HAS_FILE_BP|PHPDBG_HAS_SYM_BP|PHPDBG_HAS_METHOD_BP|PHPDBG_HAS_OPLINE_BP) #define PHPDBG_IS_STEPPING 0x00010000 #define PHPDBG_IS_QUIET 0x00100000 diff --git a/phpdbg_bp.c b/phpdbg_bp.c index e1138193d30..d147d59e515 100644 --- a/phpdbg_bp.c +++ b/phpdbg_bp.c @@ -36,7 +36,7 @@ static void phpdbg_llist_breakfile_dtor(void *data) /* {{{ */ static void phpdbg_class_breaks_dtor(void *data) /* {{{ */ { phpdbg_breakmethod_t *bp = (phpdbg_breakmethod_t*) data; - + efree((char*)bp->class_name); efree((char*)bp->func_name); } /* }}} */ @@ -92,33 +92,33 @@ void phpdbg_set_breakpoint_symbol(const char *name TSRMLS_DC) /* {{{ */ } } /* }}} */ -void phpdbg_set_breakpoint_method(const char* class_name, +void phpdbg_set_breakpoint_method(const char* class_name, size_t class_len, - const char* func_name, + const char* func_name, size_t func_len TSRMLS_DC) /* {{{ */ { HashTable class_breaks, *class_table; - + if (zend_hash_find(&PHPDBG_G(bp_methods), class_name, class_len, (void**)&class_table) != SUCCESS) { zend_hash_init( &class_breaks, 8, NULL, phpdbg_class_breaks_dtor, 0); zend_hash_update( - &PHPDBG_G(bp_methods), - class_name, class_len, + &PHPDBG_G(bp_methods), + class_name, class_len, (void**)&class_breaks, sizeof(HashTable), (void**)&class_table); } if (!zend_hash_exists(class_table, func_name, func_len)) { phpdbg_breakmethod_t new_break; - + PHPDBG_G(flags) |= PHPDBG_HAS_METHOD_BP; - + new_break.class_name = class_name; new_break.class_len = class_len; new_break.func_name = func_name; new_break.func_len = func_len; new_break.id = PHPDBG_G(bp_count)++; - + zend_hash_update(class_table, func_name, func_len, &new_break, sizeof(phpdbg_breakmethod_t), NULL); printf( "[Breakpoint #%d added at %s::%s]\n", new_break.id, class_name, func_name); @@ -200,9 +200,9 @@ int phpdbg_find_breakpoint_symbol(zend_function *fbc TSRMLS_DC) /* {{{ */ if (fbc->type != ZEND_USER_FUNCTION) { return FAILURE; } - + ops = (zend_op_array*)fbc; - + if (ops->scope) { /* find method breaks here */ return phpdbg_find_breakpoint_method( @@ -231,13 +231,13 @@ int phpdbg_find_breakpoint_method(zend_op_array *ops TSRMLS_DC) /* {{{ */ HashTable *class_table; phpdbg_breakmethod_t *bp; - if (zend_hash_find(&PHPDBG_G(bp_methods), ops->scope->name, ops->scope->name_length, + if (zend_hash_find(&PHPDBG_G(bp_methods), ops->scope->name, ops->scope->name_length, (void**)&class_table) == SUCCESS) { if (zend_hash_find( class_table, - ops->function_name, + ops->function_name, strlen(ops->function_name), (void**)&bp) == SUCCESS) { - + printf( "[Breakpoint #%d in %s::%s() at %s:%u]\n", bp->id, bp->class_name, bp->func_name, zend_get_executed_filename(TSRMLS_C), @@ -271,8 +271,8 @@ void phpdbg_clear_breakpoints(TSRMLS_D) /* {{{ */ zend_hash_clean(&PHPDBG_G(bp_symbols)); zend_hash_clean(&PHPDBG_G(bp_oplines)); zend_hash_clean(&PHPDBG_G(bp_methods)); - - PHPDBG_G(flags) &= ~(PHPDBG_HAS_FILE_BP|PHPDBG_HAS_SYM_BP|PHPDBG_HAS_METHOD_BP|PHPDBG_HAS_OPLINE_BP); + + PHPDBG_G(flags) &= ~PHPDBG_BP_MASK; PHPDBG_G(bp_count) = 0; } /* }}} */ From c2365d8283971f6318a5693ff5983de043ff81b2 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 01:51:50 +0000 Subject: [PATCH 121/771] compress globals --- phpdbg.c | 24 ++++++++++++------------ phpdbg.h | 32 ++++++++++++++++++-------------- phpdbg_bp.c | 36 ++++++++++++++++++------------------ phpdbg_prompt.c | 36 ++++++++++++++++++++++-------------- 4 files changed, 70 insertions(+), 58 deletions(-) diff --git a/phpdbg.c b/phpdbg.c index 794f6479c19..3cc4ba8a543 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -70,20 +70,20 @@ static void php_phpdbg_destroy_bp_methods(void *brake) /* {{{ */ static PHP_RINIT_FUNCTION(phpdbg) /* {{{ */ { - zend_hash_init(&PHPDBG_G(bp_files), 8, NULL, php_phpdbg_destroy_bp_file, 0); - zend_hash_init(&PHPDBG_G(bp_symbols), 8, NULL, php_phpdbg_destroy_bp_symbol, 0); - zend_hash_init(&PHPDBG_G(bp_oplines), 8, NULL, php_phpdbg_destroy_bp_opline, 0); - zend_hash_init(&PHPDBG_G(bp_methods), 8, NULL, php_phpdbg_destroy_bp_methods, 0); + zend_hash_init(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE], 8, NULL, php_phpdbg_destroy_bp_file, 0); + zend_hash_init(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM], 8, NULL, php_phpdbg_destroy_bp_symbol, 0); + zend_hash_init(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], 8, NULL, php_phpdbg_destroy_bp_opline, 0); + zend_hash_init(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], 8, NULL, php_phpdbg_destroy_bp_methods, 0); return SUCCESS; } /* }}} */ static PHP_RSHUTDOWN_FUNCTION(phpdbg) /* {{{ */ { - zend_hash_destroy(&PHPDBG_G(bp_files)); - zend_hash_destroy(&PHPDBG_G(bp_symbols)); - zend_hash_destroy(&PHPDBG_G(bp_oplines)); - zend_hash_destroy(&PHPDBG_G(bp_methods)); + zend_hash_destroy(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE]); + zend_hash_destroy(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM]); + zend_hash_destroy(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE]); + zend_hash_destroy(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD]); if (PHPDBG_G(exec)) { efree(PHPDBG_G(exec)); @@ -112,10 +112,10 @@ static PHP_FUNCTION(phpdbg_break) instructs phpdbg to clear breakpoints */ static PHP_FUNCTION(phpdbg_clear) { - zend_hash_clean(&PHPDBG_G(bp_files)); - zend_hash_clean(&PHPDBG_G(bp_symbols)); - zend_hash_clean(&PHPDBG_G(bp_oplines)); - zend_hash_clean(&PHPDBG_G(bp_methods)); + zend_hash_clean(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE]); + zend_hash_clean(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM]); + zend_hash_clean(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE]); + zend_hash_clean(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD]); } /* }}} */ zend_function_entry phpdbg_user_functions[] = { diff --git a/phpdbg.h b/phpdbg.h index 457d682ce67..6b24dad848d 100644 --- a/phpdbg.h +++ b/phpdbg.h @@ -45,6 +45,13 @@ #define PHPDBG_NEXT 2 +/* {{{ tables */ +#define PHPDBG_BREAK_FILE 0 +#define PHPDBG_BREAK_SYM 1 +#define PHPDBG_BREAK_OPLINE 2 +#define PHPDBG_BREAK_METHOD 3 +#define PHPDBG_BREAK_TABLES 4 /* }}} */ + /* {{{ flags */ #define PHPDBG_HAS_FILE_BP 0x00000001 #define PHPDBG_HAS_SYM_BP 0x00000010 @@ -58,20 +65,17 @@ typedef struct _phpdbg_command_t phpdbg_command_t; ZEND_BEGIN_MODULE_GLOBALS(phpdbg) - HashTable bp_files; /* file breakpoints */ - HashTable bp_symbols; /* symbol breakpoints */ - HashTable bp_oplines; /* opline breakpoints */ - HashTable bp_methods; /* method breakpoints */ - char *exec; /* file to execute */ - size_t exec_len; /* size of exec */ - zend_op_array *ops; /* op_array */ - zval *retval; /* return value */ - int bp_count; /* breakpoint count */ - int vmret; /* return from last opcode handler execution */ - phpdbg_command_t *last; /* last command */ - const char *last_params; /* last expression */ - size_t last_params_len; /* last expression length */ - zend_ulong flags; /* phpdbg flags */ + HashTable bp[PHPDBG_BREAK_TABLES]; /* break points */ + char *exec; /* file to execute */ + size_t exec_len; /* size of exec */ + zend_op_array *ops; /* op_array */ + zval *retval; /* return value */ + int bp_count; /* breakpoint count */ + int vmret; /* return from last opcode handler execution */ + phpdbg_command_t *last; /* last command */ + const char *last_params; /* last expression */ + size_t last_params_len; /* last expression length */ + zend_ulong flags; /* phpdbg flags */ ZEND_END_MODULE_GLOBALS(phpdbg) #endif /* PHPDBG_H */ diff --git a/phpdbg_bp.c b/phpdbg_bp.c index e1138193d30..bcca1da23ec 100644 --- a/phpdbg_bp.c +++ b/phpdbg_bp.c @@ -52,14 +52,14 @@ void phpdbg_set_breakpoint_file(const char *path, long line_num TSRMLS_DC) /* {{ PHPDBG_G(flags) |= PHPDBG_HAS_FILE_BP; - if (zend_hash_find(&PHPDBG_G(bp_files), + if (zend_hash_find(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE], new_break.filename, path_len, (void**)&break_files_ptr) == FAILURE) { zend_llist break_files; zend_llist_init(&break_files, sizeof(phpdbg_breakfile_t), phpdbg_llist_breakfile_dtor, 0); - zend_hash_update(&PHPDBG_G(bp_files), + zend_hash_update(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE], new_break.filename, path_len, &break_files, sizeof(zend_llist), (void**)&break_files_ptr); } @@ -75,7 +75,7 @@ void phpdbg_set_breakpoint_symbol(const char *name TSRMLS_DC) /* {{{ */ { size_t name_len = strlen(name); - if (!zend_hash_exists(&PHPDBG_G(bp_symbols), name, name_len)) { + if (!zend_hash_exists(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM], name, name_len)) { phpdbg_breaksymbol_t new_break; PHPDBG_G(flags) |= PHPDBG_HAS_SYM_BP; @@ -83,7 +83,7 @@ void phpdbg_set_breakpoint_symbol(const char *name TSRMLS_DC) /* {{{ */ new_break.symbol = estrndup(name, name_len + 1); new_break.id = PHPDBG_G(bp_count)++; - zend_hash_update(&PHPDBG_G(bp_symbols), new_break.symbol, + zend_hash_update(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM], new_break.symbol, name_len, &new_break, sizeof(phpdbg_breaksymbol_t), NULL); printf("[Breakpoint #%d added at %s]\n", new_break.id, new_break.symbol); @@ -99,11 +99,11 @@ void phpdbg_set_breakpoint_method(const char* class_name, { HashTable class_breaks, *class_table; - if (zend_hash_find(&PHPDBG_G(bp_methods), class_name, class_len, (void**)&class_table) != SUCCESS) { + if (zend_hash_find(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], class_name, class_len, (void**)&class_table) != SUCCESS) { zend_hash_init( &class_breaks, 8, NULL, phpdbg_class_breaks_dtor, 0); zend_hash_update( - &PHPDBG_G(bp_methods), + &PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], class_name, class_len, (void**)&class_breaks, sizeof(HashTable), (void**)&class_table); } @@ -132,7 +132,7 @@ void phpdbg_set_breakpoint_opline(const char *name TSRMLS_DC) /* {{{ */ { zend_ulong opline = strtoul(name, 0, 16); - if (!zend_hash_index_exists(&PHPDBG_G(bp_oplines), opline)) { + if (!zend_hash_index_exists(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], opline)) { phpdbg_breakline_t new_break; PHPDBG_G(flags) |= PHPDBG_HAS_OPLINE_BP; @@ -141,7 +141,7 @@ void phpdbg_set_breakpoint_opline(const char *name TSRMLS_DC) /* {{{ */ new_break.opline = opline; new_break.id = PHPDBG_G(bp_count)++; - zend_hash_index_update(&PHPDBG_G(bp_oplines), opline, &new_break, sizeof(phpdbg_breakline_t), NULL); + zend_hash_index_update(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], opline, &new_break, sizeof(phpdbg_breakline_t), NULL); printf("[Breakpoint #%d added at %s]\n", new_break.id, new_break.name); } else { @@ -151,7 +151,7 @@ void phpdbg_set_breakpoint_opline(const char *name TSRMLS_DC) /* {{{ */ void phpdbg_set_breakpoint_opline_ex(phpdbg_opline_ptr_t opline TSRMLS_DC) /* {{{ */ { - if (!zend_hash_index_exists(&PHPDBG_G(bp_oplines), (zend_ulong) opline)) { + if (!zend_hash_index_exists(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], (zend_ulong) opline)) { phpdbg_breakline_t new_break; PHPDBG_G(flags) |= PHPDBG_HAS_OPLINE_BP; @@ -162,7 +162,7 @@ void phpdbg_set_breakpoint_opline_ex(phpdbg_opline_ptr_t opline TSRMLS_DC) /* {{ new_break.opline = (zend_ulong) opline; new_break.id = PHPDBG_G(bp_count)++; - zend_hash_index_update(&PHPDBG_G(bp_oplines), (zend_ulong) opline, &new_break, sizeof(phpdbg_breakline_t), NULL); + zend_hash_index_update(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], (zend_ulong) opline, &new_break, sizeof(phpdbg_breakline_t), NULL); printf("[Breakpoint #%d added at %p]\n", new_break.id, (zend_op*) new_break.opline); } @@ -174,7 +174,7 @@ int phpdbg_find_breakpoint_file(zend_op_array *op_array TSRMLS_DC) /* {{{ */ zend_llist *break_list; zend_llist_element *le; - if (zend_hash_find(&PHPDBG_G(bp_files), op_array->filename, name_len, + if (zend_hash_find(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE], op_array->filename, name_len, (void**)&break_list) == FAILURE) { return FAILURE; } @@ -215,7 +215,7 @@ int phpdbg_find_breakpoint_symbol(zend_function *fbc TSRMLS_DC) /* {{{ */ fname = "main"; } - if (zend_hash_find(&PHPDBG_G(bp_symbols), fname, strlen(fname), + if (zend_hash_find(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM], fname, strlen(fname), (void**)&bp) == SUCCESS) { printf("[Breakpoint #%d in %s() at %s:%u]\n", bp->id, bp->symbol, zend_get_executed_filename(TSRMLS_C), @@ -231,7 +231,7 @@ int phpdbg_find_breakpoint_method(zend_op_array *ops TSRMLS_DC) /* {{{ */ HashTable *class_table; phpdbg_breakmethod_t *bp; - if (zend_hash_find(&PHPDBG_G(bp_methods), ops->scope->name, ops->scope->name_length, + if (zend_hash_find(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], ops->scope->name, ops->scope->name_length, (void**)&class_table) == SUCCESS) { if (zend_hash_find( class_table, @@ -253,7 +253,7 @@ int phpdbg_find_breakpoint_opline(phpdbg_opline_ptr_t opline TSRMLS_DC) /* {{{ * { phpdbg_breakline_t *bp; - if (zend_hash_index_find(&PHPDBG_G(bp_oplines), (zend_ulong) opline, + if (zend_hash_index_find(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], (zend_ulong) opline, (void**)&bp) == SUCCESS) { printf("[Breakpoint #%d in %s at %s:%u]\n", bp->id, bp->name, zend_get_executed_filename(TSRMLS_C), @@ -267,10 +267,10 @@ int phpdbg_find_breakpoint_opline(phpdbg_opline_ptr_t opline TSRMLS_DC) /* {{{ * void phpdbg_clear_breakpoints(TSRMLS_D) /* {{{ */ { - zend_hash_clean(&PHPDBG_G(bp_files)); - zend_hash_clean(&PHPDBG_G(bp_symbols)); - zend_hash_clean(&PHPDBG_G(bp_oplines)); - zend_hash_clean(&PHPDBG_G(bp_methods)); + zend_hash_clean(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE]); + zend_hash_clean(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM]); + zend_hash_clean(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE]); + zend_hash_clean(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD]); PHPDBG_G(flags) &= ~(PHPDBG_HAS_FILE_BP|PHPDBG_HAS_SYM_BP|PHPDBG_HAS_METHOD_BP|PHPDBG_HAS_OPLINE_BP); PHPDBG_G(bp_count) = 0; diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 9565ee61e81..df0f21beb41 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -246,9 +246,9 @@ static PHPDBG_COMMAND(print) /* {{{ */ printf("--------------------------------------\n"); printf("File Break Point Information:\n"); - for (zend_hash_internal_pointer_reset_ex(&PHPDBG_G(bp_files), &position); - zend_hash_get_current_data_ex(&PHPDBG_G(bp_files), (void**) &points, &position) == SUCCESS; - zend_hash_move_forward_ex(&PHPDBG_G(bp_files), &position)) { + for (zend_hash_internal_pointer_reset_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE], &position); + zend_hash_get_current_data_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE], (void**) &points, &position) == SUCCESS; + zend_hash_move_forward_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE], &position)) { zend_llist_position lposition; phpdbg_breakfile_t *brake; @@ -268,9 +268,9 @@ static PHPDBG_COMMAND(print) /* {{{ */ printf("--------------------------------------\n"); printf("Symbol Break Point Information:\n"); - for (zend_hash_internal_pointer_reset_ex(&PHPDBG_G(bp_symbols), &position); - zend_hash_get_current_data_ex(&PHPDBG_G(bp_symbols), (void**) &points, &position) == SUCCESS; - zend_hash_move_forward_ex(&PHPDBG_G(bp_symbols), &position)) { + for (zend_hash_internal_pointer_reset_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM], &position); + zend_hash_get_current_data_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM], (void**) &points, &position) == SUCCESS; + zend_hash_move_forward_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM], &position)) { zend_llist_position lposition; phpdbg_breaksymbol_t *brake; @@ -290,9 +290,9 @@ static PHPDBG_COMMAND(print) /* {{{ */ printf("--------------------------------------\n"); printf("Opline Break Point Information:\n"); - for (zend_hash_internal_pointer_reset_ex(&PHPDBG_G(bp_oplines), &position); - zend_hash_get_current_data_ex(&PHPDBG_G(bp_oplines), (void**) &brake, &position) == SUCCESS; - zend_hash_move_forward_ex(&PHPDBG_G(bp_oplines), &position)) { + for (zend_hash_internal_pointer_reset_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], &position); + zend_hash_get_current_data_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], (void**) &brake, &position) == SUCCESS; + zend_hash_move_forward_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], &position)) { printf("#%d\t%s\n", brake->id, brake->name); } } @@ -410,7 +410,15 @@ static PHPDBG_COMMAND(clean) /* {{{ */ printf("[\tFunctions: %d]\n", zend_hash_num_elements(EG(function_table))); printf("[\tConstants: %d]\n", zend_hash_num_elements(EG(zend_constants))); printf("[\tIncluded: %d]\n", zend_hash_num_elements(&EG(included_files))); - + + /* this is implicitly required */ + if (PHPDBG_G(ops)) { + destroy_op_array( + PHPDBG_G(ops) TSRMLS_CC); + efree(PHPDBG_G(ops)); + PHPDBG_G(ops) = NULL; + } + zend_hash_reverse_apply(EG(function_table), (apply_func_t) clean_non_persistent_function_full TSRMLS_CC); zend_hash_reverse_apply(EG(class_table), (apply_func_t) clean_non_persistent_class_full TSRMLS_CC); zend_hash_reverse_apply(EG(zend_constants), (apply_func_t) clean_non_persistent_constant_full TSRMLS_CC); @@ -433,10 +441,10 @@ static PHPDBG_COMMAND(clean) /* {{{ */ static PHPDBG_COMMAND(clear) /* {{{ */ { printf("[Clearing Breakpoints:]\n"); - printf("[\tFile\t%d]\n", zend_hash_num_elements(&PHPDBG_G(bp_files))); - printf("[\tSymbols\t%d]\n", zend_hash_num_elements(&PHPDBG_G(bp_symbols))); - printf("[\tOplines\t%d]\n", zend_hash_num_elements(&PHPDBG_G(bp_oplines))); - printf("[\tMethods\t%d]\n", zend_hash_num_elements(&PHPDBG_G(bp_methods))); + printf("[\tFile\t%d]\n", zend_hash_num_elements(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE])); + printf("[\tSymbols\t%d]\n", zend_hash_num_elements(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM])); + printf("[\tOplines\t%d]\n", zend_hash_num_elements(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE])); + printf("[\tMethods\t%d]\n", zend_hash_num_elements(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD])); phpdbg_clear_breakpoints(TSRMLS_C); From d7e09f95646f74f47e2ff15f1ef9b78da2592dec Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 02:04:54 +0000 Subject: [PATCH 122/771] blurb/version/issues string --- phpdbg.c | 4 ++++ phpdbg.h | 4 ++++ phpdbg_prompt.c | 4 ++-- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/phpdbg.c b/phpdbg.c index 3cc4ba8a543..ca38078b14b 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -379,6 +379,10 @@ int main(int argc, char *argv[]) /* {{{ */ ini_entries_len += sizeof(phpdbg_ini_hardcoded) - 2; phpdbg->ini_entries = ini_entries; + + printf("[Welcome to phpdbg, the interactive PHP debugger, v%s]\n", PHPDBG_VERSION); + printf("To get help using phpdbg type \"help\" and press enter\n"); + printf("[Please report bugs to <%s>]\n", PHPDBG_ISSUES); if (phpdbg->startup(phpdbg) == SUCCESS) { zend_activate(TSRMLS_C); diff --git a/phpdbg.h b/phpdbg.h index 908c1cc4b7a..446b0671948 100644 --- a/phpdbg.h +++ b/phpdbg.h @@ -63,6 +63,10 @@ #define PHPDBG_IS_QUIET 0x00100000 #define PHPDBG_IS_QUITTING 0x01000000 /* }}} */ +/* {{{ strings */ +#define PHPDBG_ISSUES "http://github.com/krakjoe/phpdbg/issues" +#define PHPDBG_VERSION "0.0.0" /* }}} */ + typedef struct _phpdbg_command_t phpdbg_command_t; ZEND_BEGIN_MODULE_GLOBALS(phpdbg) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index df0f21beb41..fb6ba7cebc1 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -453,7 +453,7 @@ static PHPDBG_COMMAND(clear) /* {{{ */ static PHPDBG_COMMAND(help) /* {{{ */ { - printf("[Welcome to phpdbg, the interactive PHP debugger.]\n"); + printf("[Welcome to phpdbg, the interactive PHP debugger, v%s]\n", PHPDBG_VERSION); if (!expr_len) { const phpdbg_command_t *prompt_command = phpdbg_prompt_commands; @@ -477,7 +477,7 @@ static PHPDBG_COMMAND(help) /* {{{ */ printf("failed to find help command: %s\n", expr); } } - printf("[Please report bugs to ]\n"); + printf("[Please report bugs to <%s>]\n", PHPDBG_ISSUES); return SUCCESS; } /* }}} */ From e32d511cecd3b39a756f63c68608ffeb24d35b1f Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Tue, 12 Nov 2013 00:19:43 -0200 Subject: [PATCH 123/771] - Added "list func" support --- config.m4 | 2 +- phpdbg_help.c | 2 ++ phpdbg_help.h | 2 +- phpdbg_list.c | 14 ++++++++++ phpdbg_list.h | 3 +++ phpdbg_prompt.c | 69 ++++++++++++++++++++++++++++++------------------- phpdbg_utils.c | 31 ++++++++++++++++++++++ phpdbg_utils.h | 25 ++++++++++++++++++ 8 files changed, 119 insertions(+), 29 deletions(-) create mode 100644 phpdbg_utils.c create mode 100644 phpdbg_utils.h diff --git a/config.m4 b/config.m4 index 1a99db0f24d..df127084ae8 100644 --- a/config.m4 +++ b/config.m4 @@ -9,7 +9,7 @@ if test "$PHP_PHPDBG" != "no"; then AC_DEFINE(HAVE_PHPDBG, 1, [ ]) PHP_PHPDBG_CFLAGS="-I$abc_srcdir" - PHP_PHPDBG_FILES="phpdbg.c phpdbg_prompt.c phpdbg_help.c phpdbg_bp.c phpdbg_opcode.c phpdbg_list.c" + PHP_PHPDBG_FILES="phpdbg.c phpdbg_prompt.c phpdbg_help.c phpdbg_bp.c phpdbg_opcode.c phpdbg_list.c phpdbg_utils.c" PHP_SUBST(PHP_PHPDBG_CFLAGS) PHP_SUBST(PHP_PHPDBG_FILES) diff --git a/phpdbg_help.c b/phpdbg_help.c index 97a99fde69e..eb5982648c6 100644 --- a/phpdbg_help.c +++ b/phpdbg_help.c @@ -140,5 +140,7 @@ PHPDBG_HELP(list) /* {{{ */ printf("The list command displays N line from current context file.\n"); printf("\tphpdbg> list 2\n"); printf("Will print next 2 lines from the current file\n"); + printf("\tphpdbg> list func\n"); + printf("Will print func source code\n"); return SUCCESS; } /* }}} */ diff --git a/phpdbg_help.h b/phpdbg_help.h index 9e187a8b395..ba79747a5ad 100644 --- a/phpdbg_help.h +++ b/phpdbg_help.h @@ -64,7 +64,7 @@ static const phpdbg_command_t phpdbg_help_commands[] = { PHPDBG_HELP_D(clear, "clearing breakpoints allows you to run code without interruption"), PHPDBG_HELP_D(back, "show debug backtrace information during execution"), PHPDBG_HELP_D(quiet, "be quiet during execution"), - PHPDBG_HELP_D(list, "list specified line"), + PHPDBG_HELP_D(list, "list specified line or function"), {NULL, 0, 0} }; diff --git a/phpdbg_list.c b/phpdbg_list.c index d4603155312..d5e07d49df7 100644 --- a/phpdbg_list.c +++ b/phpdbg_list.c @@ -73,3 +73,17 @@ void phpdbg_list_file(const char *filename, long count, long offset) /* {{{ */ out: close(fd); } /* }}} */ + +void phpdbg_list_function(const zend_function *fbc) /* {{{ */ +{ + const zend_op_array *ops; + + if (fbc->type != ZEND_USER_FUNCTION) { + return; + } + + ops = (zend_op_array*)fbc; + + phpdbg_list_file(ops->filename, + ops->line_end - ops->line_start + 1, ops->line_start); +} /* }}} */ diff --git a/phpdbg_list.h b/phpdbg_list.h index 4531a65d106..95cc06e93a8 100644 --- a/phpdbg_list.h +++ b/phpdbg_list.h @@ -20,6 +20,9 @@ #ifndef PHPDBG_LIST_H #define PHPDBG_LIST_H +#include "zend_compile.h" + void phpdbg_list_file(const char*, long, long); +void phpdbg_list_function(const zend_function*); #endif /* PHPDBG_LIST_H */ diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 9565ee61e81..65edb55f18d 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -26,6 +26,7 @@ #include "phpdbg_bp.h" #include "phpdbg_opcode.h" #include "phpdbg_list.h" +#include "phpdbg_utils.h" static const phpdbg_command_t phpdbg_prompt_commands[]; @@ -103,7 +104,7 @@ static PHPDBG_COMMAND(step) /* {{{ */ } else { PHPDBG_G(flags) &= ~PHPDBG_IS_STEPPING; } - + printf( "[Stepping %s]\n", (PHPDBG_G(flags) & PHPDBG_IS_STEPPING) ? "on" : "off"); return SUCCESS; @@ -151,20 +152,20 @@ static PHPDBG_COMMAND(run) /* {{{ */ static PHPDBG_COMMAND(eval) /* {{{ */ { zval retval; - + if (expr_len) { zend_bool stepping = (PHPDBG_G(flags) & PHPDBG_IS_STEPPING); - + /* disable stepping while eval() in progress */ PHPDBG_G(flags) &= ~ PHPDBG_IS_STEPPING; - + if (zend_eval_stringl((char*)expr, expr_len-1, &retval, "eval()'d code" TSRMLS_CC) == SUCCESS) { zend_print_zval_r( &retval, 0 TSRMLS_CC); printf("\n"); } - + /* switch stepping back on */ if (stepping) { PHPDBG_G(flags) |= PHPDBG_IS_STEPPING; @@ -221,7 +222,7 @@ static PHPDBG_COMMAND(print) /* {{{ */ printf("Compiled\t%s\n", PHPDBG_G(ops) ? "yes" : "no"); printf("Stepping\t%s\n", (PHPDBG_G(flags) & PHPDBG_IS_STEPPING) ? "on" : "off"); printf("Quietness\t%s\n", (PHPDBG_G(flags) & PHPDBG_IS_QUIET) ? "on" : "off"); - + if (PHPDBG_G(ops)) { printf("Opcodes\t\t%d\n", PHPDBG_G(ops)->last); @@ -305,15 +306,15 @@ static PHPDBG_COMMAND(break) /* {{{ */ { char *line_pos = NULL; char *func_pos = NULL; - + if (!expr_len) { printf( "[No expression found]\n"); return FAILURE; } - + line_pos = strchr(expr, ':'); - + if (line_pos) { if (!(func_pos=strchr(line_pos+1, ':'))) { char path[MAXPATHLEN], resolved_name[MAXPATHLEN]; @@ -336,19 +337,19 @@ static PHPDBG_COMMAND(break) /* {{{ */ } else { char *class; char *func; - + size_t func_len = strlen(func_pos+1), class_len = (line_pos - expr); - + if (func_len) { class = emalloc(class_len+1); func = emalloc(func_len+1); - + memcpy(class, expr, class_len); class[class_len]='\0'; memcpy(func, func_pos+1, func_len); func[func_len]='\0'; - + phpdbg_set_breakpoint_method(class, class_len, func, func_len TSRMLS_CC); } else { printf("[No function found in method expression %s]\n", expr); @@ -437,7 +438,7 @@ static PHPDBG_COMMAND(clear) /* {{{ */ printf("[\tSymbols\t%d]\n", zend_hash_num_elements(&PHPDBG_G(bp_symbols))); printf("[\tOplines\t%d]\n", zend_hash_num_elements(&PHPDBG_G(bp_oplines))); printf("[\tMethods\t%d]\n", zend_hash_num_elements(&PHPDBG_G(bp_methods))); - + phpdbg_clear_breakpoints(TSRMLS_C); return SUCCESS; @@ -489,18 +490,32 @@ static PHPDBG_COMMAND(quiet) { /* {{{ */ static PHPDBG_COMMAND(list) /* {{{ */ { - long offset = 0, count = strtol(expr, NULL, 0); - const char *filename = PHPDBG_G(exec); - - if (zend_is_executing(TSRMLS_C)) { - filename = zend_get_executed_filename(TSRMLS_C); - offset = zend_get_executed_lineno(TSRMLS_C); - } else if (!filename) { - printf("[No file to list]\n"); - return SUCCESS; - } + if (phpdbg_is_numeric(expr)) { + long offset = 0, count = strtol(expr, NULL, 0); + const char *filename = PHPDBG_G(exec); + + if (zend_is_executing(TSRMLS_C)) { + filename = zend_get_executed_filename(TSRMLS_C); + offset = zend_get_executed_lineno(TSRMLS_C); + } else if (!filename) { + printf("[No file to list]\n"); + return SUCCESS; + } + + phpdbg_list_file(filename, count, offset); + } else { + zend_function* fbc; - phpdbg_list_file(filename, count, offset); + if (!EG(function_table)) { + printf("[No function table loaded]\n"); + return SUCCESS; + } + + if (zend_hash_find(EG(function_table), expr, strlen(expr)+1, + (void**)&fbc) == SUCCESS) { + phpdbg_list_function(fbc); + } + } return SUCCESS; } /* }}} */ @@ -573,7 +588,7 @@ int phpdbg_interactive(TSRMLS_D) /* {{{ */ } return PHPDBG_NEXT; } - + } } else if (PHPDBG_G(last)) { @@ -652,7 +667,7 @@ zend_vm_enter: } } } - + if ((PHPDBG_G(flags) & PHPDBG_HAS_OPLINE_BP) && phpdbg_find_breakpoint_opline(execute_data->opline TSRMLS_CC) == SUCCESS) { while (phpdbg_interactive(TSRMLS_C) != PHPDBG_NEXT) { diff --git a/phpdbg_utils.c b/phpdbg_utils.c new file mode 100644 index 00000000000..4b0c4a02169 --- /dev/null +++ b/phpdbg_utils.c @@ -0,0 +1,31 @@ +/* + +----------------------------------------------------------------------+ + | PHP Version 5 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997-2013 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 3.01 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | http://www.php.net/license/3_01.txt | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Authors: Felipe Pena | + | Authors: Joe Watkins | + +----------------------------------------------------------------------+ +*/ + +#include +#include "phpdbg_utils.h" + +int phpdbg_is_numeric(const char *str) /* {{{ */ +{ + for (; *str; str++) { + if (isspace(*str)) { + continue; + } + return isdigit(*str); + } +} /* }}} */ diff --git a/phpdbg_utils.h b/phpdbg_utils.h new file mode 100644 index 00000000000..231a1b3f216 --- /dev/null +++ b/phpdbg_utils.h @@ -0,0 +1,25 @@ +/* + +----------------------------------------------------------------------+ + | PHP Version 5 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997-2013 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 3.01 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | http://www.php.net/license/3_01.txt | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Authors: Felipe Pena | + | Authors: Joe Watkins | + +----------------------------------------------------------------------+ +*/ + +#ifndef PHPDBG_UTILS_H +#define PHPDBG_UTILS_H + +int phpdbg_is_numeric(const char *); + +#endif /* PHPDBG_UTILS_H */ From 6aad2ee42c355934190a46f55b7f6633f9bea407 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Tue, 12 Nov 2013 00:28:52 -0200 Subject: [PATCH 124/771] - Fix function --- phpdbg_utils.c | 1 + 1 file changed, 1 insertion(+) diff --git a/phpdbg_utils.c b/phpdbg_utils.c index 4b0c4a02169..4991d3d9e5f 100644 --- a/phpdbg_utils.c +++ b/phpdbg_utils.c @@ -28,4 +28,5 @@ int phpdbg_is_numeric(const char *str) /* {{{ */ } return isdigit(*str); } + return 0; } /* }}} */ From c7b51537a03734a3e0a8fbb9100840cd64a66d37 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 02:29:56 +0000 Subject: [PATCH 125/771] fix --- phpdbg_list.c | 15 ++++++++------- phpdbg_list.h | 2 +- phpdbg_prompt.c | 2 +- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/phpdbg_list.c b/phpdbg_list.c index d4603155312..f4209e12198 100644 --- a/phpdbg_list.c +++ b/phpdbg_list.c @@ -23,25 +23,26 @@ #include #include #include +#include "phpdbg.h" #include "phpdbg_list.h" -void phpdbg_list_file(const char *filename, long count, long offset) /* {{{ */ +void phpdbg_list_file(const char *filename, long count, long offset TSRMLS_DC) /* {{{ */ { unsigned char *mem, *pos, *last_pos, *end_pos; struct stat st; int fd, all_content = (count == 0); unsigned int line = 0, displayed = 0; - if ((fd = open(filename, O_RDONLY)) == -1) { - printf("[Failed to open file %s to list]\n", filename); - return; - } - - if (fstat(fd, &st) == -1) { + if (VCWD_STAT(filename, &st) == -1) { printf("[Failed to stat file %s]\n", filename); goto out; } + if ((fd = VCWD_OPEN(filename, O_RDONLY)) == -1) { + printf("[Failed to open file %s to list]\n", filename); + return; + } + last_pos = mem = mmap(0, st.st_size, PROT_READ, MAP_SHARED, fd, 0); end_pos = mem + st.st_size; diff --git a/phpdbg_list.h b/phpdbg_list.h index 4531a65d106..883f9917f1b 100644 --- a/phpdbg_list.h +++ b/phpdbg_list.h @@ -20,6 +20,6 @@ #ifndef PHPDBG_LIST_H #define PHPDBG_LIST_H -void phpdbg_list_file(const char*, long, long); +void phpdbg_list_file(const char*, long, long TSRMLS_DC); #endif /* PHPDBG_LIST_H */ diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index fb6ba7cebc1..c30d15589b5 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -508,7 +508,7 @@ static PHPDBG_COMMAND(list) /* {{{ */ return SUCCESS; } - phpdbg_list_file(filename, count, offset); + phpdbg_list_file(filename, count, offset TSRMLS_CC); return SUCCESS; } /* }}} */ From bd432b995e30ad13f725c367960f5dc4f8776d81 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Tue, 12 Nov 2013 00:34:10 -0200 Subject: [PATCH 126/771] - Update list cmd description --- phpdbg_prompt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index f7ec9419b88..d87fd2bf0af 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -538,7 +538,7 @@ static const phpdbg_command_t phpdbg_prompt_commands[] = { PHPDBG_COMMAND_D(print, "print something"), PHPDBG_COMMAND_D(break, "set breakpoint"), PHPDBG_COMMAND_D(back, "show backtrace"), - PHPDBG_COMMAND_D(list, "list specified line"), + PHPDBG_COMMAND_D(list, "list specified line or function"), PHPDBG_COMMAND_D(clean, "clean the execution environment"), PHPDBG_COMMAND_D(clear, "clear breakpoints"), PHPDBG_COMMAND_D(help, "show help menu"), From 6658f58d4afcb80ffaeac460564aecb1591ecd93 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Tue, 12 Nov 2013 00:50:15 -0200 Subject: [PATCH 127/771] - Added phpdbg_is_empty function --- phpdbg_prompt.c | 2 +- phpdbg_utils.c | 11 +++++++++++ phpdbg_utils.h | 3 ++- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 5fd07125228..b71bd3d8203 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -498,7 +498,7 @@ static PHPDBG_COMMAND(quiet) { /* {{{ */ static PHPDBG_COMMAND(list) /* {{{ */ { - if (phpdbg_is_numeric(expr)) { + if (phpdbg_is_empty(expr) || phpdbg_is_numeric(expr)) { long offset = 0, count = strtol(expr, NULL, 0); const char *filename = PHPDBG_G(exec); diff --git a/phpdbg_utils.c b/phpdbg_utils.c index 4991d3d9e5f..e3408ed47e7 100644 --- a/phpdbg_utils.c +++ b/phpdbg_utils.c @@ -30,3 +30,14 @@ int phpdbg_is_numeric(const char *str) /* {{{ */ } return 0; } /* }}} */ + +int phpdbg_is_empty(const char *str) /* {{{ */ +{ + for (; *str; str++) { + if (isspace(*str)) { + continue; + } + return 0; + } + return 1; +} /* }}} */ diff --git a/phpdbg_utils.h b/phpdbg_utils.h index 231a1b3f216..3cb430f0594 100644 --- a/phpdbg_utils.h +++ b/phpdbg_utils.h @@ -20,6 +20,7 @@ #ifndef PHPDBG_UTILS_H #define PHPDBG_UTILS_H -int phpdbg_is_numeric(const char *); +int phpdbg_is_numeric(const char*); +int phpdbg_is_empty(const char*); #endif /* PHPDBG_UTILS_H */ From b9c1c872f6fcf99b0ba8e3f26a21814e475bd788 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 02:50:24 +0000 Subject: [PATCH 128/771] ... --- phpdbg_prompt.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 5fd07125228..7d8ed357d7a 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -513,13 +513,13 @@ static PHPDBG_COMMAND(list) /* {{{ */ phpdbg_list_file(filename, count, offset TSRMLS_CC); } else { zend_function* fbc; - + if (!EG(function_table)) { printf("[No function table loaded]\n"); return SUCCESS; } - if (zend_hash_find(EG(function_table), expr, strlen(expr)+1, + if (zend_hash_find(EG(function_table), expr, expr_len, (void**)&fbc) == SUCCESS) { phpdbg_list_function(fbc TSRMLS_CC); } From 32acf4736bc0d59a3d41d52244ace2ba62d7c958 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 02:52:43 +0000 Subject: [PATCH 129/771] ... --- phpdbg_list.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpdbg_list.c b/phpdbg_list.c index 3bfa2141626..fe14b1dcc9e 100644 --- a/phpdbg_list.c +++ b/phpdbg_list.c @@ -35,7 +35,7 @@ void phpdbg_list_file(const char *filename, long count, long offset TSRMLS_DC) / if (VCWD_STAT(filename, &st) == -1) { printf("[Failed to stat file %s]\n", filename); - goto out; + return; } if ((fd = VCWD_OPEN(filename, O_RDONLY)) == -1) { From f704fdea57d32cc8fa4bd98a208d9c8428bc05e4 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Tue, 12 Nov 2013 00:54:22 -0200 Subject: [PATCH 130/771] - Not needed strlen() here --- phpdbg_prompt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index b71bd3d8203..4f5c6e058cb 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -519,7 +519,7 @@ static PHPDBG_COMMAND(list) /* {{{ */ return SUCCESS; } - if (zend_hash_find(EG(function_table), expr, strlen(expr)+1, + if (zend_hash_find(EG(function_table), expr, expr_len, (void**)&fbc) == SUCCESS) { phpdbg_list_function(fbc TSRMLS_CC); } From ed690e1899fa1d9234961a9b1e077c5d6912dc74 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 02:59:10 +0000 Subject: [PATCH 131/771] ... --- phpdbg_prompt.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 44625a99c5a..104247794f8 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -522,6 +522,8 @@ static PHPDBG_COMMAND(list) /* {{{ */ if (zend_hash_find(EG(function_table), expr, expr_len, (void**)&fbc) == SUCCESS) { phpdbg_list_function(fbc TSRMLS_CC); + } else { + printf("[Function %s not found]\n", expr); } } From 3097c36f3042fe3f49d80eed810197036f94ab66 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 03:02:42 +0000 Subject: [PATCH 132/771] more help --- phpdbg_help.c | 1 + phpdbg_help.h | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/phpdbg_help.c b/phpdbg_help.c index eb5982648c6..d942ebeb611 100644 --- a/phpdbg_help.c +++ b/phpdbg_help.c @@ -142,5 +142,6 @@ PHPDBG_HELP(list) /* {{{ */ printf("Will print next 2 lines from the current file\n"); printf("\tphpdbg> list func\n"); printf("Will print func source code\n"); + printf("Note: before listing functions you must have a populated function table, try compile !!\n"); return SUCCESS; } /* }}} */ diff --git a/phpdbg_help.h b/phpdbg_help.h index ba79747a5ad..9c89f3dcae2 100644 --- a/phpdbg_help.h +++ b/phpdbg_help.h @@ -64,7 +64,7 @@ static const phpdbg_command_t phpdbg_help_commands[] = { PHPDBG_HELP_D(clear, "clearing breakpoints allows you to run code without interruption"), PHPDBG_HELP_D(back, "show debug backtrace information during execution"), PHPDBG_HELP_D(quiet, "be quiet during execution"), - PHPDBG_HELP_D(list, "list specified line or function"), + PHPDBG_HELP_D(list, "listing code gives you quick access to code while executing"), {NULL, 0, 0} }; From 08973a6bf5009dd14b2004259d0dd260726cd414 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 03:04:12 +0000 Subject: [PATCH 133/771] ... --- phpdbg.png | Bin 109358 -> 132259 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/phpdbg.png b/phpdbg.png index 85f9815526f2344bdb29b76c70bf97db1111639a..403652be89325f83ecb68d8bca97b38a4fe753a3 100644 GIT binary patch literal 132259 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 l{7&o#qA05>Qz2~<{6CiUpsWA@ literal 109358 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

JRH8w|Af?=*M7$=o)|Ed8@2)n1O?w_+xaR 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

!}>49 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 From 97d4052bb85915016838f5fe5ed78c43ad7cf665 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 03:14:56 +0000 Subject: [PATCH 134/771] ... --- README.md | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 580538f20e9..ba13c0d54db 100644 --- a/README.md +++ b/README.md @@ -3,23 +3,26 @@ The interactive PHP debugger Implemented as a SAPI module, phpdbg can excerpt complete control over the environment without impacting the functionality or performance of your code. -phpdbg aims to be a lightweight, easy to use debugging platform for PHP5.5+ +phpdbg aims to be a lightweight, powerful, easy to use debugging platform for PHP5.5+ Features ======== - - step through debugging - - break at method/function entry, file:line or address - - showing debug backtraces - - easy manipulation of the environment with built-in eval() - - userland API - - sapi agnositicism, easy integration + - Stepthrough Debugging + - Flexible Breakpoints (Class Method, Function, File:Line, internally Opline) + - Easy Access to PHP with built-in eval() + - Easy Access to Currently Executing Code + - Userland API + - SAPI Agnostic - Easily Integrated + - PHP Configuration File Support + - JIT Super Globals - Set Your Own !! + - Easy Operation - See Help :) Planned ======= - - mocking server environments/requests - - improve everything + - Mocking API for Server/Request Environments + - Improve Everything :) Installation ============ From 33f0502f1978fc89fede8b5dd7a8ced79f95d115 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 04:20:14 +0000 Subject: [PATCH 135/771] readline support #6 --- phpdbg.h | 5 +++++ phpdbg_prompt.c | 56 ++++++++++++++++++++++++++++++++----------------- 2 files changed, 42 insertions(+), 19 deletions(-) diff --git a/phpdbg.h b/phpdbg.h index 446b0671948..2a018295e96 100644 --- a/phpdbg.h +++ b/phpdbg.h @@ -37,6 +37,11 @@ # include "TSRM.h" #endif +#ifdef HAVE_LIBREADLINE +# include +# include +#endif + #ifdef ZTS # define PHPDBG_G(v) TSRMG(phpdbg_globals_id, zend_phpdbg_globals *, v) #else diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 104247794f8..e438072c2a8 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -307,7 +307,7 @@ static PHPDBG_COMMAND(break) /* {{{ */ char *line_pos = NULL; char *func_pos = NULL; - if (!expr_len) { + if (expr_len <= 0L) { printf( "[No expression found]\n"); return FAILURE; @@ -456,7 +456,11 @@ static PHPDBG_COMMAND(help) /* {{{ */ { printf("[Welcome to phpdbg, the interactive PHP debugger, v%s]\n", PHPDBG_VERSION); - if (!expr_len) { + if (expr_len > 0L) { + if (phpdbg_do_cmd(phpdbg_help_commands, (char*)expr, expr_len TSRMLS_CC) == FAILURE) { + printf("failed to find help command: %s/%d\n", expr, expr_len); + } + } else { const phpdbg_command_t *prompt_command = phpdbg_prompt_commands; const phpdbg_command_t *help_command = phpdbg_help_commands; @@ -473,11 +477,8 @@ static PHPDBG_COMMAND(help) /* {{{ */ printf("\t%s\t%s\n", help_command->name, help_command->tip); ++help_command; } - } else { - if (phpdbg_do_cmd(phpdbg_help_commands, (char*)expr, expr_len TSRMLS_CC) == FAILURE) { - printf("failed to find help command: %s\n", expr); - } } + printf("[Please report bugs to <%s>]\n", PHPDBG_ISSUES); return SUCCESS; @@ -571,19 +572,39 @@ int phpdbg_do_cmd(const phpdbg_command_t *command, char *cmd_line, size_t cmd_le int phpdbg_interactive(TSRMLS_D) /* {{{ */ { - char cmd[PHPDBG_MAX_CMD]; - - printf("phpdbg> "); - + size_t cmd_len; + +#ifndef HAVE_LIBREADLINE + char cmd[PHPDBG_MAX_CMD]; + +phpdbg_interactive_enter: + printf("phpdbg> "); + while (!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING) && fgets(cmd, PHPDBG_MAX_CMD, stdin) != NULL) { - size_t cmd_len = strlen(cmd) - 1; + cmd_len = strlen(cmd) - 1; +#else + char *cmd = NULL; - if (cmd[cmd_len] == '\n') { - cmd[cmd_len] = 0; - } +phpdbg_interactive_enter: + while (!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING)) { + cmd = readline("phpdbg> "); + + cmd_len = strlen(cmd); +#endif + + /* trim space from end of input */ + while (isspace(cmd[cmd_len-1])) + cmd_len--; + + /* ensure string is null terminated */ + cmd[cmd_len] = '\0'; - if (cmd_len) { + if (cmd && cmd_len > 0L) { +#ifdef HAVE_LIBREADLINE + add_history(cmd); +#endif + switch (phpdbg_do_cmd(phpdbg_prompt_commands, cmd, cmd_len TSRMLS_CC)) { case FAILURE: if (!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING)) { @@ -598,8 +619,6 @@ int phpdbg_interactive(TSRMLS_D) /* {{{ */ } return PHPDBG_NEXT; } - - } } else if (PHPDBG_G(last)) { PHPDBG_G(last)->handler( @@ -607,9 +626,8 @@ int phpdbg_interactive(TSRMLS_D) /* {{{ */ } if (!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING)) { - printf("phpdbg> "); + goto phpdbg_interactive_enter; } - } return SUCCESS; From bf8a9c141fcad21738156349a9c2b2900ee2908a Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 04:22:33 +0000 Subject: [PATCH 136/771] readline --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index ba13c0d54db..1b03abe63dc 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,7 @@ Features - SAPI Agnostic - Easily Integrated - PHP Configuration File Support - JIT Super Globals - Set Your Own !! + - Optional readline Support - Comfortable Terminal Operation - Easy Operation - See Help :) Planned @@ -39,6 +40,8 @@ make -j8 make install-phpdbg ``` +*Note: php must be configured with the switch --with-readline for phpdbg to support history, autocompletion, tab-listing etc* + Command Line Options ==================== From 6c317b771e5e342497a39e5610c8fe49cfd628a0 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 04:53:04 +0000 Subject: [PATCH 137/771] more command line options --- phpdbg.c | 34 +++++++++++++++++++++++++++++++++- phpdbg_prompt.c | 2 +- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/phpdbg.c b/phpdbg.c index ca38078b14b..52998a6527a 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -262,6 +262,10 @@ const opt_struct OPTIONS[] = { /* {{{ */ {'d', 1, "define ini entry on command line"}, {'n', 0, "no php.ini"}, {'z', 1, "load zend_extension"}, + /* phpdbg options */ + {'e', 1, "exec"}, + {'v', 0, "verbose"}, + {'s', 0, "step"}, {'-', 0, NULL} }; /* }}} */ @@ -291,6 +295,9 @@ int main(int argc, char *argv[]) /* {{{ */ sapi_module_struct *phpdbg = &phpdbg_sapi_module; char *ini_entries = NULL; int ini_entries_len = 0; + char *exec = NULL; + size_t exec_len = 0L; + zend_ulong flags = PHPDBG_IS_QUIET; char *php_optarg = NULL; int php_optind = 1; int opt; @@ -311,7 +318,7 @@ int main(int argc, char *argv[]) /* {{{ */ tsrm_ls = ts_resource(0); #endif - + while ((opt = php_getopt(argc, argv, OPTIONS, &php_optarg, &php_optind, 0, 2)) != -1) { switch (opt) { case 'n': @@ -355,6 +362,21 @@ int main(int argc, char *argv[]) /* {{{ */ case 'z': zend_load_extension(php_optarg); break; + + case 'e': /* set execution context */ + exec_len = strlen(php_optarg); + if (exec_len) { + exec = strdup(php_optarg); + } + break; + + case 'v': /* set quietness off */ + flags &= ~PHPDBG_IS_QUIET; + break; + + case 's': /* set stepping on */ + flags |= PHPDBG_IS_STEPPING; + break; } } @@ -395,6 +417,16 @@ int main(int argc, char *argv[]) /* {{{ */ PG(modules_activated) = 0; + if (exec) { /* set execution context */ + PHPDBG_G(exec) = estrndup(exec, exec_len); + PHPDBG_G(exec_len) = exec_len; + + free(exec); + } + + /* set flags from command line */ + PHPDBG_G(flags) = flags; + zend_try { zend_activate_modules(TSRMLS_C); } zend_end_try(); diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index e438072c2a8..d255a9d8731 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -604,7 +604,7 @@ phpdbg_interactive_enter: #ifdef HAVE_LIBREADLINE add_history(cmd); #endif - + switch (phpdbg_do_cmd(phpdbg_prompt_commands, cmd, cmd_len TSRMLS_CC)) { case FAILURE: if (!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING)) { From 12926b6aa998c37278cf21b9634c0c23d76fc935 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 04:54:41 +0000 Subject: [PATCH 138/771] ... --- README.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 1b03abe63dc..be281502858 100644 --- a/README.md +++ b/README.md @@ -45,12 +45,18 @@ make install-phpdbg Command Line Options ==================== -The following switches are implemented (just like cli SAPI): +The following switchess are implemented (just like cli SAPI): - -n ignore php ini - -c search for php ini in path - -z load zend extension - -d define php ini entry + +The following switches changes the default behaviour of phpdbg: + + - -v disables quietness + - -s enabled stepping + - -e sets execution context Screeny ======= From 4112330bb5ba4e1a18191c7586a3567638b44a54 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 06:03:37 +0000 Subject: [PATCH 139/771] colourfulness --- phpdbg.c | 23 +++++++--- phpdbg.h | 15 ++++++- phpdbg_bp.c | 66 ++++++++++++++++++++------- phpdbg_prompt.c | 115 +++++++++++++++++++++++++++++++++--------------- 4 files changed, 161 insertions(+), 58 deletions(-) diff --git a/phpdbg.c b/phpdbg.c index 52998a6527a..a83e4928098 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -35,7 +35,7 @@ static inline void php_phpdbg_globals_ctor(zend_phpdbg_globals *pg) /* {{{ */ pg->last = NULL; pg->last_params = NULL; pg->last_params_len = 0; - pg->flags = PHPDBG_IS_QUIET; + pg->flags = PHPDBG_DEFAULT_FLAGS; } /* }}} */ static PHP_MINIT_FUNCTION(phpdbg) /* {{{ */ @@ -266,6 +266,7 @@ const opt_struct OPTIONS[] = { /* {{{ */ {'e', 1, "exec"}, {'v', 0, "verbose"}, {'s', 0, "step"}, + {'b', 0, "boring colours"}, {'-', 0, NULL} }; /* }}} */ @@ -297,7 +298,7 @@ int main(int argc, char *argv[]) /* {{{ */ int ini_entries_len = 0; char *exec = NULL; size_t exec_len = 0L; - zend_ulong flags = PHPDBG_IS_QUIET; + zend_ulong flags = PHPDBG_DEFAULT_FLAGS; char *php_optarg = NULL; int php_optind = 1; int opt; @@ -377,6 +378,10 @@ int main(int argc, char *argv[]) /* {{{ */ case 's': /* set stepping on */ flags |= PHPDBG_IS_STEPPING; break; + + case 'b': /* set colours off */ + flags &= ~PHPDBG_IS_COLOURED; + break; } } @@ -402,10 +407,6 @@ int main(int argc, char *argv[]) /* {{{ */ phpdbg->ini_entries = ini_entries; - printf("[Welcome to phpdbg, the interactive PHP debugger, v%s]\n", PHPDBG_VERSION); - printf("To get help using phpdbg type \"help\" and press enter\n"); - printf("[Please report bugs to <%s>]\n", PHPDBG_ISSUES); - if (phpdbg->startup(phpdbg) == SUCCESS) { zend_activate(TSRMLS_C); @@ -430,6 +431,16 @@ int main(int argc, char *argv[]) /* {{{ */ zend_try { zend_activate_modules(TSRMLS_C); } zend_end_try(); + + /* print blurb */ + printf( + "%sWelcome to phpdbg, the interactive PHP debugger, v%s%s\n", + PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_VERSION, PHPDBG_END_LINE(TSRMLS_C)); + printf( + "[To get help using phpdbg type \"help\" and press enter\n"); + printf( + "%sPlease report bugs to <%s>%s\n", + PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_ISSUES, PHPDBG_END_LINE(TSRMLS_C)); do { zend_try { diff --git a/phpdbg.h b/phpdbg.h index 2a018295e96..34b2e56a38c 100644 --- a/phpdbg.h +++ b/phpdbg.h @@ -66,7 +66,10 @@ #define PHPDBG_IS_STEPPING 0x00010000 #define PHPDBG_IS_QUIET 0x00100000 -#define PHPDBG_IS_QUITTING 0x01000000 /* }}} */ +#define PHPDBG_IS_QUITTING 0x01000000 +#define PHPDBG_IS_COLOURED 0x10000000 + +#define PHPDBG_DEFAULT_FLAGS (PHPDBG_IS_QUIET|PHPDBG_IS_COLOURED) /* }}} */ /* {{{ strings */ #define PHPDBG_ISSUES "http://github.com/krakjoe/phpdbg/issues" @@ -88,4 +91,14 @@ ZEND_BEGIN_MODULE_GLOBALS(phpdbg) zend_ulong flags; /* phpdbg flags */ ZEND_END_MODULE_GLOBALS(phpdbg) +/* {{{ colourful helpers */ +#define PHPDBG_RED_LINE(TSRMLS_D) \ + ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[1;31m[" : "[") +#define PHPDBG_BOLD_LINE(TSRMLS_D) \ + ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[1;64m[" : "[") +#define PHPDBG_END_LINE(TSRMLS_D) \ + ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "]\033[0m" : "]") +#define PHPDBG_PROMPT_LINE(TSRMLS_D) \ + ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[1;64mphpdbg>\033[0m " : "phpdbg> ") /* }}} */ + #endif /* PHPDBG_H */ diff --git a/phpdbg_bp.c b/phpdbg_bp.c index fef5775c1e1..8ce2edbe530 100644 --- a/phpdbg_bp.c +++ b/phpdbg_bp.c @@ -68,7 +68,10 @@ void phpdbg_set_breakpoint_file(const char *path, long line_num TSRMLS_DC) /* {{ zend_llist_add_element(break_files_ptr, &new_break); printf( - "[Breakpoint #%d added at %s:%ld]\n", new_break.id, new_break.filename, new_break.line); + "%sBreakpoint #%d added at %s:%ld%s\n", + PHPDBG_BOLD_LINE(TSRMLS_C), + new_break.id, new_break.filename, new_break.line, + PHPDBG_END_LINE(TSRMLS_C)); } /* }}} */ void phpdbg_set_breakpoint_symbol(const char *name TSRMLS_DC) /* {{{ */ @@ -86,9 +89,15 @@ void phpdbg_set_breakpoint_symbol(const char *name TSRMLS_DC) /* {{{ */ zend_hash_update(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM], new_break.symbol, name_len, &new_break, sizeof(phpdbg_breaksymbol_t), NULL); - printf("[Breakpoint #%d added at %s]\n", new_break.id, new_break.symbol); + printf( + "%sBreakpoint #%d added at %s%s\n", + PHPDBG_BOLD_LINE(TSRMLS_C), + new_break.id, new_break.symbol, + PHPDBG_END_LINE(TSRMLS_C)); } else { - printf("[Breakpoint exists at %s]\n", name); + printf( + "%sBreakpoint exists at %s%s\n", + PHPDBG_BOLD_LINE(TSRMLS_C), name, PHPDBG_END_LINE(TSRMLS_C)); } } /* }}} */ @@ -121,10 +130,16 @@ void phpdbg_set_breakpoint_method(const char* class_name, zend_hash_update(class_table, func_name, func_len, &new_break, sizeof(phpdbg_breakmethod_t), NULL); printf( - "[Breakpoint #%d added at %s::%s]\n", new_break.id, class_name, func_name); + "%sBreakpoint #%d added at %s::%s%s\n", + PHPDBG_BOLD_LINE(TSRMLS_C), + new_break.id, class_name, func_name, + PHPDBG_END_LINE(TSRMLS_C)); } else { printf( - "[Breakpoint exists at %s::%s]\n", class_name, func_name); + "%sBreakpoint exists at %s::%s%s\n", + PHPDBG_BOLD_LINE(TSRMLS_C), + class_name, func_name, + PHPDBG_END_LINE(TSRMLS_C)); } } /* }}} */ @@ -143,9 +158,14 @@ void phpdbg_set_breakpoint_opline(const char *name TSRMLS_DC) /* {{{ */ zend_hash_index_update(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], opline, &new_break, sizeof(phpdbg_breakline_t), NULL); - printf("[Breakpoint #%d added at %s]\n", new_break.id, new_break.name); + printf("%sBreakpoint #%d added at %s%s\n", + PHPDBG_BOLD_LINE(TSRMLS_C), + new_break.id, new_break.name, + PHPDBG_END_LINE(TSRMLS_C)); } else { - printf("[Breakpoint exists at %s]\n", name); + printf( + "%sBreakpoint exists at %s%s\n", + PHPDBG_BOLD_LINE(TSRMLS_C), name, PHPDBG_END_LINE(TSRMLS_C)); } } /* }}} */ @@ -164,7 +184,11 @@ void phpdbg_set_breakpoint_opline_ex(phpdbg_opline_ptr_t opline TSRMLS_DC) /* {{ zend_hash_index_update(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], (zend_ulong) opline, &new_break, sizeof(phpdbg_breakline_t), NULL); - printf("[Breakpoint #%d added at %p]\n", new_break.id, (zend_op*) new_break.opline); + printf( + "%sBreakpoint #%d added at %p%s\n", + PHPDBG_BOLD_LINE(TSRMLS_C), + new_break.id, (zend_op*) new_break.opline, + PHPDBG_END_LINE(TSRMLS_C)); } } /* }}} */ @@ -183,7 +207,10 @@ int phpdbg_find_breakpoint_file(zend_op_array *op_array TSRMLS_DC) /* {{{ */ const phpdbg_breakfile_t *bp = (phpdbg_breakfile_t*)le->data; if (bp->line == (*EG(opline_ptr))->lineno) { - printf("[Breakpoint #%d at %s:%ld]\n", bp->id, bp->filename, bp->line); + printf("%sBreakpoint #%d at %s:%ld%s\n", + PHPDBG_BOLD_LINE(TSRMLS_C), + bp->id, bp->filename, bp->line, + PHPDBG_END_LINE(TSRMLS_C)); return SUCCESS; } } @@ -217,9 +244,12 @@ int phpdbg_find_breakpoint_symbol(zend_function *fbc TSRMLS_DC) /* {{{ */ if (zend_hash_find(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM], fname, strlen(fname), (void**)&bp) == SUCCESS) { - printf("[Breakpoint #%d in %s() at %s:%u]\n", bp->id, bp->symbol, + printf("%sBreakpoint #%d in %s() at %s:%u%s\n", + PHPDBG_BOLD_LINE(TSRMLS_C), + bp->id, bp->symbol, zend_get_executed_filename(TSRMLS_C), - zend_get_executed_lineno(TSRMLS_C)); + zend_get_executed_lineno(TSRMLS_C), + PHPDBG_END_LINE(TSRMLS_C)); return SUCCESS; } @@ -239,9 +269,12 @@ int phpdbg_find_breakpoint_method(zend_op_array *ops TSRMLS_DC) /* {{{ */ strlen(ops->function_name), (void**)&bp) == SUCCESS) { printf( - "[Breakpoint #%d in %s::%s() at %s:%u]\n", bp->id, bp->class_name, bp->func_name, + "%sBreakpoint #%d in %s::%s() at %s:%u%s\n", + PHPDBG_BOLD_LINE(TSRMLS_C), + bp->id, bp->class_name, bp->func_name, zend_get_executed_filename(TSRMLS_C), - zend_get_executed_lineno(TSRMLS_C)); + zend_get_executed_lineno(TSRMLS_C), + PHPDBG_END_LINE(TSRMLS_C)); return SUCCESS; } } @@ -255,9 +288,12 @@ int phpdbg_find_breakpoint_opline(phpdbg_opline_ptr_t opline TSRMLS_DC) /* {{{ * if (zend_hash_index_find(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], (zend_ulong) opline, (void**)&bp) == SUCCESS) { - printf("[Breakpoint #%d in %s at %s:%u]\n", bp->id, bp->name, + printf("%sBreakpoint #%d in %s at %s:%u%s\n", + PHPDBG_BOLD_LINE(TSRMLS_C), + bp->id, bp->name, zend_get_executed_filename(TSRMLS_C), - zend_get_executed_lineno(TSRMLS_C)); + zend_get_executed_lineno(TSRMLS_C), + PHPDBG_END_LINE(TSRMLS_C)); return SUCCESS; } diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index d255a9d8731..40db309d5ab 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -35,13 +35,17 @@ ZEND_EXTERN_MODULE_GLOBALS(phpdbg); static PHPDBG_COMMAND(exec) /* {{{ */ { if (PHPDBG_G(exec)) { - printf("[Unsetting old execution context: %s]\n", PHPDBG_G(exec)); + printf( + "%sUnsetting old execution context: %s%s\n", + PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_G(exec), PHPDBG_END_LINE(TSRMLS_C)); efree(PHPDBG_G(exec)); PHPDBG_G(exec) = NULL; } if (PHPDBG_G(ops)) { - printf("[Destroying compiled opcodes]\n"); + printf( + "%sDestroying compiled opcodes%s\n", + PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); destroy_op_array(PHPDBG_G(ops) TSRMLS_CC); efree(PHPDBG_G(ops)); PHPDBG_G(ops) = NULL; @@ -49,7 +53,9 @@ static PHPDBG_COMMAND(exec) /* {{{ */ PHPDBG_G(exec) = estrndup(expr, PHPDBG_G(exec_len) = expr_len); - printf("[Set execution context: %s]\n", PHPDBG_G(exec)); + printf( + "%sSet execution context: %s%s\n", + PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_G(exec), PHPDBG_END_LINE(TSRMLS_C)); return SUCCESS; } /* }}} */ @@ -59,20 +65,26 @@ static inline int phpdbg_compile(TSRMLS_D) /* {{{ */ zend_file_handle fh; if (!EG(in_execution)) { - printf("[Attempting compilation of %s]\n", PHPDBG_G(exec)); + printf("%sAttempting compilation of %s%s\n", PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_G(exec), PHPDBG_END_LINE(TSRMLS_C)); if (php_stream_open_for_zend_ex(PHPDBG_G(exec), &fh, USE_PATH|STREAM_OPEN_FOR_INCLUDE TSRMLS_CC) == SUCCESS) { PHPDBG_G(ops) = zend_compile_file( &fh, ZEND_INCLUDE TSRMLS_CC); zend_destroy_file_handle(&fh TSRMLS_CC); - printf("[Success]\n"); + printf( + "%sSuccess%s\n", + PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); return SUCCESS; } else { - printf("[Could not open file %s]\n", PHPDBG_G(exec)); + printf( + "%sCould not open file %s%s\n", + PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_G(exec), PHPDBG_END_LINE(TSRMLS_C)); } } else { - printf("[Cannot compile while in execution]\n"); + printf( + "%sCannot compile while in execution%s\n", + PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); } return FAILURE; @@ -83,7 +95,9 @@ static PHPDBG_COMMAND(compile) /* {{{ */ if (PHPDBG_G(exec)) { if (!EG(in_execution)) { if (PHPDBG_G(ops)) { - printf("[Destroying previously compiled opcodes]\n"); + printf( + "%sDestroying previously compiled opcodes%s\n", + PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); destroy_op_array(PHPDBG_G(ops) TSRMLS_CC); efree(PHPDBG_G(ops)); PHPDBG_G(ops)=NULL; @@ -92,7 +106,9 @@ static PHPDBG_COMMAND(compile) /* {{{ */ return phpdbg_compile(TSRMLS_C); } else { - printf("[No execution context]\n"); + printf( + "%sNo execution context%s\n", + PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); return FAILURE; } } /* }}} */ @@ -106,7 +122,11 @@ static PHPDBG_COMMAND(step) /* {{{ */ } printf( - "[Stepping %s]\n", (PHPDBG_G(flags) & PHPDBG_IS_STEPPING) ? "on" : "off"); + "%sStepping %s%s\n", + PHPDBG_BOLD_LINE(TSRMLS_C), + (PHPDBG_G(flags) & PHPDBG_IS_STEPPING) ? "on" : "off", + PHPDBG_END_LINE(TSRMLS_C)); + return SUCCESS; } /* }}} */ @@ -118,14 +138,14 @@ static PHPDBG_COMMAND(next) /* {{{ */ static PHPDBG_COMMAND(run) /* {{{ */ { if (EG(in_execution)) { - printf("[Cannot start another execution while one is in progress]\n"); + printf("%sCannot start another execution while one is in progress%s\n", PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); return FAILURE; } if (PHPDBG_G(ops) || PHPDBG_G(exec)) { if (!PHPDBG_G(ops)) { if (phpdbg_compile(TSRMLS_C) == FAILURE) { - printf("[Failed to compile %s, cannot run]\n", PHPDBG_G(exec)); + printf("%sFailed to compile %s, cannot run%s\n", PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_G(exec), PHPDBG_END_LINE(TSRMLS_C)); return FAILURE; } } @@ -137,14 +157,14 @@ static PHPDBG_COMMAND(run) /* {{{ */ zend_execute(EG(active_op_array) TSRMLS_CC); } zend_catch { if (!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING)) { - printf("[Caught excetion in VM]\n"); + printf("%sCaught excetion in VM%s\n", PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); return FAILURE; } else return SUCCESS; } zend_end_try(); return SUCCESS; } else { - printf("[Nothing to execute !]\n"); + printf("%sNothing to execute !%s\n", PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); return FAILURE; } } /* }}} */ @@ -171,7 +191,7 @@ static PHPDBG_COMMAND(eval) /* {{{ */ PHPDBG_G(flags) |= PHPDBG_IS_STEPPING; } } else { - printf("[No expression provided !]\n"); + printf("%sNo expression provided !%s\n", PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); return FAILURE; } @@ -181,7 +201,7 @@ static PHPDBG_COMMAND(eval) /* {{{ */ static PHPDBG_COMMAND(back) /* {{{ */ { if (!EG(in_execution)) { - printf("[Not executing !]\n"); + printf("%sNot executing !%s\n", PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); return FAILURE; } zval zbacktrace; @@ -309,7 +329,7 @@ static PHPDBG_COMMAND(break) /* {{{ */ if (expr_len <= 0L) { printf( - "[No expression found]\n"); + "%sNo expression found%s\n", PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); return FAILURE; } @@ -325,13 +345,13 @@ static PHPDBG_COMMAND(break) /* {{{ */ path[line_pos - expr] = 0; if (expand_filepath(path, resolved_name TSRMLS_CC) == NULL) { - printf("[Failed to expand path %s]\n", path); + printf("%sFailed to expand path %s%s\n", PHPDBG_RED_LINE(TSRMLS_C), path, PHPDBG_END_LINE(TSRMLS_C)); return FAILURE; } phpdbg_set_breakpoint_file(resolved_name, line_num TSRMLS_CC); } else { - printf("[No line specified in expression %s]\n", expr); + printf("%sNo line specified in expression %s%s\n", PHPDBG_RED_LINE(TSRMLS_C), expr, PHPDBG_END_LINE(TSRMLS_C)); return FAILURE; } } else { @@ -352,7 +372,7 @@ static PHPDBG_COMMAND(break) /* {{{ */ phpdbg_set_breakpoint_method(class, class_len, func, func_len TSRMLS_CC); } else { - printf("[No function found in method expression %s]\n", expr); + printf("%sNo function found in method expression %s%s\n", PHPDBG_RED_LINE(TSRMLS_C), expr, PHPDBG_END_LINE(TSRMLS_C)); return FAILURE; } } @@ -370,7 +390,7 @@ static PHPDBG_COMMAND(break) /* {{{ */ phpdbg_set_breakpoint_symbol(name TSRMLS_CC); } else { - printf("[Malformed break command found]\n"); + printf("%sMalformed break command found%s\n", PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); return FAILURE; } } @@ -432,7 +452,7 @@ static PHPDBG_COMMAND(clean) /* {{{ */ printf("[\tIncluded: %d]\n", zend_hash_num_elements(&EG(included_files))); } else { printf( - "[Cannot clean environment while executing]\n"); + "%sCannot clean environment while executing%s\n", PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); return FAILURE; } @@ -454,11 +474,15 @@ static PHPDBG_COMMAND(clear) /* {{{ */ static PHPDBG_COMMAND(help) /* {{{ */ { - printf("[Welcome to phpdbg, the interactive PHP debugger, v%s]\n", PHPDBG_VERSION); + printf( + "%sWelcome to phpdbg, the interactive PHP debugger, v%s%s\n", + PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_VERSION, PHPDBG_END_LINE(TSRMLS_C)); if (expr_len > 0L) { if (phpdbg_do_cmd(phpdbg_help_commands, (char*)expr, expr_len TSRMLS_CC) == FAILURE) { - printf("failed to find help command: %s/%d\n", expr, expr_len); + printf( + "%sFailed to find help command: %s/%lu%s\n", + PHPDBG_RED_LINE(TSRMLS_C), expr, expr_len, PHPDBG_END_LINE(TSRMLS_C)); } } else { const phpdbg_command_t *prompt_command = phpdbg_prompt_commands; @@ -466,20 +490,28 @@ static PHPDBG_COMMAND(help) /* {{{ */ printf("To get help regarding a specific command type \"help command\"\n"); - printf("Commands:\n"); + printf( + "%sCommands:%s\n", + PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); + while (prompt_command && prompt_command->name) { printf("\t%s\t%s\n", prompt_command->name, prompt_command->tip); ++prompt_command; } - printf("Helpers Loaded:\n"); + printf( + "%sHelpers Loaded%s\n", + PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); + while (help_command && help_command->name) { printf("\t%s\t%s\n", help_command->name, help_command->tip); ++help_command; } } - printf("[Please report bugs to <%s>]\n", PHPDBG_ISSUES); + printf( + "%sPlease report bugs to <%s>%s\n", + PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_ISSUES, PHPDBG_END_LINE(TSRMLS_C)); return SUCCESS; } /* }}} */ @@ -492,7 +524,7 @@ static PHPDBG_COMMAND(quiet) { /* {{{ */ } printf( - "[Quietness %s]\n", (PHPDBG_G(flags) & PHPDBG_IS_QUIET) ? "enabled" : "disabled"); + "%sQuietness %s%s\n", PHPDBG_BOLD_LINE(TSRMLS_C), (PHPDBG_G(flags) & PHPDBG_IS_QUIET) ? "enabled" : "disabled", PHPDBG_END_LINE(TSRMLS_C)); return SUCCESS; } /* }}} */ @@ -507,7 +539,9 @@ static PHPDBG_COMMAND(list) /* {{{ */ filename = zend_get_executed_filename(TSRMLS_C); offset = zend_get_executed_lineno(TSRMLS_C); } else if (!filename) { - printf("[No file to list]\n"); + printf( + "%sNo file to list%s\n", + PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); return SUCCESS; } @@ -516,7 +550,9 @@ static PHPDBG_COMMAND(list) /* {{{ */ zend_function* fbc; if (!EG(function_table)) { - printf("[No function table loaded]\n"); + printf( + "%sNo function table loaded%s\n", + PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); return SUCCESS; } @@ -524,7 +560,9 @@ static PHPDBG_COMMAND(list) /* {{{ */ (void**)&fbc) == SUCCESS) { phpdbg_list_function(fbc TSRMLS_CC); } else { - printf("[Function %s not found]\n", expr); + printf( + "%sFunction %s not found%s\n", + PHPDBG_RED_LINE(TSRMLS_C), expr, PHPDBG_END_LINE(TSRMLS_C)); } } @@ -578,7 +616,7 @@ int phpdbg_interactive(TSRMLS_D) /* {{{ */ char cmd[PHPDBG_MAX_CMD]; phpdbg_interactive_enter: - printf("phpdbg> "); + printf(PHPDBG_PROMPT_LINE(TSRMLS_C)); while (!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING) && fgets(cmd, PHPDBG_MAX_CMD, stdin) != NULL) { @@ -588,7 +626,7 @@ phpdbg_interactive_enter: phpdbg_interactive_enter: while (!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING)) { - cmd = readline("phpdbg> "); + cmd = readline(PHPDBG_PROMPT_LINE(TSRMLS_C)); cmd_len = strlen(cmd); #endif @@ -609,13 +647,16 @@ phpdbg_interactive_enter: case FAILURE: if (!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING)) { printf( - "[Failed to execute %s !]\n", cmd); + "%sFailed to execute %s !%s\n", + PHPDBG_RED_LINE(TSRMLS_C), cmd, PHPDBG_END_LINE(TSRMLS_C)); } break; case PHPDBG_NEXT: { if (!EG(in_execution)) { - printf("[Not running]\n"); + printf( + "%sNot running%s\n", + PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); } return PHPDBG_NEXT; } @@ -640,7 +681,9 @@ static void phpdbg_print_opline(zend_execute_data *execute_data TSRMLS_DC) /* {{ zend_op *opline = execute_data->opline; printf( - "[OPLINE: %p:%s]\n", opline, phpdbg_decode_opcode(opline->opcode)); + "%sOPLINE: %p:%s%s\n", + PHPDBG_BOLD_LINE(TSRMLS_C), + opline, phpdbg_decode_opcode(opline->opcode), PHPDBG_END_LINE(TSRMLS_C)); } } /* }}} */ From 78418cc38c822cc915f23d6d3ffcd185daf29418 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 06:04:32 +0000 Subject: [PATCH 140/771] ... --- phpdbg.png | Bin 132259 -> 133955 bytes phpdbg_prompt.c | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/phpdbg.png b/phpdbg.png index 403652be89325f83ecb68d8bca97b38a4fe753a3..829bbba8946ab317febf2a452959f298caa75c5f 100644 GIT binary patch delta 114294 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 z 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�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

`(M!S{o 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 delta 112632 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 { From fd0aeb5b536bf2af11107b2b895387955175729a Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 06:05:24 +0000 Subject: [PATCH 141/771] ... --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index be281502858..bd06569fbef 100644 --- a/README.md +++ b/README.md @@ -57,6 +57,7 @@ The following switches changes the default behaviour of phpdbg: - -v disables quietness - -s enabled stepping - -e sets execution context + - -b boring - disables use of colour on the console Screeny ======= From f4523640609690faf2495022be15af50c06efdd3 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 06:29:54 +0000 Subject: [PATCH 142/771] ... --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index bd06569fbef..f9ae87718dd 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,7 @@ The following switchess are implemented (just like cli SAPI): - -z load zend extension - -d define php ini entry -The following switches changes the default behaviour of phpdbg: +The following switches change the default behaviour of phpdbg: - -v disables quietness - -s enabled stepping From a29c0e5c96be3d7414e8e541e1d3e7376f12cdb9 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 06:31:29 +0000 Subject: [PATCH 143/771] ... --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f9ae87718dd..f6b67040d95 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ Features Planned ======= - - Mocking API for Server/Request Environments + - Pass JIT Super Globals to Userland (Mocking, Testing etc) - Improve Everything :) Installation From f566a6136bbd4fd4f3afeaeccb666bd7806562b8 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 06:43:23 +0000 Subject: [PATCH 144/771] additional list option, class methods --- phpdbg_help.c | 4 +++- phpdbg_prompt.c | 26 ++++++++++++++++++++++---- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/phpdbg_help.c b/phpdbg_help.c index d942ebeb611..b887380d072 100644 --- a/phpdbg_help.c +++ b/phpdbg_help.c @@ -141,7 +141,9 @@ PHPDBG_HELP(list) /* {{{ */ printf("\tphpdbg> list 2\n"); printf("Will print next 2 lines from the current file\n"); printf("\tphpdbg> list func\n"); - printf("Will print func source code\n"); + printf("Will print the source of the global function \"func\"\n"); + printf("\tphpdbg> list .mine\n"); + printf("Will print the source of the class method \"mine\"\n"); printf("Note: before listing functions you must have a populated function table, try compile !!\n"); return SUCCESS; } /* }}} */ diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 72d90239128..d42e638b519 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -547,22 +547,40 @@ static PHPDBG_COMMAND(list) /* {{{ */ phpdbg_list_file(filename, count, offset TSRMLS_CC); } else { + HashTable *func_table = EG(function_table); zend_function* fbc; + const char *func_name = expr; + size_t func_name_len = expr_len; - if (!EG(function_table)) { + /* search active scope if begins with period */ + if (func_name[0] == '.') { + if (EG(scope)) { + func_name++; + func_name_len--; + + func_table = &EG(scope)->function_table; + } else { + printf( + "%sNo active class%s\n", + PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); + return FAILURE; + } + } else if (!EG(function_table)) { printf( "%sNo function table loaded%s\n", PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); return SUCCESS; + } else { + func_table = EG(function_table); } - - if (zend_hash_find(EG(function_table), expr, expr_len, + + if (zend_hash_find(func_table, func_name, func_name_len, (void**)&fbc) == SUCCESS) { phpdbg_list_function(fbc TSRMLS_CC); } else { printf( "%sFunction %s not found%s\n", - PHPDBG_RED_LINE(TSRMLS_C), expr, PHPDBG_END_LINE(TSRMLS_C)); + PHPDBG_RED_LINE(TSRMLS_C), func_name, PHPDBG_END_LINE(TSRMLS_C)); } } From bb715ac77d6a83eeb9973037a087d32f872ba77a Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 06:47:33 +0000 Subject: [PATCH 145/771] ... --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index f6b67040d95..e9f7fbe4b55 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,6 @@ Features Planned ======= - - Pass JIT Super Globals to Userland (Mocking, Testing etc) - Improve Everything :) Installation From 4b2490426f46d360345d353b94c5b4a03c38a92a Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 06:57:56 +0000 Subject: [PATCH 146/771] web-bootstrap example --- web-bootstrap.php | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 web-bootstrap.php diff --git a/web-bootstrap.php b/web-bootstrap.php new file mode 100644 index 00000000000..c5802c1e3c2 --- /dev/null +++ b/web-bootstrap.php @@ -0,0 +1,46 @@ + 'localhost', + 'HTTP_CONNECTION' => 'keep-alive', + 'HTTP_ACCEPT' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', + 'HTTP_USER_AGENT' => 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.65 Safari/537.36', + 'HTTP_ACCEPT_ENCODING' => 'gzip,deflate,sdch', + 'HTTP_ACCEPT_LANGUAGE' => 'en-US,en;q=0.8', + 'HTTP_COOKIE' => 'tz=Europe%2FLondon; __utma=1.347100075.1384196523.1384196523.1384196523.1; __utmc=1; __utmz=1.1384196523.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)', + 'PATH' => '/usr/local/bin:/usr/bin:/bin', + 'SERVER_SIGNATURE' => '

Apache/2.4.6 (Ubuntu) Server at phpdbg.com Port 80
', + 'SERVER_SOFTWARE' => 'Apache/2.4.6 (Ubuntu)', + 'SERVER_NAME' => 'localhost', + 'SERVER_ADDR' => '127.0.0.1', + 'SERVER_PORT' => '80', + 'REMOTE_ADDR' => '128.0.0.1', + 'DOCUMENT_ROOT' => dirname(__FILE__), + 'REQUEST_SCHEME' => 'http', + 'CONTEXT_PREFIX' => '', + 'CONTEXT_DOCUMENT_ROOT' => dirname(__FILE__), + 'SERVER_ADMIN' => '[no address given]', + 'SCRIPT_FILENAME' => sprintf( + '%s/%s', dirname(__FILE__), PHPDBG_BOOTSTRAP + ), + 'REMOTE_PORT' => '47931', + 'GATEWAY_INTERFACE' => 'CGI/1.1', + 'SERVER_PROTOCOL' => 'HTTP/1.1', + 'REQUEST_METHOD' => 'GET', + 'QUERY_STRING' => '', + 'REQUEST_URI' => PHPDBG_BOOTSTRAPPED, + 'SCRIPT_NAME' => PHPDBG_BOOTSTRAPPED, + 'PHP_SELF' => PHPDBG_BOOTSTRAPPED, + 'REQUEST_TIME' => time(), +); + +$_GET = array +( + "request" => "variables" +); + +chdir(PHPDBG_BOOTPATH); From 25475ff95e1f1f30df22bc0d920692f92c199a2f Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 07:01:28 +0000 Subject: [PATCH 147/771] ... --- web-bootstrap.php | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/web-bootstrap.php b/web-bootstrap.php index c5802c1e3c2..fdb40f92b43 100644 --- a/web-bootstrap.php +++ b/web-bootstrap.php @@ -1,8 +1,21 @@ 'localhost', From 6c5831aa09a85b069dfc0c9360547f960fb701e2 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 07:08:00 +0000 Subject: [PATCH 148/771] ... --- web-bootstrap.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/web-bootstrap.php b/web-bootstrap.php index fdb40f92b43..e6bea6b7f4a 100644 --- a/web-bootstrap.php +++ b/web-bootstrap.php @@ -31,14 +31,14 @@ $_SERVER = array 'SERVER_NAME' => 'localhost', 'SERVER_ADDR' => '127.0.0.1', 'SERVER_PORT' => '80', - 'REMOTE_ADDR' => '128.0.0.1', - 'DOCUMENT_ROOT' => dirname(__FILE__), + 'REMOTE_ADDR' => '127.0.0.1', + 'DOCUMENT_ROOT' => PHPDBG_BOOTPATH, 'REQUEST_SCHEME' => 'http', 'CONTEXT_PREFIX' => '', - 'CONTEXT_DOCUMENT_ROOT' => dirname(__FILE__), + 'CONTEXT_DOCUMENT_ROOT' => PHPDBG_BOOTPATH, 'SERVER_ADMIN' => '[no address given]', 'SCRIPT_FILENAME' => sprintf( - '%s/%s', dirname(__FILE__), PHPDBG_BOOTSTRAP + '%s/%s', PHPDBG_BOOTPATH, PHPDBG_BOOTSTRAP ), 'REMOTE_PORT' => '47931', 'GATEWAY_INTERFACE' => 'CGI/1.1', From ff4c0c9397d7435ab8462fedd3e89fe2c9e3c4d4 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 07:09:07 +0000 Subject: [PATCH 149/771] ... --- web-bootstrap.php | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/web-bootstrap.php b/web-bootstrap.php index e6bea6b7f4a..d50e1ead380 100644 --- a/web-bootstrap.php +++ b/web-bootstrap.php @@ -8,9 +8,13 @@ * break ... * run */ -define("PHPDBG_BOOTPATH", "/opt/php-zts/htdocs"); -define("PHPDBG_BOOTSTRAP", "index.php"); -define("PHPDBG_BOOTSTRAPPED", sprintf("/%s", PHPDBG_BOOTSTRAP)); +if (!defined('PHPDBG_BOOTSTRAPPED')) +{ + /* define these once */ + define("PHPDBG_BOOTPATH", "/opt/php-zts/htdocs"); + define("PHPDBG_BOOTSTRAP", "index.php"); + define("PHPDBG_BOOTSTRAPPED", sprintf("/%s", PHPDBG_BOOTSTRAP)); +} /* * Superglobals are JIT, phpdbg will not over-write whatever you set during bootstrap From c00abb0e75628d2284f76098e43626266a440d3e Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 08:26:11 +0000 Subject: [PATCH 150/771] printer commands --- config.m4 | 2 +- phpdbg_print.c | 29 +++++++++++++++++++++++++++++ phpdbg_print.h | 47 +++++++++++++++++++++++++++++++++++++++++++++++ phpdbg_prompt.c | 17 ++++++++++++----- 4 files changed, 89 insertions(+), 6 deletions(-) create mode 100644 phpdbg_print.c create mode 100644 phpdbg_print.h diff --git a/config.m4 b/config.m4 index df127084ae8..92f626e8655 100644 --- a/config.m4 +++ b/config.m4 @@ -9,7 +9,7 @@ if test "$PHP_PHPDBG" != "no"; then AC_DEFINE(HAVE_PHPDBG, 1, [ ]) PHP_PHPDBG_CFLAGS="-I$abc_srcdir" - PHP_PHPDBG_FILES="phpdbg.c phpdbg_prompt.c phpdbg_help.c phpdbg_bp.c phpdbg_opcode.c phpdbg_list.c phpdbg_utils.c" + PHP_PHPDBG_FILES="phpdbg.c phpdbg_prompt.c phpdbg_help.c phpdbg_print.c phpdbg_bp.c phpdbg_opcode.c phpdbg_list.c phpdbg_utils.c" PHP_SUBST(PHP_PHPDBG_CFLAGS) PHP_SUBST(PHP_PHPDBG_FILES) diff --git a/phpdbg_print.c b/phpdbg_print.c new file mode 100644 index 00000000000..c167482b6f6 --- /dev/null +++ b/phpdbg_print.c @@ -0,0 +1,29 @@ +/* + +----------------------------------------------------------------------+ + | PHP Version 5 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997-2013 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 3.01 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | http://www.php.net/license/3_01.txt | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Authors: Felipe Pena | + | Authors: Joe Watkins | + +----------------------------------------------------------------------+ +*/ + +#include +#include "zend.h" +#include "phpdbg.h" +#include "phpdbg_print.h" + +PHPDBG_PRINT(default) /* {{{ */ +{ + printf("in default printer\n"); + return SUCCESS; +} /* }}} */ diff --git a/phpdbg_print.h b/phpdbg_print.h new file mode 100644 index 00000000000..825316a965d --- /dev/null +++ b/phpdbg_print.h @@ -0,0 +1,47 @@ +/* + +----------------------------------------------------------------------+ + | PHP Version 5 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997-2013 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 3.01 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | http://www.php.net/license/3_01.txt | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Authors: Felipe Pena | + | Authors: Joe Watkins | + +----------------------------------------------------------------------+ +*/ + +#ifndef PHPDBG_PRINT_H +#define PHPDBG_PRINT_H + +#include "TSRM.h" +#include "phpdbg_prompt.h" + +/** + * Command Declarators + */ +#define PHPDBG_PRINT_D(name, tip) \ + {PHPDBG_STRL(#name), tip, sizeof(tip)-1, phpdbg_do_print_##name} +#define PHPDBG_PRINT(name) \ + int phpdbg_do_print_##name(const char *expr, size_t expr_len TSRMLS_DC) + +/** + * Printer Forward Declarations + */ +PHPDBG_PRINT(default); + +/** + * Commands + */ +static const phpdbg_command_t phpdbg_print_commands[] = { + PHPDBG_PRINT_D(default, "the default print command"), + {NULL, 0, 0} +}; + +#endif /* PHPDBG_PRINT_H */ diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index d42e638b519..dd225d6dbc4 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -23,6 +23,7 @@ #include "zend_compile.h" #include "phpdbg.h" #include "phpdbg_help.h" +#include "phpdbg_print.h" #include "phpdbg_bp.h" #include "phpdbg_opcode.h" #include "phpdbg_list.h" @@ -228,16 +229,22 @@ static PHPDBG_COMMAND(back) /* {{{ */ static PHPDBG_COMMAND(print) /* {{{ */ { - if (expr_len) { - printf("%s\n", expr); + if (expr_len > 0L) { + if (phpdbg_do_cmd(phpdbg_print_commands, (char*)expr, expr_len TSRMLS_CC) == FAILURE) { + printf( + "%sFailed to find print command: %s/%lu%s\n", + PHPDBG_RED_LINE(TSRMLS_C), expr, expr_len, PHPDBG_END_LINE(TSRMLS_C)); + } return SUCCESS; } -#ifdef HAVE_READLINE_H - printf("HAVE READLINE\n"); -#endif printf("--------------------------------------\n"); printf("Execution Context Information:\n"); +#ifdef HAVE_LIBREADLINE + printf("Readline\tyes\n"); +#else + printf("Readline\tno\n"); +#endif printf("Exec\t\t%s\n", PHPDBG_G(exec) ? PHPDBG_G(exec) : "none"); printf("Compiled\t%s\n", PHPDBG_G(ops) ? "yes" : "no"); printf("Stepping\t%s\n", (PHPDBG_G(flags) & PHPDBG_IS_STEPPING) ? "on" : "off"); From 83852d3bb775fd3555011e2cc1d5fdc9f418469e Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 08:28:03 +0000 Subject: [PATCH 151/771] ... --- phpdbg_help.c | 2 -- phpdbg_print.c | 2 -- 2 files changed, 4 deletions(-) diff --git a/phpdbg_help.c b/phpdbg_help.c index b887380d072..21feb07926d 100644 --- a/phpdbg_help.c +++ b/phpdbg_help.c @@ -17,8 +17,6 @@ +----------------------------------------------------------------------+ */ -#include -#include "zend.h" #include "phpdbg.h" #include "phpdbg_help.h" diff --git a/phpdbg_print.c b/phpdbg_print.c index c167482b6f6..d49cc26fcb1 100644 --- a/phpdbg_print.c +++ b/phpdbg_print.c @@ -17,8 +17,6 @@ +----------------------------------------------------------------------+ */ -#include -#include "zend.h" #include "phpdbg.h" #include "phpdbg_print.h" From 1d373be4fbaaf9878c4acb1afb21647651dbbbc4 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 09:26:26 +0000 Subject: [PATCH 152/771] updates to helpers --- phpdbg_help.c | 40 ++++++++++++++++++++++++---------------- phpdbg_print.c | 14 ++++++++++++-- phpdbg_print.h | 4 ++-- phpdbg_prompt.c | 8 ++++---- phpdbg_prompt.h | 1 + 5 files changed, 43 insertions(+), 24 deletions(-) diff --git a/phpdbg_help.c b/phpdbg_help.c index 21feb07926d..1a78c6928a9 100644 --- a/phpdbg_help.c +++ b/phpdbg_help.c @@ -19,6 +19,9 @@ #include "phpdbg.h" #include "phpdbg_help.h" +#include "phpdbg_print.h" + +ZEND_EXTERN_MODULE_GLOBALS(phpdbg); PHPDBG_HELP(exec) /* {{{ */ { @@ -31,7 +34,7 @@ PHPDBG_HELP(step) /* {{{ */ { printf("You can enable and disable stepping at any phpdbg prompt during execution\n"); printf("For example:\n"); - printf("\tphpdbg> stepping 1\n"); + printf("\t%sstepping 1\n", PHPDBG_PROMPT_LINE(TSRMLS_C)); printf("Will enable stepping\n"); printf("While stepping is enabled you are presented with a prompt after the execution of each opcode\n"); return SUCCESS; @@ -56,11 +59,16 @@ PHPDBG_HELP(compile) /* {{{ */ PHPDBG_HELP(print) /* {{{ */ { printf("By default, print will show information about the current execution environment\n"); - printf("To show specific information pass an expression to print, for example:\n"); - printf("\tphpdbg> print opcodes[0]\n"); - printf("Will show the opline @ 0\n"); - printf("Available print commands:\n"); - printf("\tNone\n"); + printf("Specific printers loaded are show below:\n"); + printf("%sCommands%s\n", PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); + { + phpdbg_command_t *print_command = phpdbg_print_commands; + + while (print_command && print_command->name) { + printf("\t%s\t%s\n", print_command->name, print_command->tip); + ++print_command; + } + } return SUCCESS; } /* }}} */ @@ -86,13 +94,13 @@ PHPDBG_HELP(break) /* {{{ */ printf("\t\\my\\class::method\n"); printf("\t0x16\n"); printf("For example:\n"); - printf("\tphpdbg> break test.php:1\n"); + printf("\t%sbreak test.php:1\n", PHPDBG_PROMPT_LINE(TSRMLS_C)); printf("Will break execution on line 1 of test.php\n"); - printf("\tphpdbg> break my_function\n"); + printf("\t%sbreak my_function\n", PHPDBG_PROMPT_LINE(TSRMLS_C)); printf("Will break execution on entry to my_function\n"); - printf("\tphpdbg> break \\my\\class::method\n"); + printf("\t%sbreak \\my\\class::method\n", PHPDBG_PROMPT_LINE(TSRMLS_C)); printf("Will break execution on entry to \\my\\class::method\n"); - printf("\tphpdbg> break 0x7ff68f570e08\n"); + printf("\t%sbreak 0x7ff68f570e08\n", PHPDBG_PROMPT_LINE(TSRMLS_C)); printf("Will break at the opline with the address provided (addresses are shown during execution)\n"); printf("It is important to note, an address is only valid for the current compiled representation of the script\n"); printf("If you have to clean the environment and recompile then your opline break points will be invalid\n"); @@ -117,9 +125,9 @@ PHPDBG_HELP(quiet) /* {{{ */ { printf("Setting quietness on will stop the OPLINE output during execution\n"); printf("For example:\n"); - printf("\tphpdbg> quiet 1\n"); + printf("\t%squiet 1\n", PHPDBG_PROMPT_LINE(TSRMLS_C)); printf("Will silence OPLINE output, while\n"); - printf("\tphpdbg> quiet 0\n"); + printf("\t%squiet 0\n", PHPDBG_PROMPT_LINE(TSRMLS_C)); printf("Will enable OPLINE output again\n"); return SUCCESS; } /* }}} */ @@ -128,7 +136,7 @@ PHPDBG_HELP(back) /* {{{ */ { printf("The backtrace is gathered with the default debug_backtrace functionality.\n"); printf("You can set the limit on the trace, for example:\n"); - printf("\tphpdbg> back 5\n"); + printf("\t%sback 5\n", PHPDBG_PROMPT_LINE(TSRMLS_C)); printf("Will limit the number of frames to 5, the default is no limit\n"); return SUCCESS; } /* }}} */ @@ -136,11 +144,11 @@ PHPDBG_HELP(back) /* {{{ */ PHPDBG_HELP(list) /* {{{ */ { printf("The list command displays N line from current context file.\n"); - printf("\tphpdbg> list 2\n"); + printf("\t%slist 2\n", PHPDBG_PROMPT_LINE(TSRMLS_C)); printf("Will print next 2 lines from the current file\n"); - printf("\tphpdbg> list func\n"); + printf("\t%slist func\n", PHPDBG_PROMPT_LINE(TSRMLS_C)); printf("Will print the source of the global function \"func\"\n"); - printf("\tphpdbg> list .mine\n"); + printf("\t%slist .mine\n", PHPDBG_PROMPT_LINE(TSRMLS_C)); printf("Will print the source of the class method \"mine\"\n"); printf("Note: before listing functions you must have a populated function table, try compile !!\n"); return SUCCESS; diff --git a/phpdbg_print.c b/phpdbg_print.c index d49cc26fcb1..747789799f8 100644 --- a/phpdbg_print.c +++ b/phpdbg_print.c @@ -20,8 +20,18 @@ #include "phpdbg.h" #include "phpdbg_print.h" -PHPDBG_PRINT(default) /* {{{ */ +ZEND_EXTERN_MODULE_GLOBALS(phpdbg); + +PHPDBG_PRINT(opline) /* {{{ */ { - printf("in default printer\n"); + if (EG(in_execution) && EG(current_execute_data)) { + phpdbg_print_opline( + EG(current_execute_data), 1 TSRMLS_CC); + } else { + printf( + "%sNot Executing!%s\n", + PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); + } + return SUCCESS; } /* }}} */ diff --git a/phpdbg_print.h b/phpdbg_print.h index 825316a965d..ae8453bd0ff 100644 --- a/phpdbg_print.h +++ b/phpdbg_print.h @@ -34,13 +34,13 @@ /** * Printer Forward Declarations */ -PHPDBG_PRINT(default); +PHPDBG_PRINT(opline); /** * Commands */ static const phpdbg_command_t phpdbg_print_commands[] = { - PHPDBG_PRINT_D(default, "the default print command"), + PHPDBG_PRINT_D(opline, "print the current opline information"), {NULL, 0, 0} }; diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index dd225d6dbc4..5fae1559d38 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -699,15 +699,15 @@ phpdbg_interactive_enter: return SUCCESS; } /* }}} */ -static void phpdbg_print_opline(zend_execute_data *execute_data TSRMLS_DC) /* {{{ */ +void phpdbg_print_opline(zend_execute_data *execute_data, zend_bool ignore_flags TSRMLS_DC) /* {{{ */ { /* force out a line while stepping so the user knows what is happening */ - if (!(PHPDBG_G(flags) & PHPDBG_IS_QUIET) || (PHPDBG_G(flags) & PHPDBG_IS_STEPPING)) { + if (ignore_flags || (!(PHPDBG_G(flags) & PHPDBG_IS_QUIET) || (PHPDBG_G(flags) & PHPDBG_IS_STEPPING))) { zend_op *opline = execute_data->opline; printf( "%sOPLINE: %p:%s%s\n", - PHPDBG_BOLD_LINE(TSRMLS_C), + PHPDBG_BOLD_LINE(TSRMLS_C), opline, phpdbg_decode_opcode(opline->opcode), PHPDBG_END_LINE(TSRMLS_C)); } } /* }}} */ @@ -731,7 +731,7 @@ zend_vm_enter: #endif phpdbg_print_opline( - execute_data TSRMLS_CC); + execute_data, 0 TSRMLS_CC); if ((PHPDBG_G(flags) & PHPDBG_HAS_FILE_BP) && phpdbg_find_breakpoint_file(execute_data->op_array TSRMLS_CC) == SUCCESS) { diff --git a/phpdbg_prompt.h b/phpdbg_prompt.h index bddc7f99f7d..f9fd39dfdb5 100644 --- a/phpdbg_prompt.h +++ b/phpdbg_prompt.h @@ -60,5 +60,6 @@ int phpdbg_do_cmd(const phpdbg_command_t *command, char *cmd_line, size_t cmd_le int phpdbg_interactive(TSRMLS_D); void phpdbg_execute_ex(zend_execute_data *execute_data TSRMLS_DC); +void phpdbg_print_opline(zend_execute_data *execute_data, zend_bool ignore_flags TSRMLS_DC); #endif /* PHPDBG_PROMPT_H */ From 7f743e1fca1773a8e5deaac079386c9a8b731601 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 09:52:59 +0000 Subject: [PATCH 153/771] ... --- phpdbg_prompt.c | 52 ++++++++++++++++++++++++++++++------------------- phpdbg_prompt.h | 1 + 2 files changed, 33 insertions(+), 20 deletions(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 5fae1559d38..a3eaacbbef6 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -47,9 +47,8 @@ static PHPDBG_COMMAND(exec) /* {{{ */ printf( "%sDestroying compiled opcodes%s\n", PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); - destroy_op_array(PHPDBG_G(ops) TSRMLS_CC); - efree(PHPDBG_G(ops)); - PHPDBG_G(ops) = NULL; + + phpdbg_clean(0 TSRMLS_CC); } PHPDBG_G(exec) = estrndup(expr, PHPDBG_G(exec_len) = expr_len); @@ -99,9 +98,7 @@ static PHPDBG_COMMAND(compile) /* {{{ */ printf( "%sDestroying previously compiled opcodes%s\n", PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); - destroy_op_array(PHPDBG_G(ops) TSRMLS_CC); - efree(PHPDBG_G(ops)); - PHPDBG_G(ops)=NULL; + phpdbg_clean(0 TSRMLS_CC); } } @@ -184,6 +181,7 @@ static PHPDBG_COMMAND(eval) /* {{{ */ &retval, "eval()'d code" TSRMLS_CC) == SUCCESS) { zend_print_zval_r( &retval, 0 TSRMLS_CC); + zval_dtor(&retval); printf("\n"); } @@ -439,18 +437,7 @@ static PHPDBG_COMMAND(clean) /* {{{ */ printf("[\tConstants: %d]\n", zend_hash_num_elements(EG(zend_constants))); printf("[\tIncluded: %d]\n", zend_hash_num_elements(&EG(included_files))); - /* this is implicitly required */ - if (PHPDBG_G(ops)) { - destroy_op_array( - PHPDBG_G(ops) TSRMLS_CC); - efree(PHPDBG_G(ops)); - PHPDBG_G(ops) = NULL; - } - - zend_hash_reverse_apply(EG(function_table), (apply_func_t) clean_non_persistent_function_full TSRMLS_CC); - zend_hash_reverse_apply(EG(class_table), (apply_func_t) clean_non_persistent_class_full TSRMLS_CC); - zend_hash_reverse_apply(EG(zend_constants), (apply_func_t) clean_non_persistent_constant_full TSRMLS_CC); - zend_hash_clean(&EG(included_files)); + phpdbg_clean(1 TSRMLS_CC); printf("[Clean Environment:]\n"); printf("[\tClasses: %d]\n", zend_hash_num_elements(EG(class_table))); @@ -702,13 +689,38 @@ phpdbg_interactive_enter: void phpdbg_print_opline(zend_execute_data *execute_data, zend_bool ignore_flags TSRMLS_DC) /* {{{ */ { /* force out a line while stepping so the user knows what is happening */ - if (ignore_flags || (!(PHPDBG_G(flags) & PHPDBG_IS_QUIET) || (PHPDBG_G(flags) & PHPDBG_IS_STEPPING))) { + if (ignore_flags || + (!(PHPDBG_G(flags) & PHPDBG_IS_QUIET) || + (PHPDBG_G(flags) & PHPDBG_IS_STEPPING))) { + zend_op *opline = execute_data->opline; printf( "%sOPLINE: %p:%s%s\n", PHPDBG_BOLD_LINE(TSRMLS_C), - opline, phpdbg_decode_opcode(opline->opcode), PHPDBG_END_LINE(TSRMLS_C)); + opline, + phpdbg_decode_opcode(opline->opcode), + PHPDBG_END_LINE(TSRMLS_C)); + } +} /* }}} */ + +void phpdbg_clean(zend_bool full TSRMLS_DC) /* {{{ */ +{ + zend_objects_store_call_destructors(&EG(objects_store) TSRMLS_CC); + + /* this is implicitly required */ + if (PHPDBG_G(ops)) { + destroy_op_array( + PHPDBG_G(ops) TSRMLS_CC); + efree(PHPDBG_G(ops)); + PHPDBG_G(ops) = NULL; + } + + if (full) { + zend_hash_reverse_apply(EG(function_table), (apply_func_t) clean_non_persistent_function_full TSRMLS_CC); + zend_hash_reverse_apply(EG(class_table), (apply_func_t) clean_non_persistent_class_full TSRMLS_CC); + zend_hash_reverse_apply(EG(zend_constants), (apply_func_t) clean_non_persistent_constant_full TSRMLS_CC); + zend_hash_clean(&EG(included_files)); } } /* }}} */ diff --git a/phpdbg_prompt.h b/phpdbg_prompt.h index f9fd39dfdb5..2a4fa4bb74a 100644 --- a/phpdbg_prompt.h +++ b/phpdbg_prompt.h @@ -61,5 +61,6 @@ int phpdbg_do_cmd(const phpdbg_command_t *command, char *cmd_line, size_t cmd_le int phpdbg_interactive(TSRMLS_D); void phpdbg_execute_ex(zend_execute_data *execute_data TSRMLS_DC); void phpdbg_print_opline(zend_execute_data *execute_data, zend_bool ignore_flags TSRMLS_DC); +void phpdbg_clean(zend_bool full TSRMLS_DC); #endif /* PHPDBG_PROMPT_H */ From 6cc7a5784eed6fe24e9fa4982d0c01cc463d8355 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 12:10:53 +0000 Subject: [PATCH 154/771] windows --- phpdbg.h | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/phpdbg.h b/phpdbg.h index 34b2e56a38c..83b93fe912a 100644 --- a/phpdbg.h +++ b/phpdbg.h @@ -30,7 +30,17 @@ #include "zend_ini_scanner.h" #include "zend_stream.h" #include "SAPI.h" -#include +#include +#include +#if defined(_WIN32) && !defined(__MINGW32__) +# include +# include "config.w32.h" +#else +# include "php_config.h" +#endif +#ifndef O_BINARY +# define O_BINARY 0 +#endif #include "php_main.h" #ifdef ZTS From 9e47ce64acb74509a1c396f2b234a1b474028ce4 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 12:11:02 +0000 Subject: [PATCH 155/771] windows --- config.w32 | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 config.w32 diff --git a/config.w32 b/config.w32 new file mode 100644 index 00000000000..23592839983 --- /dev/null +++ b/config.w32 @@ -0,0 +1,5 @@ +ARG_ENABLE('phpdbg', 'Build phpdbg', 'yes'); + +if (PHP_PHPDBG == "yes") { + SAPI('phpdbg', 'phpdbg.c phpdbg_prompt.c phpdbg_help.c phpdbg_print.c phpdbg_bp.c phpdbg_opcode.c phpdbg_list.c phpdbg_utils.c', 'phpdbg.exe'); +} From 3168b7b0574eff976dfb63aac43822db493b721a Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 12:38:04 +0000 Subject: [PATCH 156/771] more windows --- phpdbg_list.c | 45 ++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 40 insertions(+), 5 deletions(-) diff --git a/phpdbg_list.c b/phpdbg_list.c index fe14b1dcc9e..9f2c6a22860 100644 --- a/phpdbg_list.c +++ b/phpdbg_list.c @@ -20,8 +20,10 @@ #include #include #include -#include -#include +#ifndef _WIN32 +# include +# include +#endif #include #include "phpdbg.h" #include "phpdbg_list.h" @@ -30,14 +32,19 @@ void phpdbg_list_file(const char *filename, long count, long offset TSRMLS_DC) / { unsigned char *mem, *pos, *last_pos, *end_pos; struct stat st; - int fd, all_content = (count == 0); +#ifndef _WIN32 + int fd; +#else + HANDLE fd, map; +#endif + int all_content = (count == 0); unsigned int line = 0, displayed = 0; if (VCWD_STAT(filename, &st) == -1) { printf("[Failed to stat file %s]\n", filename); return; } - +#ifndef _WIN32 if ((fd = VCWD_OPEN(filename, O_RDONLY)) == -1) { printf("[Failed to open file %s to list]\n", filename); return; @@ -45,7 +52,29 @@ void phpdbg_list_file(const char *filename, long count, long offset TSRMLS_DC) / last_pos = mem = mmap(0, st.st_size, PROT_READ, MAP_SHARED, fd, 0); end_pos = mem + st.st_size; +#else + fd = CreateFile(filename, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); + if (fd == INVALID_HANDLE_VALUE) { + printf("[Failed to open file!]\n"); + return; + } + + map = CreateFileMapping(fd, NULL, PAGE_EXECUTE_READ, 0, 0, 0); + if (map == NULL) { + printf("[Failed to map file!]\n"); + CloseHandle(fd); + return; + } + last_pos = mem = (char*) MapViewOfFile(map, FILE_MAP_READ, 0, 0, 0); + if (mem == NULL) { + printf("[Failed to map file in memory]\n"); + CloseHandle(map); + CloseHandle(fd); + return; + } + end_pos = mem + st.st_size; +#endif while (1) { pos = memchr(last_pos, '\n', end_pos - last_pos); @@ -70,9 +99,14 @@ void phpdbg_list_file(const char *filename, long count, long offset TSRMLS_DC) / } } +#ifndef _WIN32 munmap(mem, st.st_size); -out: close(fd); +#else + UnmapViewOfFile(mem); + CloseHandle(map); + CloseHandle(fd); +#endif } /* }}} */ void phpdbg_list_function(const zend_function *fbc TSRMLS_DC) /* {{{ */ @@ -88,3 +122,4 @@ void phpdbg_list_function(const zend_function *fbc TSRMLS_DC) /* {{{ */ phpdbg_list_file(ops->filename, ops->line_end - ops->line_start + 1, ops->line_start TSRMLS_CC); } /* }}} */ + From ffad3fa2119346e6735dda266f705fae68c1109c Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Tue, 12 Nov 2013 10:58:19 -0200 Subject: [PATCH 157/771] - Implemented "break N" where N is the line number on the current file --- phpdbg_prompt.c | 116 ++++++++++++++++++++++++++---------------------- phpdbg_utils.c | 5 +++ phpdbg_utils.h | 1 + 3 files changed, 70 insertions(+), 52 deletions(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index a3eaacbbef6..3040b80d265 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -37,7 +37,7 @@ static PHPDBG_COMMAND(exec) /* {{{ */ { if (PHPDBG_G(exec)) { printf( - "%sUnsetting old execution context: %s%s\n", + "%sUnsetting old execution context: %s%s\n", PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_G(exec), PHPDBG_END_LINE(TSRMLS_C)); efree(PHPDBG_G(exec)); PHPDBG_G(exec) = NULL; @@ -47,14 +47,14 @@ static PHPDBG_COMMAND(exec) /* {{{ */ printf( "%sDestroying compiled opcodes%s\n", PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); - + phpdbg_clean(0 TSRMLS_CC); } PHPDBG_G(exec) = estrndup(expr, PHPDBG_G(exec_len) = expr_len); printf( - "%sSet execution context: %s%s\n", + "%sSet execution context: %s%s\n", PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_G(exec), PHPDBG_END_LINE(TSRMLS_C)); return SUCCESS; @@ -73,17 +73,17 @@ static inline int phpdbg_compile(TSRMLS_D) /* {{{ */ &fh, ZEND_INCLUDE TSRMLS_CC); zend_destroy_file_handle(&fh TSRMLS_CC); printf( - "%sSuccess%s\n", + "%sSuccess%s\n", PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); return SUCCESS; } else { printf( - "%sCould not open file %s%s\n", + "%sCould not open file %s%s\n", PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_G(exec), PHPDBG_END_LINE(TSRMLS_C)); } } else { printf( - "%sCannot compile while in execution%s\n", + "%sCannot compile while in execution%s\n", PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); } @@ -96,7 +96,7 @@ static PHPDBG_COMMAND(compile) /* {{{ */ if (!EG(in_execution)) { if (PHPDBG_G(ops)) { printf( - "%sDestroying previously compiled opcodes%s\n", + "%sDestroying previously compiled opcodes%s\n", PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); phpdbg_clean(0 TSRMLS_CC); } @@ -120,11 +120,11 @@ static PHPDBG_COMMAND(step) /* {{{ */ } printf( - "%sStepping %s%s\n", - PHPDBG_BOLD_LINE(TSRMLS_C), - (PHPDBG_G(flags) & PHPDBG_IS_STEPPING) ? "on" : "off", + "%sStepping %s%s\n", + PHPDBG_BOLD_LINE(TSRMLS_C), + (PHPDBG_G(flags) & PHPDBG_IS_STEPPING) ? "on" : "off", PHPDBG_END_LINE(TSRMLS_C)); - + return SUCCESS; } /* }}} */ @@ -230,7 +230,7 @@ static PHPDBG_COMMAND(print) /* {{{ */ if (expr_len > 0L) { if (phpdbg_do_cmd(phpdbg_print_commands, (char*)expr, expr_len TSRMLS_CC) == FAILURE) { printf( - "%sFailed to find print command: %s/%lu%s\n", + "%sFailed to find print command: %s/%lu%s\n", PHPDBG_RED_LINE(TSRMLS_C), expr, expr_len, PHPDBG_END_LINE(TSRMLS_C)); } return SUCCESS; @@ -382,22 +382,34 @@ static PHPDBG_COMMAND(break) /* {{{ */ } } } else { - if (expr_len > 2 && expr[0] == '0' && expr[1] == 'x') { - phpdbg_set_breakpoint_opline(expr TSRMLS_CC); - } else { - char name[200]; - size_t name_len = strlen(expr); - - if (name_len) { - name_len = MIN(name_len, 200); - memcpy(name, expr, name_len); - name[name_len] = 0; + if (phpdbg_is_addr(expr)) { + phpdbg_set_breakpoint_opline(expr TSRMLS_CC); + } else if (phpdbg_is_numeric(expr)) { + const char *filename = zend_get_executed_filename(TSRMLS_C); + long line_num = strtol(expr, NULL, 0); + + if (!filename) { + printf("%sNo file context found%s\n", + PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); + return FAILURE; + } - phpdbg_set_breakpoint_symbol(name TSRMLS_CC); - } else { - printf("%sMalformed break command found%s\n", PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); - return FAILURE; - } + phpdbg_set_breakpoint_file(filename, line_num TSRMLS_CC); + } else { + char name[200]; + size_t name_len = strlen(expr); + + if (name_len) { + name_len = MIN(name_len, 200); + memcpy(name, expr, name_len); + name[name_len] = 0; + + phpdbg_set_breakpoint_symbol(name TSRMLS_CC); + } else { + printf("%sMalformed break command found%s\n", + PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); + return FAILURE; + } } } @@ -469,13 +481,13 @@ static PHPDBG_COMMAND(clear) /* {{{ */ static PHPDBG_COMMAND(help) /* {{{ */ { printf( - "%sWelcome to phpdbg, the interactive PHP debugger, v%s%s\n", + "%sWelcome to phpdbg, the interactive PHP debugger, v%s%s\n", PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_VERSION, PHPDBG_END_LINE(TSRMLS_C)); if (expr_len > 0L) { if (phpdbg_do_cmd(phpdbg_help_commands, (char*)expr, expr_len TSRMLS_CC) == FAILURE) { printf( - "%sFailed to find help command: %s/%lu%s\n", + "%sFailed to find help command: %s/%lu%s\n", PHPDBG_RED_LINE(TSRMLS_C), expr, expr_len, PHPDBG_END_LINE(TSRMLS_C)); } } else { @@ -485,26 +497,26 @@ static PHPDBG_COMMAND(help) /* {{{ */ printf("To get help regarding a specific command type \"help command\"\n"); printf( - "%sCommands%s\n", + "%sCommands%s\n", PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); - + while (prompt_command && prompt_command->name) { printf("\t%s\t%s\n", prompt_command->name, prompt_command->tip); ++prompt_command; } printf( - "%sHelpers Loaded%s\n", + "%sHelpers Loaded%s\n", PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); - + while (help_command && help_command->name) { printf("\t%s\t%s\n", help_command->name, help_command->tip); ++help_command; } } - + printf( - "%sPlease report bugs to <%s>%s\n", + "%sPlease report bugs to <%s>%s\n", PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_ISSUES, PHPDBG_END_LINE(TSRMLS_C)); return SUCCESS; @@ -545,13 +557,13 @@ static PHPDBG_COMMAND(list) /* {{{ */ zend_function* fbc; const char *func_name = expr; size_t func_name_len = expr_len; - + /* search active scope if begins with period */ if (func_name[0] == '.') { if (EG(scope)) { func_name++; func_name_len--; - + func_table = &EG(scope)->function_table; } else { printf( @@ -567,13 +579,13 @@ static PHPDBG_COMMAND(list) /* {{{ */ } else { func_table = EG(function_table); } - + if (zend_hash_find(func_table, func_name, func_name_len, (void**)&fbc) == SUCCESS) { phpdbg_list_function(fbc TSRMLS_CC); } else { printf( - "%sFunction %s not found%s\n", + "%sFunction %s not found%s\n", PHPDBG_RED_LINE(TSRMLS_C), func_name, PHPDBG_END_LINE(TSRMLS_C)); } } @@ -623,13 +635,13 @@ int phpdbg_do_cmd(const phpdbg_command_t *command, char *cmd_line, size_t cmd_le int phpdbg_interactive(TSRMLS_D) /* {{{ */ { size_t cmd_len; - + #ifndef HAVE_LIBREADLINE char cmd[PHPDBG_MAX_CMD]; - + phpdbg_interactive_enter: printf(PHPDBG_PROMPT_LINE(TSRMLS_C)); - + while (!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING) && fgets(cmd, PHPDBG_MAX_CMD, stdin) != NULL) { cmd_len = strlen(cmd) - 1; @@ -639,14 +651,14 @@ phpdbg_interactive_enter: phpdbg_interactive_enter: while (!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING)) { cmd = readline(PHPDBG_PROMPT_LINE(TSRMLS_C)); - + cmd_len = strlen(cmd); #endif /* trim space from end of input */ while (isspace(cmd[cmd_len-1])) cmd_len--; - + /* ensure string is null terminated */ cmd[cmd_len] = '\0'; @@ -659,7 +671,7 @@ phpdbg_interactive_enter: case FAILURE: if (!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING)) { printf( - "%sFailed to execute %s !%s\n", + "%sFailed to execute %s !%s\n", PHPDBG_RED_LINE(TSRMLS_C), cmd, PHPDBG_END_LINE(TSRMLS_C)); } break; @@ -689,17 +701,17 @@ phpdbg_interactive_enter: void phpdbg_print_opline(zend_execute_data *execute_data, zend_bool ignore_flags TSRMLS_DC) /* {{{ */ { /* force out a line while stepping so the user knows what is happening */ - if (ignore_flags || - (!(PHPDBG_G(flags) & PHPDBG_IS_QUIET) || + if (ignore_flags || + (!(PHPDBG_G(flags) & PHPDBG_IS_QUIET) || (PHPDBG_G(flags) & PHPDBG_IS_STEPPING))) { - + zend_op *opline = execute_data->opline; printf( - "%sOPLINE: %p:%s%s\n", + "%sOPLINE: %p:%s%s\n", PHPDBG_BOLD_LINE(TSRMLS_C), - opline, - phpdbg_decode_opcode(opline->opcode), + opline, + phpdbg_decode_opcode(opline->opcode), PHPDBG_END_LINE(TSRMLS_C)); } } /* }}} */ @@ -707,7 +719,7 @@ void phpdbg_print_opline(zend_execute_data *execute_data, zend_bool ignore_flags void phpdbg_clean(zend_bool full TSRMLS_DC) /* {{{ */ { zend_objects_store_call_destructors(&EG(objects_store) TSRMLS_CC); - + /* this is implicitly required */ if (PHPDBG_G(ops)) { destroy_op_array( diff --git a/phpdbg_utils.c b/phpdbg_utils.c index e3408ed47e7..9e39010ea04 100644 --- a/phpdbg_utils.c +++ b/phpdbg_utils.c @@ -41,3 +41,8 @@ int phpdbg_is_empty(const char *str) /* {{{ */ } return 1; } /* }}} */ + +int phpdbg_is_addr(const char *str) /* {{{ */ +{ + return str[0] && str[1] && memcmp(str, "0x", 2) == 0; +} /* }}} */ diff --git a/phpdbg_utils.h b/phpdbg_utils.h index 3cb430f0594..464a0c7f900 100644 --- a/phpdbg_utils.h +++ b/phpdbg_utils.h @@ -22,5 +22,6 @@ int phpdbg_is_numeric(const char*); int phpdbg_is_empty(const char*); +int phpdbg_is_addr(const char*); #endif /* PHPDBG_UTILS_H */ From fdf26eaa0f7daaecfb05699e6012d140d1cdbaa8 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Tue, 12 Nov 2013 11:07:35 -0200 Subject: [PATCH 158/771] - Removed name member to opline breakpoints --- phpdbg.c | 51 ++++++++++++++++++--------------------- phpdbg_bp.c | 63 +++++++++++++++++++++++-------------------------- phpdbg_bp.h | 2 +- phpdbg_prompt.c | 4 +++- test.php | 2 +- 5 files changed, 57 insertions(+), 65 deletions(-) diff --git a/phpdbg.c b/phpdbg.c index a83e4928098..bd756eef67e 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -58,11 +58,6 @@ static void php_phpdbg_destroy_bp_symbol(void *brake) /* {{{ */ efree((char*)((phpdbg_breaksymbol_t*)brake)->symbol); } /* }}} */ -static void php_phpdbg_destroy_bp_opline(void *brake) /* {{{ */ -{ - free((char*)((phpdbg_breakline_t*)brake)->name); -} /* }}} */ - static void php_phpdbg_destroy_bp_methods(void *brake) /* {{{ */ { zend_hash_destroy((HashTable*)brake); @@ -72,9 +67,9 @@ static PHP_RINIT_FUNCTION(phpdbg) /* {{{ */ { zend_hash_init(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE], 8, NULL, php_phpdbg_destroy_bp_file, 0); zend_hash_init(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM], 8, NULL, php_phpdbg_destroy_bp_symbol, 0); - zend_hash_init(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], 8, NULL, php_phpdbg_destroy_bp_opline, 0); + zend_hash_init(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], 8, NULL, NULL, 0); zend_hash_init(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], 8, NULL, php_phpdbg_destroy_bp_methods, 0); - + return SUCCESS; } /* }}} */ @@ -84,7 +79,7 @@ static PHP_RSHUTDOWN_FUNCTION(phpdbg) /* {{{ */ zend_hash_destroy(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM]); zend_hash_destroy(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE]); zend_hash_destroy(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD]); - + if (PHPDBG_G(exec)) { efree(PHPDBG_G(exec)); } @@ -97,12 +92,12 @@ static PHP_RSHUTDOWN_FUNCTION(phpdbg) /* {{{ */ } /* }}} */ /* {{{ proto void phpdbg_break(void) - instructs phpdbg to insert a breakpoint at the next opcode */ + instructs phpdbg to insert a breakpoint at the next opcode */ static PHP_FUNCTION(phpdbg_break) { if (EG(current_execute_data) && EG(active_op_array)) { zend_ulong opline_num = (EG(current_execute_data)->opline - EG(active_op_array)->opcodes); - + phpdbg_set_breakpoint_opline_ex( &EG(active_op_array)->opcodes[opline_num+1] TSRMLS_CC); } @@ -206,7 +201,7 @@ static void php_sapi_phpdbg_register_vars(zval *track_vars_array TSRMLS_DC) /* { if (sapi_module.input_filter(PARSE_SERVER, "SCRIPT_NAME", &PHPDBG_G(exec), PHPDBG_G(exec_len), &len TSRMLS_CC)) { php_register_variable("SCRIPT_NAME", PHPDBG_G(exec), track_vars_array TSRMLS_CC); } - + if (sapi_module.input_filter(PARSE_SERVER, "SCRIPT_FILENAME", &PHPDBG_G(exec), PHPDBG_G(exec_len), &len TSRMLS_CC)) { php_register_variable("SCRIPT_FILENAME", PHPDBG_G(exec), track_vars_array TSRMLS_CC); } @@ -214,7 +209,7 @@ static void php_sapi_phpdbg_register_vars(zval *track_vars_array TSRMLS_DC) /* { php_register_variable("PATH_TRANSLATED", PHPDBG_G(exec), track_vars_array TSRMLS_CC); } } - + /* any old docroot will doo */ len = 0U; if (sapi_module.input_filter(PARSE_SERVER, "DOCUMENT_ROOT", &docroot, len, &len TSRMLS_CC)) { @@ -302,7 +297,7 @@ int main(int argc, char *argv[]) /* {{{ */ char *php_optarg = NULL; int php_optind = 1; int opt; - + #ifdef ZTS void ***tsrm_ls; #endif @@ -319,7 +314,7 @@ int main(int argc, char *argv[]) /* {{{ */ tsrm_ls = ts_resource(0); #endif - + while ((opt = php_getopt(argc, argv, OPTIONS, &php_optarg, &php_optind, 0, 2)) != -1) { switch (opt) { case 'n': @@ -363,7 +358,7 @@ int main(int argc, char *argv[]) /* {{{ */ case 'z': zend_load_extension(php_optarg); break; - + case 'e': /* set execution context */ exec_len = strlen(php_optarg); if (exec_len) { @@ -374,11 +369,11 @@ int main(int argc, char *argv[]) /* {{{ */ case 'v': /* set quietness off */ flags &= ~PHPDBG_IS_QUIET; break; - + case 's': /* set stepping on */ flags |= PHPDBG_IS_STEPPING; break; - + case 'b': /* set colours off */ flags &= ~PHPDBG_IS_COLOURED; break; @@ -394,7 +389,7 @@ int main(int argc, char *argv[]) /* {{{ */ phpdbg->executable_location = argv[0]; phpdbg->phpinfo_as_text = 1; phpdbg->php_ini_ignore = 0; - + if (ini_entries) { ini_entries = realloc(ini_entries, ini_entries_len + sizeof(phpdbg_ini_hardcoded)); memmove(ini_entries + sizeof(phpdbg_ini_hardcoded) - 2, ini_entries, ini_entries_len + 1); @@ -404,9 +399,9 @@ int main(int argc, char *argv[]) /* {{{ */ memcpy(ini_entries, phpdbg_ini_hardcoded, sizeof(phpdbg_ini_hardcoded)); } ini_entries_len += sizeof(phpdbg_ini_hardcoded) - 2; - + phpdbg->ini_entries = ini_entries; - + if (phpdbg->startup(phpdbg) == SUCCESS) { zend_activate(TSRMLS_C); @@ -421,35 +416,35 @@ int main(int argc, char *argv[]) /* {{{ */ if (exec) { /* set execution context */ PHPDBG_G(exec) = estrndup(exec, exec_len); PHPDBG_G(exec_len) = exec_len; - + free(exec); } - + /* set flags from command line */ PHPDBG_G(flags) = flags; - + zend_try { zend_activate_modules(TSRMLS_C); } zend_end_try(); - + /* print blurb */ printf( - "%sWelcome to phpdbg, the interactive PHP debugger, v%s%s\n", + "%sWelcome to phpdbg, the interactive PHP debugger, v%s%s\n", PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_VERSION, PHPDBG_END_LINE(TSRMLS_C)); printf( "[To get help using phpdbg type \"help\" and press enter\n"); printf( - "%sPlease report bugs to <%s>%s\n", + "%sPlease report bugs to <%s>%s\n", PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_ISSUES, PHPDBG_END_LINE(TSRMLS_C)); do { zend_try { phpdbg_interactive(TSRMLS_C); } zend_catch { - + } zend_end_try(); } while(!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING)); - + if (ini_entries) { free(ini_entries); } diff --git a/phpdbg_bp.c b/phpdbg_bp.c index 8ce2edbe530..aa7c63092df 100644 --- a/phpdbg_bp.c +++ b/phpdbg_bp.c @@ -68,8 +68,8 @@ void phpdbg_set_breakpoint_file(const char *path, long line_num TSRMLS_DC) /* {{ zend_llist_add_element(break_files_ptr, &new_break); printf( - "%sBreakpoint #%d added at %s:%ld%s\n", - PHPDBG_BOLD_LINE(TSRMLS_C), + "%sBreakpoint #%d added at %s:%ld%s\n", + PHPDBG_BOLD_LINE(TSRMLS_C), new_break.id, new_break.filename, new_break.line, PHPDBG_END_LINE(TSRMLS_C)); } /* }}} */ @@ -90,13 +90,13 @@ void phpdbg_set_breakpoint_symbol(const char *name TSRMLS_DC) /* {{{ */ name_len, &new_break, sizeof(phpdbg_breaksymbol_t), NULL); printf( - "%sBreakpoint #%d added at %s%s\n", - PHPDBG_BOLD_LINE(TSRMLS_C), + "%sBreakpoint #%d added at %s%s\n", + PHPDBG_BOLD_LINE(TSRMLS_C), new_break.id, new_break.symbol, PHPDBG_END_LINE(TSRMLS_C)); } else { printf( - "%sBreakpoint exists at %s%s\n", + "%sBreakpoint exists at %s%s\n", PHPDBG_BOLD_LINE(TSRMLS_C), name, PHPDBG_END_LINE(TSRMLS_C)); } } /* }}} */ @@ -112,8 +112,8 @@ void phpdbg_set_breakpoint_method(const char* class_name, zend_hash_init( &class_breaks, 8, NULL, phpdbg_class_breaks_dtor, 0); zend_hash_update( - &PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], - class_name, class_len, + &PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], + class_name, class_len, (void**)&class_breaks, sizeof(HashTable), (void**)&class_table); } @@ -130,42 +130,40 @@ void phpdbg_set_breakpoint_method(const char* class_name, zend_hash_update(class_table, func_name, func_len, &new_break, sizeof(phpdbg_breakmethod_t), NULL); printf( - "%sBreakpoint #%d added at %s::%s%s\n", + "%sBreakpoint #%d added at %s::%s%s\n", PHPDBG_BOLD_LINE(TSRMLS_C), new_break.id, class_name, func_name, PHPDBG_END_LINE(TSRMLS_C)); } else { printf( - "%sBreakpoint exists at %s::%s%s\n", - PHPDBG_BOLD_LINE(TSRMLS_C), - class_name, func_name, + "%sBreakpoint exists at %s::%s%s\n", + PHPDBG_BOLD_LINE(TSRMLS_C), + class_name, func_name, PHPDBG_END_LINE(TSRMLS_C)); } } /* }}} */ -void phpdbg_set_breakpoint_opline(const char *name TSRMLS_DC) /* {{{ */ +void phpdbg_set_breakpoint_opline(zend_ulong opline TSRMLS_DC) /* {{{ */ { - zend_ulong opline = strtoul(name, 0, 16); - if (!zend_hash_index_exists(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], opline)) { phpdbg_breakline_t new_break; PHPDBG_G(flags) |= PHPDBG_HAS_OPLINE_BP; - new_break.name = strdup(name); + new_break.name = NULL; new_break.opline = opline; new_break.id = PHPDBG_G(bp_count)++; zend_hash_index_update(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], opline, &new_break, sizeof(phpdbg_breakline_t), NULL); - printf("%sBreakpoint #%d added at %s%s\n", - PHPDBG_BOLD_LINE(TSRMLS_C), - new_break.id, new_break.name, + printf("%sBreakpoint #%d added at %#lx%s\n", + PHPDBG_BOLD_LINE(TSRMLS_C), + new_break.id, new_break.opline, PHPDBG_END_LINE(TSRMLS_C)); } else { printf( - "%sBreakpoint exists at %s%s\n", - PHPDBG_BOLD_LINE(TSRMLS_C), name, PHPDBG_END_LINE(TSRMLS_C)); + "%sBreakpoint exists at %#lx%s\n", + PHPDBG_BOLD_LINE(TSRMLS_C), opline, PHPDBG_END_LINE(TSRMLS_C)); } } /* }}} */ @@ -176,18 +174,15 @@ void phpdbg_set_breakpoint_opline_ex(phpdbg_opline_ptr_t opline TSRMLS_DC) /* {{ PHPDBG_G(flags) |= PHPDBG_HAS_OPLINE_BP; - asprintf( - (char**)&new_break.name, "%p", (zend_op*) opline); - new_break.opline = (zend_ulong) opline; new_break.id = PHPDBG_G(bp_count)++; zend_hash_index_update(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], (zend_ulong) opline, &new_break, sizeof(phpdbg_breakline_t), NULL); printf( - "%sBreakpoint #%d added at %p%s\n", - PHPDBG_BOLD_LINE(TSRMLS_C), - new_break.id, (zend_op*) new_break.opline, + "%sBreakpoint #%d added at %#lx%s\n", + PHPDBG_BOLD_LINE(TSRMLS_C), + new_break.id, new_break.opline, PHPDBG_END_LINE(TSRMLS_C)); } } /* }}} */ @@ -207,8 +202,8 @@ int phpdbg_find_breakpoint_file(zend_op_array *op_array TSRMLS_DC) /* {{{ */ const phpdbg_breakfile_t *bp = (phpdbg_breakfile_t*)le->data; if (bp->line == (*EG(opline_ptr))->lineno) { - printf("%sBreakpoint #%d at %s:%ld%s\n", - PHPDBG_BOLD_LINE(TSRMLS_C), + printf("%sBreakpoint #%d at %s:%ld%s\n", + PHPDBG_BOLD_LINE(TSRMLS_C), bp->id, bp->filename, bp->line, PHPDBG_END_LINE(TSRMLS_C)); return SUCCESS; @@ -244,7 +239,7 @@ int phpdbg_find_breakpoint_symbol(zend_function *fbc TSRMLS_DC) /* {{{ */ if (zend_hash_find(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM], fname, strlen(fname), (void**)&bp) == SUCCESS) { - printf("%sBreakpoint #%d in %s() at %s:%u%s\n", + printf("%sBreakpoint #%d in %s() at %s:%u%s\n", PHPDBG_BOLD_LINE(TSRMLS_C), bp->id, bp->symbol, zend_get_executed_filename(TSRMLS_C), @@ -261,7 +256,7 @@ int phpdbg_find_breakpoint_method(zend_op_array *ops TSRMLS_DC) /* {{{ */ HashTable *class_table; phpdbg_breakmethod_t *bp; - if (zend_hash_find(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], ops->scope->name, ops->scope->name_length, + if (zend_hash_find(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], ops->scope->name, ops->scope->name_length, (void**)&class_table) == SUCCESS) { if (zend_hash_find( class_table, @@ -269,7 +264,7 @@ int phpdbg_find_breakpoint_method(zend_op_array *ops TSRMLS_DC) /* {{{ */ strlen(ops->function_name), (void**)&bp) == SUCCESS) { printf( - "%sBreakpoint #%d in %s::%s() at %s:%u%s\n", + "%sBreakpoint #%d in %s::%s() at %s:%u%s\n", PHPDBG_BOLD_LINE(TSRMLS_C), bp->id, bp->class_name, bp->func_name, zend_get_executed_filename(TSRMLS_C), @@ -288,9 +283,9 @@ int phpdbg_find_breakpoint_opline(phpdbg_opline_ptr_t opline TSRMLS_DC) /* {{{ * if (zend_hash_index_find(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], (zend_ulong) opline, (void**)&bp) == SUCCESS) { - printf("%sBreakpoint #%d in %s at %s:%u%s\n", + printf("%sBreakpoint #%d in %#lx at %s:%u%s\n", PHPDBG_BOLD_LINE(TSRMLS_C), - bp->id, bp->name, + bp->id, bp->opline, zend_get_executed_filename(TSRMLS_C), zend_get_executed_lineno(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); @@ -307,7 +302,7 @@ void phpdbg_clear_breakpoints(TSRMLS_D) /* {{{ */ zend_hash_clean(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM]); zend_hash_clean(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE]); zend_hash_clean(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD]); - + PHPDBG_G(flags) &= ~PHPDBG_BP_MASK; PHPDBG_G(bp_count) = 0; diff --git a/phpdbg_bp.h b/phpdbg_bp.h index 3eaa6e695e0..7636d8bf50c 100644 --- a/phpdbg_bp.h +++ b/phpdbg_bp.h @@ -63,7 +63,7 @@ typedef struct _phpdbg_breakline_t { void phpdbg_set_breakpoint_file(const char*, long TSRMLS_DC); void phpdbg_set_breakpoint_symbol(const char* TSRMLS_DC); void phpdbg_set_breakpoint_method(const char*, size_t, const char*, size_t TSRMLS_DC); -void phpdbg_set_breakpoint_opline(const char* TSRMLS_DC); +void phpdbg_set_breakpoint_opline(zend_ulong TSRMLS_DC); void phpdbg_set_breakpoint_opline_ex(phpdbg_opline_ptr_t TSRMLS_DC); int phpdbg_find_breakpoint_file(zend_op_array* TSRMLS_DC); diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 3040b80d265..54be3aa3b4b 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -383,7 +383,9 @@ static PHPDBG_COMMAND(break) /* {{{ */ } } else { if (phpdbg_is_addr(expr)) { - phpdbg_set_breakpoint_opline(expr TSRMLS_CC); + zend_ulong opline = strtoul(expr, 0, 16); + + phpdbg_set_breakpoint_opline(opline TSRMLS_CC); } else if (phpdbg_is_numeric(expr)) { const char *filename = zend_get_executed_filename(TSRMLS_C); long line_num = strtol(expr, NULL, 0); diff --git a/test.php b/test.php index 457e487db70..06e855bfd3f 100644 --- a/test.php +++ b/test.php @@ -13,6 +13,6 @@ function test2() { $my = new my(); var_dump($my->method()); - +phpdbg_break(); return true; ?> From 277b10a5c059437754452b6de7e42aa6bde64e13 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 13:21:55 +0000 Subject: [PATCH 159/771] ... --- phpdbg_prompt.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 3040b80d265..6bfc16a70c6 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -615,7 +615,11 @@ static const phpdbg_command_t phpdbg_prompt_commands[] = { int phpdbg_do_cmd(const phpdbg_command_t *command, char *cmd_line, size_t cmd_len TSRMLS_DC) /* {{{ */ { char *params = NULL; +#ifndef _WIN32 const char *cmd = strtok_r(cmd_line, " ", ¶ms); +#else + const char *cmd = strtok_s(cmd_line, " ", ¶ms); +#endif size_t expr_len = cmd != NULL ? strlen(cmd) : 0; while (command && command->name) { From af90b6d5c737646fa2b1f30d2f85a67fd8d770a7 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Tue, 12 Nov 2013 11:33:51 -0200 Subject: [PATCH 160/771] - Improved breakpoint code --- phpdbg_bp.c | 17 +++++++++-------- phpdbg_bp.h | 2 +- phpdbg_prompt.c | 46 ++++++++++++++++++---------------------------- phpdbg_utils.c | 22 ++++++++++++++++++++++ phpdbg_utils.h | 1 + 5 files changed, 51 insertions(+), 37 deletions(-) diff --git a/phpdbg_bp.c b/phpdbg_bp.c index aa7c63092df..43f5fa7882e 100644 --- a/phpdbg_bp.c +++ b/phpdbg_bp.c @@ -101,16 +101,15 @@ void phpdbg_set_breakpoint_symbol(const char *name TSRMLS_DC) /* {{{ */ } } /* }}} */ -void phpdbg_set_breakpoint_method(const char* class_name, - size_t class_len, - const char* func_name, - size_t func_len TSRMLS_DC) /* {{{ */ +void phpdbg_set_breakpoint_method(const char* class_name, const char* func_name TSRMLS_DC) /* {{{ */ { HashTable class_breaks, *class_table; + size_t class_len = strlen(class_name); + size_t func_len = strlen(func_name); - if (zend_hash_find(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], class_name, class_len, (void**)&class_table) != SUCCESS) { - zend_hash_init( - &class_breaks, 8, NULL, phpdbg_class_breaks_dtor, 0); + if (zend_hash_find(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], class_name, + class_len, (void**)&class_table) != SUCCESS) { + zend_hash_init(&class_breaks, 8, NULL, phpdbg_class_breaks_dtor, 0); zend_hash_update( &PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], class_name, class_len, @@ -128,7 +127,9 @@ void phpdbg_set_breakpoint_method(const char* class_name, new_break.func_len = func_len; new_break.id = PHPDBG_G(bp_count)++; - zend_hash_update(class_table, func_name, func_len, &new_break, sizeof(phpdbg_breakmethod_t), NULL); + zend_hash_update(class_table, func_name, func_len, + &new_break, sizeof(phpdbg_breakmethod_t), NULL); + printf( "%sBreakpoint #%d added at %s::%s%s\n", PHPDBG_BOLD_LINE(TSRMLS_C), diff --git a/phpdbg_bp.h b/phpdbg_bp.h index 7636d8bf50c..61d5004bf99 100644 --- a/phpdbg_bp.h +++ b/phpdbg_bp.h @@ -62,7 +62,7 @@ typedef struct _phpdbg_breakline_t { void phpdbg_set_breakpoint_file(const char*, long TSRMLS_DC); void phpdbg_set_breakpoint_symbol(const char* TSRMLS_DC); -void phpdbg_set_breakpoint_method(const char*, size_t, const char*, size_t TSRMLS_DC); +void phpdbg_set_breakpoint_method(const char*, const char* TSRMLS_DC); void phpdbg_set_breakpoint_opline(zend_ulong TSRMLS_DC); void phpdbg_set_breakpoint_opline_ex(phpdbg_opline_ptr_t TSRMLS_DC); diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 54be3aa3b4b..f12567c5ed0 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -329,8 +329,7 @@ static PHPDBG_COMMAND(print) /* {{{ */ static PHPDBG_COMMAND(break) /* {{{ */ { - char *line_pos = NULL; - char *func_pos = NULL; + char *line_pos; if (expr_len <= 0L) { printf( @@ -338,10 +337,17 @@ static PHPDBG_COMMAND(break) /* {{{ */ return FAILURE; } - line_pos = strchr(expr, ':'); + line_pos = strchr(expr, ':'); if (line_pos) { - if (!(func_pos=strchr(line_pos+1, ':'))) { + char *class; + char *func; + + /* break class::method */ + if (phpdbg_is_class_method(expr, expr_len, &class, &func)) { + phpdbg_set_breakpoint_method(class, func TSRMLS_CC); + } else { + /* break file:line */ char path[MAXPATHLEN], resolved_name[MAXPATHLEN]; long line_num = strtol(line_pos+1, NULL, 0); @@ -350,43 +356,26 @@ static PHPDBG_COMMAND(break) /* {{{ */ path[line_pos - expr] = 0; if (expand_filepath(path, resolved_name TSRMLS_CC) == NULL) { - printf("%sFailed to expand path %s%s\n", PHPDBG_RED_LINE(TSRMLS_C), path, PHPDBG_END_LINE(TSRMLS_C)); + printf("%sFailed to expand path %s%s\n", + PHPDBG_RED_LINE(TSRMLS_C), path, PHPDBG_END_LINE(TSRMLS_C)); return FAILURE; } phpdbg_set_breakpoint_file(resolved_name, line_num TSRMLS_CC); } else { - printf("%sNo line specified in expression %s%s\n", PHPDBG_RED_LINE(TSRMLS_C), expr, PHPDBG_END_LINE(TSRMLS_C)); - return FAILURE; - } - } else { - char *class; - char *func; - - size_t func_len = strlen(func_pos+1), - class_len = (line_pos - expr); - - if (func_len) { - class = emalloc(class_len+1); - func = emalloc(func_len+1); - - memcpy(class, expr, class_len); - class[class_len]='\0'; - memcpy(func, func_pos+1, func_len); - func[func_len]='\0'; - - phpdbg_set_breakpoint_method(class, class_len, func, func_len TSRMLS_CC); - } else { - printf("%sNo function found in method expression %s%s\n", PHPDBG_RED_LINE(TSRMLS_C), expr, PHPDBG_END_LINE(TSRMLS_C)); + printf("%sNo line specified in expression %s%s\n", + PHPDBG_RED_LINE(TSRMLS_C), expr, PHPDBG_END_LINE(TSRMLS_C)); return FAILURE; } - } + } } else { + /* break 0xc0ffee */ if (phpdbg_is_addr(expr)) { zend_ulong opline = strtoul(expr, 0, 16); phpdbg_set_breakpoint_opline(opline TSRMLS_CC); } else if (phpdbg_is_numeric(expr)) { + /* break 1337 */ const char *filename = zend_get_executed_filename(TSRMLS_C); long line_num = strtol(expr, NULL, 0); @@ -398,6 +387,7 @@ static PHPDBG_COMMAND(break) /* {{{ */ phpdbg_set_breakpoint_file(filename, line_num TSRMLS_CC); } else { + /* break symbol */ char name[200]; size_t name_len = strlen(expr); diff --git a/phpdbg_utils.c b/phpdbg_utils.c index 9e39010ea04..cb864c087ca 100644 --- a/phpdbg_utils.c +++ b/phpdbg_utils.c @@ -17,7 +17,9 @@ +----------------------------------------------------------------------+ */ +#include #include +#include "zend_alloc.h" #include "phpdbg_utils.h" int phpdbg_is_numeric(const char *str) /* {{{ */ @@ -46,3 +48,23 @@ int phpdbg_is_addr(const char *str) /* {{{ */ { return str[0] && str[1] && memcmp(str, "0x", 2) == 0; } /* }}} */ + +int phpdbg_is_class_method(const char *str, size_t len, char **class, char **method) /* {{{ */ +{ + const char *sep = strstr(str, "::"); + size_t class_len, method_len; + + if (!sep) { + return 0; + } + + class_len = sep - str; + method_len = len - ((sep+2) - str); + + *class = estrndup(str, class_len); + class[class_len] = 0; + + *method = estrndup(sep+2, method_len+1); + + return 1; +} /* }}} */ diff --git a/phpdbg_utils.h b/phpdbg_utils.h index 464a0c7f900..d56e5047914 100644 --- a/phpdbg_utils.h +++ b/phpdbg_utils.h @@ -23,5 +23,6 @@ int phpdbg_is_numeric(const char*); int phpdbg_is_empty(const char*); int phpdbg_is_addr(const char*); +int phpdbg_is_class_method(const char*, size_t, char**, char**); #endif /* PHPDBG_UTILS_H */ From 2e14649c92fa441eb940093d68cd54ec2919b174 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Tue, 12 Nov 2013 11:39:02 -0200 Subject: [PATCH 161/771] - Added check for malformed class::method syntax --- phpdbg_utils.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpdbg_utils.c b/phpdbg_utils.c index cb864c087ca..b509900912d 100644 --- a/phpdbg_utils.c +++ b/phpdbg_utils.c @@ -54,7 +54,7 @@ int phpdbg_is_class_method(const char *str, size_t len, char **class, char **met const char *sep = strstr(str, "::"); size_t class_len, method_len; - if (!sep) { + if (!sep || sep == str || sep+2 == str+len-1) { return 0; } From 5a3285ae99e03ce9a7d8003dc795553cc8ef389d Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Tue, 12 Nov 2013 11:44:36 -0200 Subject: [PATCH 162/771] - Cosmetic change --- phpdbg_utils.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/phpdbg_utils.h b/phpdbg_utils.h index d56e5047914..f4eda3f18cb 100644 --- a/phpdbg_utils.h +++ b/phpdbg_utils.h @@ -20,6 +20,9 @@ #ifndef PHPDBG_UTILS_H #define PHPDBG_UTILS_H +/** + * Input scan functions + */ int phpdbg_is_numeric(const char*); int phpdbg_is_empty(const char*); int phpdbg_is_addr(const char*); From edbb1313a1f3f6ecae11a0d120db3c2f4c381f00 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Tue, 12 Nov 2013 13:10:29 -0200 Subject: [PATCH 163/771] - Simplify code --- phpdbg_utils.c | 10 +++------- test.php | 2 +- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/phpdbg_utils.c b/phpdbg_utils.c index b509900912d..4ad75acd104 100644 --- a/phpdbg_utils.c +++ b/phpdbg_utils.c @@ -52,19 +52,15 @@ int phpdbg_is_addr(const char *str) /* {{{ */ int phpdbg_is_class_method(const char *str, size_t len, char **class, char **method) /* {{{ */ { const char *sep = strstr(str, "::"); - size_t class_len, method_len; if (!sep || sep == str || sep+2 == str+len-1) { return 0; } - class_len = sep - str; - method_len = len - ((sep+2) - str); + *class = estrndup(str, sep - str); + class[sep - str] = 0; - *class = estrndup(str, class_len); - class[class_len] = 0; - - *method = estrndup(sep+2, method_len+1); + *method = estrndup(sep+2, str + len - sep); return 1; } /* }}} */ diff --git a/test.php b/test.php index 06e855bfd3f..457e487db70 100644 --- a/test.php +++ b/test.php @@ -13,6 +13,6 @@ function test2() { $my = new my(); var_dump($my->method()); -phpdbg_break(); + return true; ?> From 9c37190876e58e8209c59cbed08b672599c6b164 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Tue, 12 Nov 2013 13:17:24 -0200 Subject: [PATCH 164/771] - Fix allocation size --- phpdbg_utils.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/phpdbg_utils.c b/phpdbg_utils.c index 4ad75acd104..e8a5dc63470 100644 --- a/phpdbg_utils.c +++ b/phpdbg_utils.c @@ -19,7 +19,7 @@ #include #include -#include "zend_alloc.h" +#include "zend.h" #include "phpdbg_utils.h" int phpdbg_is_numeric(const char *str) /* {{{ */ @@ -60,7 +60,7 @@ int phpdbg_is_class_method(const char *str, size_t len, char **class, char **met *class = estrndup(str, sep - str); class[sep - str] = 0; - *method = estrndup(sep+2, str + len - sep); + *method = estrndup(sep+2, str + len - (sep + 2)); return 1; } /* }}} */ From 803303057a4bf6353a2c760d9b42aa956b7ebb32 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 15:51:30 +0000 Subject: [PATCH 165/771] fix output from print command to show all breakpoints --- phpdbg_prompt.c | 58 +++++++++++++++++++++++++++++++++---------------- 1 file changed, 39 insertions(+), 19 deletions(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index f93a3447204..7ec8401420f 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -271,7 +271,7 @@ static PHPDBG_COMMAND(print) /* {{{ */ zend_llist *points; printf("--------------------------------------\n"); - printf("File Break Point Information:\n"); + printf("File Breakpoints:\n"); for (zend_hash_internal_pointer_reset_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE], &position); zend_hash_get_current_data_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE], (void**) &points, &position) == SUCCESS; zend_hash_move_forward_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE], &position)) { @@ -279,47 +279,67 @@ static PHPDBG_COMMAND(print) /* {{{ */ phpdbg_breakfile_t *brake; if ((brake = zend_llist_get_first_ex(points, &lposition))) { - printf("%s:\n", brake->filename); do { - printf("\t%lu\n", brake->line); + printf("#%d\t\t%s:%lu\n", brake->id, brake->filename, brake->line); } while ((brake = zend_llist_get_next_ex(points, &lposition))); } } } -#if 0 - if (PHPDBG_G(has_sym_bp)) { + if ((PHPDBG_G(flags) & PHPDBG_HAS_SYM_BP)) { HashPosition position; - zend_llist *points; + phpdbg_breaksymbol_t *brake; printf("--------------------------------------\n"); - printf("Symbol Break Point Information:\n"); + printf("Function Breakpoints:\n"); for (zend_hash_internal_pointer_reset_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM], &position); - zend_hash_get_current_data_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM], (void**) &points, &position) == SUCCESS; + zend_hash_get_current_data_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM], (void**) &brake, &position) == SUCCESS; zend_hash_move_forward_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM], &position)) { - zend_llist_position lposition; - phpdbg_breaksymbol_t *brake; - - if ((brake = zend_llist_get_first_ex(points, &lposition))) { - printf("%s:\n", brake->symbol); - do { - printf("\t%d\n", brake->id); - } while ((brake = zend_llist_get_next_ex(points, &lposition))); + printf( + "#%d\t\t%s\n", brake->id, brake->symbol); + } + } + + if ((PHPDBG_G(flags) & PHPDBG_HAS_METHOD_BP)) { + HashPosition position[2]; + HashTable *class_table; + char *class_name = NULL; + zend_uint class_len = 0; + zend_ulong class_idx = 0L; + + printf("--------------------------------------\n"); + printf("Method Breakpoints:\n"); + for (zend_hash_internal_pointer_reset_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], &position[0]); + zend_hash_get_current_data_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], (void**) &class_table, &position[0]) == SUCCESS; + zend_hash_move_forward_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], &position[0])) { + + if (zend_hash_get_current_key_ex( + &PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], + &class_name, &class_len, &class_idx, 0, &position[0]) == HASH_KEY_IS_STRING) { + + phpdbg_breakmethod_t *brake; + + for (zend_hash_internal_pointer_reset_ex(class_table, &position[1]); + zend_hash_get_current_data_ex(class_table, (void**)&brake, &position[1]) == SUCCESS; + zend_hash_move_forward_ex(class_table, &position[1])) { + printf( + "#%d\t\t%s::%s\n", brake->id, brake->class_name, brake->func_name); + } } + } } -#endif if ((PHPDBG_G(flags) & PHPDBG_HAS_OPLINE_BP)) { HashPosition position; phpdbg_breakline_t *brake; printf("--------------------------------------\n"); - printf("Opline Break Point Information:\n"); + printf("Opline Breakpoints:\n"); for (zend_hash_internal_pointer_reset_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], &position); zend_hash_get_current_data_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], (void**) &brake, &position) == SUCCESS; zend_hash_move_forward_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], &position)) { - printf("#%d\t%s\n", brake->id, brake->name); + printf("#%d\t\t%p\n", brake->id, brake->opline); } } From c43d5a558f8c4b73d319b6d65ddfc7f1bd3924ec Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 16:04:41 +0000 Subject: [PATCH 166/771] ... --- phpdbg.h | 5 ++- phpdbg_bp.c | 82 ++++++++++++++++++++++++++++++++++++++++++++++++ phpdbg_bp.h | 1 + phpdbg_prompt.c | 83 ++++--------------------------------------------- 4 files changed, 93 insertions(+), 78 deletions(-) diff --git a/phpdbg.h b/phpdbg.h index 83b93fe912a..f76e8377ace 100644 --- a/phpdbg.h +++ b/phpdbg.h @@ -109,6 +109,9 @@ ZEND_END_MODULE_GLOBALS(phpdbg) #define PHPDBG_END_LINE(TSRMLS_D) \ ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "]\033[0m" : "]") #define PHPDBG_PROMPT_LINE(TSRMLS_D) \ - ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[1;64mphpdbg>\033[0m " : "phpdbg> ") /* }}} */ + ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[1;64mphpdbg>\033[0m " : "phpdbg> ") +#define PHPDBG_SEP_LINE(TSRMLS_D) do {\ + printf("%s--------------------------------------%s\n", PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C));\ + } while(0) /* }}} */ #endif /* PHPDBG_H */ diff --git a/phpdbg_bp.c b/phpdbg_bp.c index 43f5fa7882e..4e23add761c 100644 --- a/phpdbg_bp.c +++ b/phpdbg_bp.c @@ -309,3 +309,85 @@ void phpdbg_clear_breakpoints(TSRMLS_D) /* {{{ */ PHPDBG_G(bp_count) = 0; } /* }}} */ +void phpdbg_print_breakpoints(zend_ulong type TSRMLS_DC) /* {{{ */ +{ + switch (type) { + case PHPDBG_BREAK_SYM: if ((PHPDBG_G(flags) & PHPDBG_HAS_SYM_BP)) { + HashPosition position; + phpdbg_breaksymbol_t *brake; + + PHPDBG_SEP_LINE(TSRMLS_C); + printf("Function Breakpoints:\n"); + for (zend_hash_internal_pointer_reset_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM], &position); + zend_hash_get_current_data_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM], (void**) &brake, &position) == SUCCESS; + zend_hash_move_forward_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM], &position)) { + printf( + "#%d\t\t%s\n", brake->id, brake->symbol); + } + } break; + + case PHPDBG_BREAK_METHOD: if ((PHPDBG_G(flags) & PHPDBG_HAS_METHOD_BP)) { + HashPosition position[2]; + HashTable *class_table; + char *class_name = NULL; + zend_uint class_len = 0; + zend_ulong class_idx = 0L; + + PHPDBG_SEP_LINE(TSRMLS_C); + printf("Method Breakpoints:\n"); + for (zend_hash_internal_pointer_reset_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], &position[0]); + zend_hash_get_current_data_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], (void**) &class_table, &position[0]) == SUCCESS; + zend_hash_move_forward_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], &position[0])) { + + if (zend_hash_get_current_key_ex( + &PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], + &class_name, &class_len, &class_idx, 0, &position[0]) == HASH_KEY_IS_STRING) { + + phpdbg_breakmethod_t *brake; + + for (zend_hash_internal_pointer_reset_ex(class_table, &position[1]); + zend_hash_get_current_data_ex(class_table, (void**)&brake, &position[1]) == SUCCESS; + zend_hash_move_forward_ex(class_table, &position[1])) { + printf( + "#%d\t\t%s::%s\n", brake->id, brake->class_name, brake->func_name); + } + } + + } + } break; + + case PHPDBG_BREAK_FILE: if ((PHPDBG_G(flags) & PHPDBG_HAS_FILE_BP)) { + HashPosition position; + zend_llist *points; + + PHPDBG_SEP_LINE(TSRMLS_C); + printf("File Breakpoints:\n"); + for (zend_hash_internal_pointer_reset_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE], &position); + zend_hash_get_current_data_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE], (void**) &points, &position) == SUCCESS; + zend_hash_move_forward_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE], &position)) { + zend_llist_position lposition; + phpdbg_breakfile_t *brake; + + if ((brake = zend_llist_get_first_ex(points, &lposition))) { + do { + printf("#%d\t\t%s:%lu\n", brake->id, brake->filename, brake->line); + } while ((brake = zend_llist_get_next_ex(points, &lposition))); + } + } + } break; + + case PHPDBG_BREAK_OPLINE: if ((PHPDBG_G(flags) & PHPDBG_HAS_OPLINE_BP)) { + HashPosition position; + phpdbg_breakline_t *brake; + + PHPDBG_SEP_LINE(TSRMLS_C); + printf("Opline Breakpoints:\n"); + for (zend_hash_internal_pointer_reset_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], &position); + zend_hash_get_current_data_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], (void**) &brake, &position) == SUCCESS; + zend_hash_move_forward_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], &position)) { + printf("#%d\t\t%p\n", brake->id, brake->opline); + } + } break; + } +} /* }}} */ + diff --git a/phpdbg_bp.h b/phpdbg_bp.h index 61d5004bf99..d6167597f49 100644 --- a/phpdbg_bp.h +++ b/phpdbg_bp.h @@ -72,5 +72,6 @@ int phpdbg_find_breakpoint_method(zend_op_array* TSRMLS_DC); int phpdbg_find_breakpoint_opline(phpdbg_opline_ptr_t TSRMLS_DC); void phpdbg_clear_breakpoints(TSRMLS_D); +void phpdbg_print_breakpoints(zend_ulong type TSRMLS_DC); #endif /* PHPDBG_BP_H */ diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 7ec8401420f..9fd03b986c4 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -236,7 +236,7 @@ static PHPDBG_COMMAND(print) /* {{{ */ return SUCCESS; } - printf("--------------------------------------\n"); + PHPDBG_SEP_LINE(TSRMLS_C); printf("Execution Context Information:\n"); #ifdef HAVE_LIBREADLINE printf("Readline\tyes\n"); @@ -266,84 +266,13 @@ static PHPDBG_COMMAND(print) /* {{{ */ printf("Constants\t%d\n", zend_hash_num_elements(EG(zend_constants))); printf("Included\t%d\n", zend_hash_num_elements(&EG(included_files))); - if ((PHPDBG_G(flags) & PHPDBG_HAS_FILE_BP)) { - HashPosition position; - zend_llist *points; - - printf("--------------------------------------\n"); - printf("File Breakpoints:\n"); - for (zend_hash_internal_pointer_reset_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE], &position); - zend_hash_get_current_data_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE], (void**) &points, &position) == SUCCESS; - zend_hash_move_forward_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE], &position)) { - zend_llist_position lposition; - phpdbg_breakfile_t *brake; - - if ((brake = zend_llist_get_first_ex(points, &lposition))) { - do { - printf("#%d\t\t%s:%lu\n", brake->id, brake->filename, brake->line); - } while ((brake = zend_llist_get_next_ex(points, &lposition))); - } - } - } + phpdbg_print_breakpoints(PHPDBG_BREAK_FILE TSRMLS_CC); + phpdbg_print_breakpoints(PHPDBG_BREAK_SYM TSRMLS_CC); + phpdbg_print_breakpoints(PHPDBG_BREAK_METHOD TSRMLS_CC); + phpdbg_print_breakpoints(PHPDBG_BREAK_OPLINE TSRMLS_CC); - if ((PHPDBG_G(flags) & PHPDBG_HAS_SYM_BP)) { - HashPosition position; - phpdbg_breaksymbol_t *brake; - - printf("--------------------------------------\n"); - printf("Function Breakpoints:\n"); - for (zend_hash_internal_pointer_reset_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM], &position); - zend_hash_get_current_data_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM], (void**) &brake, &position) == SUCCESS; - zend_hash_move_forward_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM], &position)) { - printf( - "#%d\t\t%s\n", brake->id, brake->symbol); - } - } + PHPDBG_SEP_LINE(TSRMLS_C); - if ((PHPDBG_G(flags) & PHPDBG_HAS_METHOD_BP)) { - HashPosition position[2]; - HashTable *class_table; - char *class_name = NULL; - zend_uint class_len = 0; - zend_ulong class_idx = 0L; - - printf("--------------------------------------\n"); - printf("Method Breakpoints:\n"); - for (zend_hash_internal_pointer_reset_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], &position[0]); - zend_hash_get_current_data_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], (void**) &class_table, &position[0]) == SUCCESS; - zend_hash_move_forward_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], &position[0])) { - - if (zend_hash_get_current_key_ex( - &PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], - &class_name, &class_len, &class_idx, 0, &position[0]) == HASH_KEY_IS_STRING) { - - phpdbg_breakmethod_t *brake; - - for (zend_hash_internal_pointer_reset_ex(class_table, &position[1]); - zend_hash_get_current_data_ex(class_table, (void**)&brake, &position[1]) == SUCCESS; - zend_hash_move_forward_ex(class_table, &position[1])) { - printf( - "#%d\t\t%s::%s\n", brake->id, brake->class_name, brake->func_name); - } - } - - } - } - - if ((PHPDBG_G(flags) & PHPDBG_HAS_OPLINE_BP)) { - HashPosition position; - phpdbg_breakline_t *brake; - - printf("--------------------------------------\n"); - printf("Opline Breakpoints:\n"); - for (zend_hash_internal_pointer_reset_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], &position); - zend_hash_get_current_data_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], (void**) &brake, &position) == SUCCESS; - zend_hash_move_forward_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], &position)) { - printf("#%d\t\t%p\n", brake->id, brake->opline); - } - } - - printf("--------------------------------------\n"); return SUCCESS; } /* }}} */ From b6f5b64c6128a03f341ae991caeb66bfadead0d6 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 16:07:59 +0000 Subject: [PATCH 167/771] ... --- phpdbg_help.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/phpdbg_help.c b/phpdbg_help.c index 1a78c6928a9..476996535f9 100644 --- a/phpdbg_help.c +++ b/phpdbg_help.c @@ -88,11 +88,8 @@ PHPDBG_HELP(eval) /* {{{ */ PHPDBG_HELP(break) /* {{{ */ { - printf("Setting a breakpoint stops execution at a specific stage, the syntax is:\n"); - printf("\tfile:line\n"); - printf("\tfunction\n"); - printf("\t\\my\\class::method\n"); - printf("\t0x16\n"); + printf("Setting a breakpoint stops execution at a specific stage.\n"); + printf("\n"); printf("For example:\n"); printf("\t%sbreak test.php:1\n", PHPDBG_PROMPT_LINE(TSRMLS_C)); printf("Will break execution on line 1 of test.php\n"); @@ -102,6 +99,8 @@ PHPDBG_HELP(break) /* {{{ */ printf("Will break execution on entry to \\my\\class::method\n"); printf("\t%sbreak 0x7ff68f570e08\n", PHPDBG_PROMPT_LINE(TSRMLS_C)); printf("Will break at the opline with the address provided (addresses are shown during execution)\n"); + printf("\t%sbreak 200\n", PHPDBG_PROMPT_LINE(TSRMLS_C)); + printf("Will break at line 200 of the currently executing file\n"); printf("It is important to note, an address is only valid for the current compiled representation of the script\n"); printf("If you have to clean the environment and recompile then your opline break points will be invalid\n"); return SUCCESS; From 6b3b14e8ddb86e7f5051c95911ff7d6ca1f7ce11 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 16:13:14 +0000 Subject: [PATCH 168/771] ... --- phpdbg.h | 2 +- phpdbg_help.c | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/phpdbg.h b/phpdbg.h index f76e8377ace..af4a76f384d 100644 --- a/phpdbg.h +++ b/phpdbg.h @@ -112,6 +112,6 @@ ZEND_END_MODULE_GLOBALS(phpdbg) ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[1;64mphpdbg>\033[0m " : "phpdbg> ") #define PHPDBG_SEP_LINE(TSRMLS_D) do {\ printf("%s--------------------------------------%s\n", PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C));\ - } while(0) /* }}} */ + } while(0) /* }}} */ #endif /* PHPDBG_H */ diff --git a/phpdbg_help.c b/phpdbg_help.c index 476996535f9..8f8da951aa8 100644 --- a/phpdbg_help.c +++ b/phpdbg_help.c @@ -89,7 +89,6 @@ PHPDBG_HELP(eval) /* {{{ */ PHPDBG_HELP(break) /* {{{ */ { printf("Setting a breakpoint stops execution at a specific stage.\n"); - printf("\n"); printf("For example:\n"); printf("\t%sbreak test.php:1\n", PHPDBG_PROMPT_LINE(TSRMLS_C)); printf("Will break execution on line 1 of test.php\n"); From e8cb646fed5709f124d5b6674e71d1a36043b16c Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Tue, 12 Nov 2013 16:53:48 -0200 Subject: [PATCH 169/771] - Fix compiler warning --- phpdbg_bp.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/phpdbg_bp.c b/phpdbg_bp.c index 4e23add761c..26cb6862351 100644 --- a/phpdbg_bp.c +++ b/phpdbg_bp.c @@ -325,26 +325,26 @@ void phpdbg_print_breakpoints(zend_ulong type TSRMLS_DC) /* {{{ */ "#%d\t\t%s\n", brake->id, brake->symbol); } } break; - + case PHPDBG_BREAK_METHOD: if ((PHPDBG_G(flags) & PHPDBG_HAS_METHOD_BP)) { HashPosition position[2]; HashTable *class_table; char *class_name = NULL; zend_uint class_len = 0; zend_ulong class_idx = 0L; - + PHPDBG_SEP_LINE(TSRMLS_C); printf("Method Breakpoints:\n"); for (zend_hash_internal_pointer_reset_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], &position[0]); zend_hash_get_current_data_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], (void**) &class_table, &position[0]) == SUCCESS; zend_hash_move_forward_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], &position[0])) { - + if (zend_hash_get_current_key_ex( - &PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], + &PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], &class_name, &class_len, &class_idx, 0, &position[0]) == HASH_KEY_IS_STRING) { - + phpdbg_breakmethod_t *brake; - + for (zend_hash_internal_pointer_reset_ex(class_table, &position[1]); zend_hash_get_current_data_ex(class_table, (void**)&brake, &position[1]) == SUCCESS; zend_hash_move_forward_ex(class_table, &position[1])) { @@ -352,10 +352,10 @@ void phpdbg_print_breakpoints(zend_ulong type TSRMLS_DC) /* {{{ */ "#%d\t\t%s::%s\n", brake->id, brake->class_name, brake->func_name); } } - + } } break; - + case PHPDBG_BREAK_FILE: if ((PHPDBG_G(flags) & PHPDBG_HAS_FILE_BP)) { HashPosition position; zend_llist *points; @@ -375,7 +375,7 @@ void phpdbg_print_breakpoints(zend_ulong type TSRMLS_DC) /* {{{ */ } } } break; - + case PHPDBG_BREAK_OPLINE: if ((PHPDBG_G(flags) & PHPDBG_HAS_OPLINE_BP)) { HashPosition position; phpdbg_breakline_t *brake; @@ -385,7 +385,7 @@ void phpdbg_print_breakpoints(zend_ulong type TSRMLS_DC) /* {{{ */ for (zend_hash_internal_pointer_reset_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], &position); zend_hash_get_current_data_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], (void**) &brake, &position) == SUCCESS; zend_hash_move_forward_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], &position)) { - printf("#%d\t\t%p\n", brake->id, brake->opline); + printf("#%d\t\t%#lx\n", brake->id, brake->opline); } } break; } From bbd523e5cbb4d841b17d6888ab33e348e377034e Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Tue, 12 Nov 2013 19:40:15 -0200 Subject: [PATCH 170/771] - Cosmetic --- phpdbg.c | 58 ++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 35 insertions(+), 23 deletions(-) diff --git a/phpdbg.c b/phpdbg.c index bd756eef67e..4e6236f70d6 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -96,7 +96,8 @@ static PHP_RSHUTDOWN_FUNCTION(phpdbg) /* {{{ */ static PHP_FUNCTION(phpdbg_break) { if (EG(current_execute_data) && EG(active_op_array)) { - zend_ulong opline_num = (EG(current_execute_data)->opline - EG(active_op_array)->opcodes); + zend_ulong opline_num = (EG(current_execute_data)->opline - + EG(active_op_array)->opcodes); phpdbg_set_breakpoint_opline_ex( &EG(active_op_array)->opcodes[opline_num+1] TSRMLS_CC); @@ -144,7 +145,8 @@ static inline int php_sapi_phpdbg_module_startup(sapi_module_struct *module) /* return SUCCESS; } /* }}} */ -static char* php_sapi_phpdbg_read_cookies(TSRMLS_D) { /* {{{ */ +static char* php_sapi_phpdbg_read_cookies(TSRMLS_D) /* {{{ */ +{ return NULL; } /* }}} */ @@ -195,24 +197,33 @@ static void php_sapi_phpdbg_register_vars(zval *track_vars_array TSRMLS_DC) /* { if (PHPDBG_G(exec)) { len = PHPDBG_G(exec_len); - if (sapi_module.input_filter(PARSE_SERVER, "PHP_SELF", &PHPDBG_G(exec), PHPDBG_G(exec_len), &len TSRMLS_CC)) { - php_register_variable("PHP_SELF", PHPDBG_G(exec), track_vars_array TSRMLS_CC); + if (sapi_module.input_filter(PARSE_SERVER, "PHP_SELF", + &PHPDBG_G(exec), PHPDBG_G(exec_len), &len TSRMLS_CC)) { + php_register_variable("PHP_SELF", PHPDBG_G(exec), + track_vars_array TSRMLS_CC); } - if (sapi_module.input_filter(PARSE_SERVER, "SCRIPT_NAME", &PHPDBG_G(exec), PHPDBG_G(exec_len), &len TSRMLS_CC)) { - php_register_variable("SCRIPT_NAME", PHPDBG_G(exec), track_vars_array TSRMLS_CC); + if (sapi_module.input_filter(PARSE_SERVER, "SCRIPT_NAME", + &PHPDBG_G(exec), PHPDBG_G(exec_len), &len TSRMLS_CC)) { + php_register_variable("SCRIPT_NAME", PHPDBG_G(exec), + track_vars_array TSRMLS_CC); } - if (sapi_module.input_filter(PARSE_SERVER, "SCRIPT_FILENAME", &PHPDBG_G(exec), PHPDBG_G(exec_len), &len TSRMLS_CC)) { - php_register_variable("SCRIPT_FILENAME", PHPDBG_G(exec), track_vars_array TSRMLS_CC); + if (sapi_module.input_filter(PARSE_SERVER, "SCRIPT_FILENAME", + &PHPDBG_G(exec), PHPDBG_G(exec_len), &len TSRMLS_CC)) { + php_register_variable("SCRIPT_FILENAME", PHPDBG_G(exec), + track_vars_array TSRMLS_CC); } - if (sapi_module.input_filter(PARSE_SERVER, "PATH_TRANSLATED", &PHPDBG_G(exec), PHPDBG_G(exec_len), &len TSRMLS_CC)) { - php_register_variable("PATH_TRANSLATED", PHPDBG_G(exec), track_vars_array TSRMLS_CC); + if (sapi_module.input_filter(PARSE_SERVER, "PATH_TRANSLATED", + &PHPDBG_G(exec), PHPDBG_G(exec_len), &len TSRMLS_CC)) { + php_register_variable("PATH_TRANSLATED", PHPDBG_G(exec), + track_vars_array TSRMLS_CC); } } /* any old docroot will doo */ len = 0U; - if (sapi_module.input_filter(PARSE_SERVER, "DOCUMENT_ROOT", &docroot, len, &len TSRMLS_CC)) { + if (sapi_module.input_filter(PARSE_SERVER, "DOCUMENT_ROOT", + &docroot, len, &len TSRMLS_CC)) { php_register_variable("DOCUMENT_ROOT", docroot, track_vars_array TSRMLS_CC); } } @@ -253,16 +264,16 @@ static sapi_module_struct phpdbg_sapi_module = { /* }}} */ const opt_struct OPTIONS[] = { /* {{{ */ - {'c', 1, "ini path override"}, - {'d', 1, "define ini entry on command line"}, - {'n', 0, "no php.ini"}, - {'z', 1, "load zend_extension"}, - /* phpdbg options */ - {'e', 1, "exec"}, - {'v', 0, "verbose"}, - {'s', 0, "step"}, - {'b', 0, "boring colours"}, - {'-', 0, NULL} + {'c', 1, "ini path override"}, + {'d', 1, "define ini entry on command line"}, + {'n', 0, "no php.ini"}, + {'z', 1, "load zend_extension"}, + /* phpdbg options */ + {'e', 1, "exec"}, + {'v', 0, "verbose"}, + {'s', 0, "step"}, + {'b', 0, "boring colours"}, + {'-', 0, NULL} }; /* }}} */ const char phpdbg_ini_hardcoded[] = @@ -280,13 +291,14 @@ const char phpdbg_ini_hardcoded[] = ZVAL_STRINGL(&tmp, zend_strndup(value, sizeof(value)-1), sizeof(value)-1, 0);\ zend_hash_update(configuration_hash, name, sizeof(name), &tmp, sizeof(zval), NULL);\ -void phpdbg_ini_defaults(HashTable *configuration_hash) { /* {{{ */ +void phpdbg_ini_defaults(HashTable *configuration_hash) /* {{{ */ +{ zval tmp; INI_DEFAULT("report_zend_debug", "0"); INI_DEFAULT("display_errors", "1"); } /* }}} */ -int main(int argc, char *argv[]) /* {{{ */ +int main(int argc, char **argv) /* {{{ */ { sapi_module_struct *phpdbg = &phpdbg_sapi_module; char *ini_entries = NULL; From 27f640d87911eacc829a22445d473e170f307080 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Tue, 12 Nov 2013 20:39:39 -0200 Subject: [PATCH 171/771] - Added phpdbg_notice() and phpdbg_error() --- phpdbg.c | 13 ++-- phpdbg.h | 6 +- phpdbg_bp.c | 74 +++++++--------------- phpdbg_print.c | 7 +-- phpdbg_prompt.c | 159 +++++++++++++++++------------------------------- phpdbg_utils.c | 31 ++++++++++ phpdbg_utils.h | 15 +++++ 7 files changed, 135 insertions(+), 170 deletions(-) diff --git a/phpdbg.c b/phpdbg.c index 4e6236f70d6..0cc5d2bcdb4 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -19,6 +19,7 @@ #include "phpdbg.h" #include "phpdbg_prompt.h" #include "phpdbg_bp.h" +#include "phpdbg_utils.h" ZEND_DECLARE_MODULE_GLOBALS(phpdbg); @@ -440,14 +441,10 @@ int main(int argc, char **argv) /* {{{ */ } zend_end_try(); /* print blurb */ - printf( - "%sWelcome to phpdbg, the interactive PHP debugger, v%s%s\n", - PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_VERSION, PHPDBG_END_LINE(TSRMLS_C)); - printf( - "[To get help using phpdbg type \"help\" and press enter\n"); - printf( - "%sPlease report bugs to <%s>%s\n", - PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_ISSUES, PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_notice("Welcome to phpdbg, the interactive PHP debugger, v%s", + PHPDBG_VERSION); + printf("[To get help using phpdbg type \"help\" and press enter\n"); + phpdbg_notice("Please report bugs to <%s>", PHPDBG_ISSUES); do { zend_try { diff --git a/phpdbg.h b/phpdbg.h index af4a76f384d..9826c8bb940 100644 --- a/phpdbg.h +++ b/phpdbg.h @@ -64,7 +64,7 @@ #define PHPDBG_BREAK_FILE 0 #define PHPDBG_BREAK_SYM 1 #define PHPDBG_BREAK_OPLINE 2 -#define PHPDBG_BREAK_METHOD 3 +#define PHPDBG_BREAK_METHOD 3 #define PHPDBG_BREAK_TABLES 4 /* }}} */ /* {{{ flags */ @@ -77,7 +77,7 @@ #define PHPDBG_IS_STEPPING 0x00010000 #define PHPDBG_IS_QUIET 0x00100000 #define PHPDBG_IS_QUITTING 0x01000000 -#define PHPDBG_IS_COLOURED 0x10000000 +#define PHPDBG_IS_COLOURED 0x10000000 #define PHPDBG_DEFAULT_FLAGS (PHPDBG_IS_QUIET|PHPDBG_IS_COLOURED) /* }}} */ @@ -107,7 +107,7 @@ ZEND_END_MODULE_GLOBALS(phpdbg) #define PHPDBG_BOLD_LINE(TSRMLS_D) \ ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[1;64m[" : "[") #define PHPDBG_END_LINE(TSRMLS_D) \ - ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "]\033[0m" : "]") + ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "]\033[0m" : "]") #define PHPDBG_PROMPT_LINE(TSRMLS_D) \ ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[1;64mphpdbg>\033[0m " : "phpdbg> ") #define PHPDBG_SEP_LINE(TSRMLS_D) do {\ diff --git a/phpdbg_bp.c b/phpdbg_bp.c index 26cb6862351..f4b3d8ffb17 100644 --- a/phpdbg_bp.c +++ b/phpdbg_bp.c @@ -22,6 +22,7 @@ #include "zend_llist.h" #include "phpdbg.h" #include "phpdbg_bp.h" +#include "phpdbg_utils.h" ZEND_EXTERN_MODULE_GLOBALS(phpdbg); @@ -67,11 +68,8 @@ void phpdbg_set_breakpoint_file(const char *path, long line_num TSRMLS_DC) /* {{ new_break.id = PHPDBG_G(bp_count)++; zend_llist_add_element(break_files_ptr, &new_break); - printf( - "%sBreakpoint #%d added at %s:%ld%s\n", - PHPDBG_BOLD_LINE(TSRMLS_C), - new_break.id, new_break.filename, new_break.line, - PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_notice("Breakpoint #%d added at %s:%ld", + new_break.id, new_break.filename, new_break.line); } /* }}} */ void phpdbg_set_breakpoint_symbol(const char *name TSRMLS_DC) /* {{{ */ @@ -89,15 +87,10 @@ void phpdbg_set_breakpoint_symbol(const char *name TSRMLS_DC) /* {{{ */ zend_hash_update(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM], new_break.symbol, name_len, &new_break, sizeof(phpdbg_breaksymbol_t), NULL); - printf( - "%sBreakpoint #%d added at %s%s\n", - PHPDBG_BOLD_LINE(TSRMLS_C), - new_break.id, new_break.symbol, - PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_notice("Breakpoint #%d added at %s", + new_break.id, new_break.symbol); } else { - printf( - "%sBreakpoint exists at %s%s\n", - PHPDBG_BOLD_LINE(TSRMLS_C), name, PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_notice("Breakpoint exists at %s", name); } } /* }}} */ @@ -130,17 +123,10 @@ void phpdbg_set_breakpoint_method(const char* class_name, const char* func_name zend_hash_update(class_table, func_name, func_len, &new_break, sizeof(phpdbg_breakmethod_t), NULL); - printf( - "%sBreakpoint #%d added at %s::%s%s\n", - PHPDBG_BOLD_LINE(TSRMLS_C), - new_break.id, class_name, func_name, - PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_notice("Breakpoint #%d added at %s::%s", + new_break.id, class_name, func_name); } else { - printf( - "%sBreakpoint exists at %s::%s%s\n", - PHPDBG_BOLD_LINE(TSRMLS_C), - class_name, func_name, - PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_notice("Breakpoint exists at %s::%s", class_name, func_name); } } /* }}} */ @@ -157,14 +143,10 @@ void phpdbg_set_breakpoint_opline(zend_ulong opline TSRMLS_DC) /* {{{ */ zend_hash_index_update(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], opline, &new_break, sizeof(phpdbg_breakline_t), NULL); - printf("%sBreakpoint #%d added at %#lx%s\n", - PHPDBG_BOLD_LINE(TSRMLS_C), - new_break.id, new_break.opline, - PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_notice("Breakpoint #%d added at %#lx%s", + new_break.id, new_break.opline); } else { - printf( - "%sBreakpoint exists at %#lx%s\n", - PHPDBG_BOLD_LINE(TSRMLS_C), opline, PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_notice("Breakpoint exists at %#lx", opline); } } /* }}} */ @@ -180,11 +162,8 @@ void phpdbg_set_breakpoint_opline_ex(phpdbg_opline_ptr_t opline TSRMLS_DC) /* {{ zend_hash_index_update(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], (zend_ulong) opline, &new_break, sizeof(phpdbg_breakline_t), NULL); - printf( - "%sBreakpoint #%d added at %#lx%s\n", - PHPDBG_BOLD_LINE(TSRMLS_C), - new_break.id, new_break.opline, - PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_notice("Breakpoint #%d added at %#lx", + new_break.id, new_break.opline); } } /* }}} */ @@ -203,10 +182,8 @@ int phpdbg_find_breakpoint_file(zend_op_array *op_array TSRMLS_DC) /* {{{ */ const phpdbg_breakfile_t *bp = (phpdbg_breakfile_t*)le->data; if (bp->line == (*EG(opline_ptr))->lineno) { - printf("%sBreakpoint #%d at %s:%ld%s\n", - PHPDBG_BOLD_LINE(TSRMLS_C), - bp->id, bp->filename, bp->line, - PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_notice("Breakpoint #%d at %s:%ld", + bp->id, bp->filename, bp->line); return SUCCESS; } } @@ -240,12 +217,10 @@ int phpdbg_find_breakpoint_symbol(zend_function *fbc TSRMLS_DC) /* {{{ */ if (zend_hash_find(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM], fname, strlen(fname), (void**)&bp) == SUCCESS) { - printf("%sBreakpoint #%d in %s() at %s:%u%s\n", - PHPDBG_BOLD_LINE(TSRMLS_C), + phpdbg_notice("Breakpoint #%d in %s() at %s:%u", bp->id, bp->symbol, zend_get_executed_filename(TSRMLS_C), - zend_get_executed_lineno(TSRMLS_C), - PHPDBG_END_LINE(TSRMLS_C)); + zend_get_executed_lineno(TSRMLS_C)); return SUCCESS; } @@ -264,13 +239,10 @@ int phpdbg_find_breakpoint_method(zend_op_array *ops TSRMLS_DC) /* {{{ */ ops->function_name, strlen(ops->function_name), (void**)&bp) == SUCCESS) { - printf( - "%sBreakpoint #%d in %s::%s() at %s:%u%s\n", - PHPDBG_BOLD_LINE(TSRMLS_C), + phpdbg_notice("Breakpoint #%d in %s::%s() at %s:%u", bp->id, bp->class_name, bp->func_name, zend_get_executed_filename(TSRMLS_C), - zend_get_executed_lineno(TSRMLS_C), - PHPDBG_END_LINE(TSRMLS_C)); + zend_get_executed_lineno(TSRMLS_C)); return SUCCESS; } } @@ -284,12 +256,10 @@ int phpdbg_find_breakpoint_opline(phpdbg_opline_ptr_t opline TSRMLS_DC) /* {{{ * if (zend_hash_index_find(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], (zend_ulong) opline, (void**)&bp) == SUCCESS) { - printf("%sBreakpoint #%d in %#lx at %s:%u%s\n", - PHPDBG_BOLD_LINE(TSRMLS_C), + phpdbg_notice("Breakpoint #%d in %#lx at %s:%u", bp->id, bp->opline, zend_get_executed_filename(TSRMLS_C), - zend_get_executed_lineno(TSRMLS_C), - PHPDBG_END_LINE(TSRMLS_C)); + zend_get_executed_lineno(TSRMLS_C)); return SUCCESS; } diff --git a/phpdbg_print.c b/phpdbg_print.c index 747789799f8..37daf028b3c 100644 --- a/phpdbg_print.c +++ b/phpdbg_print.c @@ -19,6 +19,7 @@ #include "phpdbg.h" #include "phpdbg_print.h" +#include "phpdbg_utils.h" ZEND_EXTERN_MODULE_GLOBALS(phpdbg); @@ -28,10 +29,8 @@ PHPDBG_PRINT(opline) /* {{{ */ phpdbg_print_opline( EG(current_execute_data), 1 TSRMLS_CC); } else { - printf( - "%sNot Executing!%s\n", - PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_error("Not Executing!"); } - + return SUCCESS; } /* }}} */ diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 9fd03b986c4..d577b4ddba0 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -36,26 +36,20 @@ ZEND_EXTERN_MODULE_GLOBALS(phpdbg); static PHPDBG_COMMAND(exec) /* {{{ */ { if (PHPDBG_G(exec)) { - printf( - "%sUnsetting old execution context: %s%s\n", - PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_G(exec), PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_print(NOTICE TSRMLS_CC, + "Unsetting old execution context: %s", PHPDBG_G(exec)); efree(PHPDBG_G(exec)); PHPDBG_G(exec) = NULL; } if (PHPDBG_G(ops)) { - printf( - "%sDestroying compiled opcodes%s\n", - PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); - + phpdbg_print(NOTICE TSRMLS_CC, "Destroying compiled opcodes"); phpdbg_clean(0 TSRMLS_CC); } PHPDBG_G(exec) = estrndup(expr, PHPDBG_G(exec_len) = expr_len); - printf( - "%sSet execution context: %s%s\n", - PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_G(exec), PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_print(NOTICE TSRMLS_CC, "Set execution context: %s", PHPDBG_G(exec)); return SUCCESS; } /* }}} */ @@ -65,26 +59,22 @@ static inline int phpdbg_compile(TSRMLS_D) /* {{{ */ zend_file_handle fh; if (!EG(in_execution)) { - printf("%sAttempting compilation of %s%s\n", PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_G(exec), PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_print(NOTICE TSRMLS_CC, + "Attempting compilation of %s", PHPDBG_G(exec)); if (php_stream_open_for_zend_ex(PHPDBG_G(exec), &fh, USE_PATH|STREAM_OPEN_FOR_INCLUDE TSRMLS_CC) == SUCCESS) { - PHPDBG_G(ops) = zend_compile_file( - &fh, ZEND_INCLUDE TSRMLS_CC); + + PHPDBG_G(ops) = zend_compile_file(&fh, ZEND_INCLUDE TSRMLS_CC); zend_destroy_file_handle(&fh TSRMLS_CC); - printf( - "%sSuccess%s\n", - PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); + + phpdbg_print(NOTICE TSRMLS_CC, "Success"); return SUCCESS; } else { - printf( - "%sCould not open file %s%s\n", - PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_G(exec), PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_print(ERROR TSRMLS_CC, "Could not open file %s", PHPDBG_G(exec)); } } else { - printf( - "%sCannot compile while in execution%s\n", - PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_print(ERROR TSRMLS_CC, "Cannot compile while in execution"); } return FAILURE; @@ -95,18 +85,15 @@ static PHPDBG_COMMAND(compile) /* {{{ */ if (PHPDBG_G(exec)) { if (!EG(in_execution)) { if (PHPDBG_G(ops)) { - printf( - "%sDestroying previously compiled opcodes%s\n", - PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_print(ERROR TSRMLS_CC, + "Destroying previously compiled opcodes"); phpdbg_clean(0 TSRMLS_CC); } } return phpdbg_compile(TSRMLS_C); } else { - printf( - "%sNo execution context%s\n", - PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_print(ERROR TSRMLS_CC, "No execution context"); return FAILURE; } } /* }}} */ @@ -119,11 +106,8 @@ static PHPDBG_COMMAND(step) /* {{{ */ PHPDBG_G(flags) &= ~PHPDBG_IS_STEPPING; } - printf( - "%sStepping %s%s\n", - PHPDBG_BOLD_LINE(TSRMLS_C), - (PHPDBG_G(flags) & PHPDBG_IS_STEPPING) ? "on" : "off", - PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_print(NOTICE TSRMLS_CC, "Stepping %s", + (PHPDBG_G(flags) & PHPDBG_IS_STEPPING) ? "on" : "off"); return SUCCESS; } /* }}} */ @@ -136,14 +120,14 @@ static PHPDBG_COMMAND(next) /* {{{ */ static PHPDBG_COMMAND(run) /* {{{ */ { if (EG(in_execution)) { - printf("%sCannot start another execution while one is in progress%s\n", PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_error("Cannot start another execution while one is in progress"); return FAILURE; } if (PHPDBG_G(ops) || PHPDBG_G(exec)) { if (!PHPDBG_G(ops)) { if (phpdbg_compile(TSRMLS_C) == FAILURE) { - printf("%sFailed to compile %s, cannot run%s\n", PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_G(exec), PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_error("Failed to compile %s, cannot run", PHPDBG_G(exec)); return FAILURE; } } @@ -155,14 +139,14 @@ static PHPDBG_COMMAND(run) /* {{{ */ zend_execute(EG(active_op_array) TSRMLS_CC); } zend_catch { if (!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING)) { - printf("%sCaught excetion in VM%s\n", PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_error("Caught excetion in VM"); return FAILURE; } else return SUCCESS; } zend_end_try(); return SUCCESS; } else { - printf("%sNothing to execute !%s\n", PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_error("Nothing to execute!"); return FAILURE; } } /* }}} */ @@ -179,8 +163,7 @@ static PHPDBG_COMMAND(eval) /* {{{ */ if (zend_eval_stringl((char*)expr, expr_len-1, &retval, "eval()'d code" TSRMLS_CC) == SUCCESS) { - zend_print_zval_r( - &retval, 0 TSRMLS_CC); + zend_print_zval_r(&retval, 0 TSRMLS_CC); zval_dtor(&retval); printf("\n"); } @@ -190,7 +173,7 @@ static PHPDBG_COMMAND(eval) /* {{{ */ PHPDBG_G(flags) |= PHPDBG_IS_STEPPING; } } else { - printf("%sNo expression provided !%s\n", PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_error("No expression provided!"); return FAILURE; } @@ -200,7 +183,7 @@ static PHPDBG_COMMAND(eval) /* {{{ */ static PHPDBG_COMMAND(back) /* {{{ */ { if (!EG(in_execution)) { - printf("%sNot executing !%s\n", PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_error("Not executing!"); return FAILURE; } zval zbacktrace; @@ -229,9 +212,7 @@ static PHPDBG_COMMAND(print) /* {{{ */ { if (expr_len > 0L) { if (phpdbg_do_cmd(phpdbg_print_commands, (char*)expr, expr_len TSRMLS_CC) == FAILURE) { - printf( - "%sFailed to find print command: %s/%lu%s\n", - PHPDBG_RED_LINE(TSRMLS_C), expr, expr_len, PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_error("Failed to find print command: %s/%u", expr, expr_len); } return SUCCESS; } @@ -272,7 +253,7 @@ static PHPDBG_COMMAND(print) /* {{{ */ phpdbg_print_breakpoints(PHPDBG_BREAK_OPLINE TSRMLS_CC); PHPDBG_SEP_LINE(TSRMLS_C); - + return SUCCESS; } /* }}} */ @@ -281,8 +262,7 @@ static PHPDBG_COMMAND(break) /* {{{ */ char *line_pos; if (expr_len <= 0L) { - printf( - "%sNo expression found%s\n", PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_error("No expression found"); return FAILURE; } @@ -305,15 +285,13 @@ static PHPDBG_COMMAND(break) /* {{{ */ path[line_pos - expr] = 0; if (expand_filepath(path, resolved_name TSRMLS_CC) == NULL) { - printf("%sFailed to expand path %s%s\n", - PHPDBG_RED_LINE(TSRMLS_C), path, PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_error("Failed to expand path %s", path); return FAILURE; } phpdbg_set_breakpoint_file(resolved_name, line_num TSRMLS_CC); } else { - printf("%sNo line specified in expression %s%s\n", - PHPDBG_RED_LINE(TSRMLS_C), expr, PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_error("No line specified in expression %s", expr); return FAILURE; } } @@ -329,8 +307,7 @@ static PHPDBG_COMMAND(break) /* {{{ */ long line_num = strtol(expr, NULL, 0); if (!filename) { - printf("%sNo file context found%s\n", - PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_error("No file context found"); return FAILURE; } @@ -347,8 +324,7 @@ static PHPDBG_COMMAND(break) /* {{{ */ phpdbg_set_breakpoint_symbol(name TSRMLS_CC); } else { - printf("%sMalformed break command found%s\n", - PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_error("Malformed break command found"); return FAILURE; } } @@ -398,8 +374,7 @@ static PHPDBG_COMMAND(clean) /* {{{ */ printf("[\tConstants: %d]\n", zend_hash_num_elements(EG(zend_constants))); printf("[\tIncluded: %d]\n", zend_hash_num_elements(&EG(included_files))); } else { - printf( - "%sCannot clean environment while executing%s\n", PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_error("Cannot clean environment while executing"); return FAILURE; } @@ -421,15 +396,13 @@ static PHPDBG_COMMAND(clear) /* {{{ */ static PHPDBG_COMMAND(help) /* {{{ */ { - printf( + phpdbg_print(NOTICE TSRMLS_CC, "%sWelcome to phpdbg, the interactive PHP debugger, v%s%s\n", - PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_VERSION, PHPDBG_END_LINE(TSRMLS_C)); + PHPDBG_VERSION); if (expr_len > 0L) { if (phpdbg_do_cmd(phpdbg_help_commands, (char*)expr, expr_len TSRMLS_CC) == FAILURE) { - printf( - "%sFailed to find help command: %s/%lu%s\n", - PHPDBG_RED_LINE(TSRMLS_C), expr, expr_len, PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_error("Failed to find help command: %s/%lu", expr, expr_len); } } else { const phpdbg_command_t *prompt_command = phpdbg_prompt_commands; @@ -437,18 +410,14 @@ static PHPDBG_COMMAND(help) /* {{{ */ printf("To get help regarding a specific command type \"help command\"\n"); - printf( - "%sCommands%s\n", - PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_print(NOTICE TSRMLS_CC, "Commands"); while (prompt_command && prompt_command->name) { printf("\t%s\t%s\n", prompt_command->name, prompt_command->tip); ++prompt_command; } - printf( - "%sHelpers Loaded%s\n", - PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_print(NOTICE TSRMLS_CC, "Helpers Loaded"); while (help_command && help_command->name) { printf("\t%s\t%s\n", help_command->name, help_command->tip); @@ -456,9 +425,7 @@ static PHPDBG_COMMAND(help) /* {{{ */ } } - printf( - "%sPlease report bugs to <%s>%s\n", - PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_ISSUES, PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_print(NOTICE TSRMLS_CC, "Please report bugs to <%s>\n", PHPDBG_ISSUES); return SUCCESS; } /* }}} */ @@ -470,8 +437,8 @@ static PHPDBG_COMMAND(quiet) { /* {{{ */ PHPDBG_G(flags) &= ~PHPDBG_IS_QUIET; } - printf( - "%sQuietness %s%s\n", PHPDBG_BOLD_LINE(TSRMLS_C), (PHPDBG_G(flags) & PHPDBG_IS_QUIET) ? "enabled" : "disabled", PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_print(NOTICE TSRMLS_CC, "Quietness %s", + (PHPDBG_G(flags) & PHPDBG_IS_QUIET) ? "enabled" : "disabled"); return SUCCESS; } /* }}} */ @@ -486,9 +453,7 @@ static PHPDBG_COMMAND(list) /* {{{ */ filename = zend_get_executed_filename(TSRMLS_C); offset = zend_get_executed_lineno(TSRMLS_C); } else if (!filename) { - printf( - "%sNo file to list%s\n", - PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_print(ERROR TSRMLS_CC, "No file to list"); return SUCCESS; } @@ -507,15 +472,11 @@ static PHPDBG_COMMAND(list) /* {{{ */ func_table = &EG(scope)->function_table; } else { - printf( - "%sNo active class%s\n", - PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_print(ERROR TSRMLS_CC, "No active class"); return FAILURE; } } else if (!EG(function_table)) { - printf( - "%sNo function table loaded%s\n", - PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_print(ERROR TSRMLS_CC, "No function table loaded"); return SUCCESS; } else { func_table = EG(function_table); @@ -525,9 +486,7 @@ static PHPDBG_COMMAND(list) /* {{{ */ (void**)&fbc) == SUCCESS) { phpdbg_list_function(fbc TSRMLS_CC); } else { - printf( - "%sFunction %s not found%s\n", - PHPDBG_RED_LINE(TSRMLS_C), func_name, PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_print(ERROR TSRMLS_CC, "Function %s not found", func_name); } } @@ -556,7 +515,7 @@ static const phpdbg_command_t phpdbg_prompt_commands[] = { int phpdbg_do_cmd(const phpdbg_command_t *command, char *cmd_line, size_t cmd_len TSRMLS_DC) /* {{{ */ { char *params = NULL; -#ifndef _WIN32 +#ifndef _WIN32 const char *cmd = strtok_r(cmd_line, " ", ¶ms); #else const char *cmd = strtok_s(cmd_line, " ", ¶ms); @@ -615,17 +574,13 @@ phpdbg_interactive_enter: switch (phpdbg_do_cmd(phpdbg_prompt_commands, cmd, cmd_len TSRMLS_CC)) { case FAILURE: if (!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING)) { - printf( - "%sFailed to execute %s !%s\n", - PHPDBG_RED_LINE(TSRMLS_C), cmd, PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_error("Failed to execute %s!", cmd); } break; case PHPDBG_NEXT: { if (!EG(in_execution)) { - printf( - "%sNot running%s\n", - PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_error("Not running"); } return PHPDBG_NEXT; } @@ -652,12 +607,8 @@ void phpdbg_print_opline(zend_execute_data *execute_data, zend_bool ignore_flags zend_op *opline = execute_data->opline; - printf( - "%sOPLINE: %p:%s%s\n", - PHPDBG_BOLD_LINE(TSRMLS_C), - opline, - phpdbg_decode_opcode(opline->opcode), - PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_print(NOTICE TSRMLS_CC, "OPLINE: %p:%s", + opline, phpdbg_decode_opcode(opline->opcode)); } } /* }}} */ @@ -667,16 +618,18 @@ void phpdbg_clean(zend_bool full TSRMLS_DC) /* {{{ */ /* this is implicitly required */ if (PHPDBG_G(ops)) { - destroy_op_array( - PHPDBG_G(ops) TSRMLS_CC); + destroy_op_array(PHPDBG_G(ops) TSRMLS_CC); efree(PHPDBG_G(ops)); PHPDBG_G(ops) = NULL; } if (full) { - zend_hash_reverse_apply(EG(function_table), (apply_func_t) clean_non_persistent_function_full TSRMLS_CC); - zend_hash_reverse_apply(EG(class_table), (apply_func_t) clean_non_persistent_class_full TSRMLS_CC); - zend_hash_reverse_apply(EG(zend_constants), (apply_func_t) clean_non_persistent_constant_full TSRMLS_CC); + zend_hash_reverse_apply(EG(function_table), + (apply_func_t) clean_non_persistent_function_full TSRMLS_CC); + zend_hash_reverse_apply(EG(class_table), + (apply_func_t) clean_non_persistent_class_full TSRMLS_CC); + zend_hash_reverse_apply(EG(zend_constants), + (apply_func_t) clean_non_persistent_constant_full TSRMLS_CC); zend_hash_clean(&EG(included_files)); } } /* }}} */ diff --git a/phpdbg_utils.c b/phpdbg_utils.c index e8a5dc63470..01f2a3b6ac0 100644 --- a/phpdbg_utils.c +++ b/phpdbg_utils.c @@ -20,8 +20,13 @@ #include #include #include "zend.h" +#include "php.h" +#include "spprintf.h" +#include "phpdbg.h" #include "phpdbg_utils.h" +ZEND_EXTERN_MODULE_GLOBALS(phpdbg); + int phpdbg_is_numeric(const char *str) /* {{{ */ { for (; *str; str++) { @@ -64,3 +69,29 @@ int phpdbg_is_class_method(const char *str, size_t len, char **class, char **met return 1; } /* }}} */ + +int phpdbg_print(int type TSRMLS_DC, const char *format, ...) /* {{{ */ +{ + char *buffer = NULL; + va_list args; + + va_start(args, format); + vspprintf(&buffer, 0, format, args); + va_end(args); + + switch (type) { + case ERROR: + printf("%s%s%s\n", + ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[1;31m[" : "["), + buffer, + PHPDBG_END_LINE(TSRMLS_D)); + break; + + case NOTICE: + printf("%s%s%s\n", + ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[1;64m[" : "["), + buffer, + PHPDBG_END_LINE(TSRMLS_D)); + break; + } +} /* }}} */ diff --git a/phpdbg_utils.h b/phpdbg_utils.h index f4eda3f18cb..cc3365a603b 100644 --- a/phpdbg_utils.h +++ b/phpdbg_utils.h @@ -20,6 +20,8 @@ #ifndef PHPDBG_UTILS_H #define PHPDBG_UTILS_H +#include "TSRM.h" + /** * Input scan functions */ @@ -28,4 +30,17 @@ int phpdbg_is_empty(const char*); int phpdbg_is_addr(const char*); int phpdbg_is_class_method(const char*, size_t, char**, char**); +/** + * Error/notice printing helper + */ +enum { + ERROR = 1, + NOTICE +}; + +int phpdbg_print(int TSRMLS_DC, const char*, ...); + +#define phpdbg_error(fmt, ...) phpdbg_print(ERROR TSRMLS_CC, fmt, ##__VA_ARGS__) +#define phpdbg_notice(fmt, ...) phpdbg_print(NOTICE TSRMLS_CC, fmt, ##__VA_ARGS__) + #endif /* PHPDBG_UTILS_H */ From 5d435cb8312c0e88d7feb38debb3bd319be35535 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Tue, 12 Nov 2013 20:48:52 -0200 Subject: [PATCH 172/771] - Spred more some macro usage instead of phpdbg_print() --- phpdbg_prompt.c | 46 +++++++++++++++++++++------------------------- 1 file changed, 21 insertions(+), 25 deletions(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index d577b4ddba0..444d3d45391 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -36,20 +36,19 @@ ZEND_EXTERN_MODULE_GLOBALS(phpdbg); static PHPDBG_COMMAND(exec) /* {{{ */ { if (PHPDBG_G(exec)) { - phpdbg_print(NOTICE TSRMLS_CC, - "Unsetting old execution context: %s", PHPDBG_G(exec)); + phpdbg_notice("Unsetting old execution context: %s", PHPDBG_G(exec)); efree(PHPDBG_G(exec)); PHPDBG_G(exec) = NULL; } if (PHPDBG_G(ops)) { - phpdbg_print(NOTICE TSRMLS_CC, "Destroying compiled opcodes"); + phpdbg_notice("Destroying compiled opcodes"); phpdbg_clean(0 TSRMLS_CC); } PHPDBG_G(exec) = estrndup(expr, PHPDBG_G(exec_len) = expr_len); - phpdbg_print(NOTICE TSRMLS_CC, "Set execution context: %s", PHPDBG_G(exec)); + phpdbg_notice("Set execution context: %s", PHPDBG_G(exec)); return SUCCESS; } /* }}} */ @@ -59,8 +58,7 @@ static inline int phpdbg_compile(TSRMLS_D) /* {{{ */ zend_file_handle fh; if (!EG(in_execution)) { - phpdbg_print(NOTICE TSRMLS_CC, - "Attempting compilation of %s", PHPDBG_G(exec)); + phpdbg_notice("Attempting compilation of %s", PHPDBG_G(exec)); if (php_stream_open_for_zend_ex(PHPDBG_G(exec), &fh, USE_PATH|STREAM_OPEN_FOR_INCLUDE TSRMLS_CC) == SUCCESS) { @@ -68,13 +66,13 @@ static inline int phpdbg_compile(TSRMLS_D) /* {{{ */ PHPDBG_G(ops) = zend_compile_file(&fh, ZEND_INCLUDE TSRMLS_CC); zend_destroy_file_handle(&fh TSRMLS_CC); - phpdbg_print(NOTICE TSRMLS_CC, "Success"); + phpdbg_notice("Success"); return SUCCESS; } else { - phpdbg_print(ERROR TSRMLS_CC, "Could not open file %s", PHPDBG_G(exec)); + phpdbg_error("Could not open file %s", PHPDBG_G(exec)); } } else { - phpdbg_print(ERROR TSRMLS_CC, "Cannot compile while in execution"); + phpdbg_error("Cannot compile while in execution"); } return FAILURE; @@ -85,15 +83,14 @@ static PHPDBG_COMMAND(compile) /* {{{ */ if (PHPDBG_G(exec)) { if (!EG(in_execution)) { if (PHPDBG_G(ops)) { - phpdbg_print(ERROR TSRMLS_CC, - "Destroying previously compiled opcodes"); + phpdbg_error("Destroying previously compiled opcodes"); phpdbg_clean(0 TSRMLS_CC); } } return phpdbg_compile(TSRMLS_C); } else { - phpdbg_print(ERROR TSRMLS_CC, "No execution context"); + phpdbg_error("No execution context"); return FAILURE; } } /* }}} */ @@ -106,7 +103,7 @@ static PHPDBG_COMMAND(step) /* {{{ */ PHPDBG_G(flags) &= ~PHPDBG_IS_STEPPING; } - phpdbg_print(NOTICE TSRMLS_CC, "Stepping %s", + phpdbg_notice("Stepping %s", (PHPDBG_G(flags) & PHPDBG_IS_STEPPING) ? "on" : "off"); return SUCCESS; @@ -396,9 +393,8 @@ static PHPDBG_COMMAND(clear) /* {{{ */ static PHPDBG_COMMAND(help) /* {{{ */ { - phpdbg_print(NOTICE TSRMLS_CC, - "%sWelcome to phpdbg, the interactive PHP debugger, v%s%s\n", - PHPDBG_VERSION); + phpdbg_notice("Welcome to phpdbg, the interactive PHP debugger, v%s", + PHPDBG_VERSION); if (expr_len > 0L) { if (phpdbg_do_cmd(phpdbg_help_commands, (char*)expr, expr_len TSRMLS_CC) == FAILURE) { @@ -410,14 +406,14 @@ static PHPDBG_COMMAND(help) /* {{{ */ printf("To get help regarding a specific command type \"help command\"\n"); - phpdbg_print(NOTICE TSRMLS_CC, "Commands"); + phpdbg_notice("Commands"); while (prompt_command && prompt_command->name) { printf("\t%s\t%s\n", prompt_command->name, prompt_command->tip); ++prompt_command; } - phpdbg_print(NOTICE TSRMLS_CC, "Helpers Loaded"); + phpdbg_notice("Helpers Loaded"); while (help_command && help_command->name) { printf("\t%s\t%s\n", help_command->name, help_command->tip); @@ -425,7 +421,7 @@ static PHPDBG_COMMAND(help) /* {{{ */ } } - phpdbg_print(NOTICE TSRMLS_CC, "Please report bugs to <%s>\n", PHPDBG_ISSUES); + phpdbg_notice("Please report bugs to <%s>", PHPDBG_ISSUES); return SUCCESS; } /* }}} */ @@ -437,7 +433,7 @@ static PHPDBG_COMMAND(quiet) { /* {{{ */ PHPDBG_G(flags) &= ~PHPDBG_IS_QUIET; } - phpdbg_print(NOTICE TSRMLS_CC, "Quietness %s", + phpdbg_notice("Quietness %s", (PHPDBG_G(flags) & PHPDBG_IS_QUIET) ? "enabled" : "disabled"); return SUCCESS; @@ -453,7 +449,7 @@ static PHPDBG_COMMAND(list) /* {{{ */ filename = zend_get_executed_filename(TSRMLS_C); offset = zend_get_executed_lineno(TSRMLS_C); } else if (!filename) { - phpdbg_print(ERROR TSRMLS_CC, "No file to list"); + phpdbg_error("No file to list"); return SUCCESS; } @@ -472,11 +468,11 @@ static PHPDBG_COMMAND(list) /* {{{ */ func_table = &EG(scope)->function_table; } else { - phpdbg_print(ERROR TSRMLS_CC, "No active class"); + phpdbg_error("No active class"); return FAILURE; } } else if (!EG(function_table)) { - phpdbg_print(ERROR TSRMLS_CC, "No function table loaded"); + phpdbg_error("No function table loaded"); return SUCCESS; } else { func_table = EG(function_table); @@ -486,7 +482,7 @@ static PHPDBG_COMMAND(list) /* {{{ */ (void**)&fbc) == SUCCESS) { phpdbg_list_function(fbc TSRMLS_CC); } else { - phpdbg_print(ERROR TSRMLS_CC, "Function %s not found", func_name); + phpdbg_error("Function %s not found", func_name); } } @@ -607,7 +603,7 @@ void phpdbg_print_opline(zend_execute_data *execute_data, zend_bool ignore_flags zend_op *opline = execute_data->opline; - phpdbg_print(NOTICE TSRMLS_CC, "OPLINE: %p:%s", + phpdbg_notice("OPLINE: %p:%s", opline, phpdbg_decode_opcode(opline->opcode)); } } /* }}} */ From ff54d20b583e41e996bdbf4c49b72919f3988f8b Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Tue, 12 Nov 2013 20:55:39 -0200 Subject: [PATCH 173/771] - Fix prototype and memory leak --- phpdbg_utils.c | 6 +++++- phpdbg_utils.h | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/phpdbg_utils.c b/phpdbg_utils.c index 01f2a3b6ac0..f37135f69c0 100644 --- a/phpdbg_utils.c +++ b/phpdbg_utils.c @@ -70,7 +70,7 @@ int phpdbg_is_class_method(const char *str, size_t len, char **class, char **met return 1; } /* }}} */ -int phpdbg_print(int type TSRMLS_DC, const char *format, ...) /* {{{ */ +void phpdbg_print(int type TSRMLS_DC, const char *format, ...) /* {{{ */ { char *buffer = NULL; va_list args; @@ -94,4 +94,8 @@ int phpdbg_print(int type TSRMLS_DC, const char *format, ...) /* {{{ */ PHPDBG_END_LINE(TSRMLS_D)); break; } + + if (buffer) { + efree(buffer); + } } /* }}} */ diff --git a/phpdbg_utils.h b/phpdbg_utils.h index cc3365a603b..432d6a0b22e 100644 --- a/phpdbg_utils.h +++ b/phpdbg_utils.h @@ -38,7 +38,7 @@ enum { NOTICE }; -int phpdbg_print(int TSRMLS_DC, const char*, ...); +void phpdbg_print(int TSRMLS_DC, const char*, ...); #define phpdbg_error(fmt, ...) phpdbg_print(ERROR TSRMLS_CC, fmt, ##__VA_ARGS__) #define phpdbg_notice(fmt, ...) phpdbg_print(NOTICE TSRMLS_CC, fmt, ##__VA_ARGS__) From a712674964ffbabf93dae6eac6e4394079567a51 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 23:10:53 +0000 Subject: [PATCH 174/771] added phpdbg_write to replace all the printf --- phpdbg_prompt.c | 35 +++++++++++++++++++---------------- phpdbg_utils.c | 13 +++++++++++-- phpdbg_utils.h | 6 ++++-- 3 files changed, 34 insertions(+), 20 deletions(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 444d3d45391..a322373129a 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -357,19 +357,21 @@ static int clean_non_persistent_function_full(zend_function *function TSRMLS_DC) static PHPDBG_COMMAND(clean) /* {{{ */ { if (!EG(in_execution)) { - printf("[Cleaning Environment:]\n"); - printf("[\tClasses: %d]\n", zend_hash_num_elements(EG(class_table))); - printf("[\tFunctions: %d]\n", zend_hash_num_elements(EG(function_table))); - printf("[\tConstants: %d]\n", zend_hash_num_elements(EG(zend_constants))); - printf("[\tIncluded: %d]\n", zend_hash_num_elements(&EG(included_files))); + phpdbg_notice("Cleaning Execution Environment"); + + phpdbg_write("Classes\t%d", zend_hash_num_elements(EG(class_table))); + phpdbg_write("Functions\t%d", zend_hash_num_elements(EG(function_table))); + phpdbg_write("Constants\t%d", zend_hash_num_elements(EG(zend_constants))); + phpdbg_write("Includes\t%d", zend_hash_num_elements(&EG(included_files))); phpdbg_clean(1 TSRMLS_CC); - printf("[Clean Environment:]\n"); - printf("[\tClasses: %d]\n", zend_hash_num_elements(EG(class_table))); - printf("[\tFunctions: %d]\n", zend_hash_num_elements(EG(function_table))); - printf("[\tConstants: %d]\n", zend_hash_num_elements(EG(zend_constants))); - printf("[\tIncluded: %d]\n", zend_hash_num_elements(&EG(included_files))); + phpdbg_notice("Clean Execution Environment"); + + phpdbg_write("Classes\t%d", zend_hash_num_elements(EG(class_table))); + phpdbg_write("Functions\t%d", zend_hash_num_elements(EG(function_table))); + phpdbg_write("Constants\t%d", zend_hash_num_elements(EG(zend_constants))); + phpdbg_write("Includes\t%d", zend_hash_num_elements(&EG(included_files))); } else { phpdbg_error("Cannot clean environment while executing"); return FAILURE; @@ -380,12 +382,13 @@ static PHPDBG_COMMAND(clean) /* {{{ */ static PHPDBG_COMMAND(clear) /* {{{ */ { - printf("[Clearing Breakpoints:]\n"); - printf("[\tFile\t%d]\n", zend_hash_num_elements(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE])); - printf("[\tSymbols\t%d]\n", zend_hash_num_elements(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM])); - printf("[\tOplines\t%d]\n", zend_hash_num_elements(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE])); - printf("[\tMethods\t%d]\n", zend_hash_num_elements(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD])); - + phpdbg_notice("Clearing Breakpoints"); + + phpdbg_write("File\t%d", zend_hash_num_elements(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE])); + phpdbg_write("Functions\t%d", zend_hash_num_elements(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM])); + phpdbg_write("Methods\t%d", zend_hash_num_elements(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD])); + phpdbg_write("Oplines\t%d", zend_hash_num_elements(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE])); + phpdbg_clear_breakpoints(TSRMLS_C); return SUCCESS; diff --git a/phpdbg_utils.c b/phpdbg_utils.c index f37135f69c0..4607bf66fd6 100644 --- a/phpdbg_utils.c +++ b/phpdbg_utils.c @@ -79,19 +79,28 @@ void phpdbg_print(int type TSRMLS_DC, const char *format, ...) /* {{{ */ vspprintf(&buffer, 0, format, args); va_end(args); + /* TODO(anyone) colours */ + switch (type) { case ERROR: printf("%s%s%s\n", ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[1;31m[" : "["), buffer, - PHPDBG_END_LINE(TSRMLS_D)); + ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "]\033[0m" : "]")); break; case NOTICE: printf("%s%s%s\n", ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[1;64m[" : "["), buffer, - PHPDBG_END_LINE(TSRMLS_D)); + ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "]\033[0m" : "]")); + break; + + case WRITE: + printf("%s%s%s\n", + ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[1;64m" : ""), + buffer, + ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[0m" : "")); break; } diff --git a/phpdbg_utils.h b/phpdbg_utils.h index 432d6a0b22e..af659c03fdc 100644 --- a/phpdbg_utils.h +++ b/phpdbg_utils.h @@ -31,16 +31,18 @@ int phpdbg_is_addr(const char*); int phpdbg_is_class_method(const char*, size_t, char**, char**); /** - * Error/notice printing helper + * Error/notice/formatting helper */ enum { ERROR = 1, - NOTICE + NOTICE, + WRITE }; void phpdbg_print(int TSRMLS_DC, const char*, ...); #define phpdbg_error(fmt, ...) phpdbg_print(ERROR TSRMLS_CC, fmt, ##__VA_ARGS__) #define phpdbg_notice(fmt, ...) phpdbg_print(NOTICE TSRMLS_CC, fmt, ##__VA_ARGS__) +#define phpdbg_write(fmt, ...) phpdbg_print(WRITE TSRMLS_CC, fmt, ##__VA_ARGS__) #endif /* PHPDBG_UTILS_H */ From afa216fd7e2e441a1233305d0e8e404773f27dd8 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 23:17:37 +0000 Subject: [PATCH 175/771] deploy _write --- phpdbg_prompt.c | 42 +++++++++++++++++++++--------------------- phpdbg_utils.c | 2 +- phpdbg_utils.h | 3 +++ 3 files changed, 25 insertions(+), 22 deletions(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index a322373129a..8277e166e6f 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -194,12 +194,12 @@ static PHPDBG_COMMAND(back) /* {{{ */ zend_hash_get_current_data_ex(Z_ARRVAL(zbacktrace), (void**)&tmp, &position) == SUCCESS; zend_hash_move_forward_ex(Z_ARRVAL(zbacktrace), &position)) { if (i++) { - printf(",\n"); + phpdbg_write(","); } zend_print_flat_zval_r(*tmp TSRMLS_CC); } - printf("\n"); + phpdbg_write(EMPTY); zval_dtor(&zbacktrace); return SUCCESS; @@ -215,34 +215,34 @@ static PHPDBG_COMMAND(print) /* {{{ */ } PHPDBG_SEP_LINE(TSRMLS_C); - printf("Execution Context Information:\n"); + phpdbg_notice("Execution Context Information:"); #ifdef HAVE_LIBREADLINE - printf("Readline\tyes\n"); + phpdbg_write("Readline\tyes"); #else - printf("Readline\tno\n"); + phpdbg_write("Readline\tno"); #endif - printf("Exec\t\t%s\n", PHPDBG_G(exec) ? PHPDBG_G(exec) : "none"); - printf("Compiled\t%s\n", PHPDBG_G(ops) ? "yes" : "no"); - printf("Stepping\t%s\n", (PHPDBG_G(flags) & PHPDBG_IS_STEPPING) ? "on" : "off"); - printf("Quietness\t%s\n", (PHPDBG_G(flags) & PHPDBG_IS_QUIET) ? "on" : "off"); + phpdbg_write("Exec\t\t%s", PHPDBG_G(exec) ? PHPDBG_G(exec) : "none"); + phpdbg_write("Compiled\t%s", PHPDBG_G(ops) ? "yes" : "no"); + phpdbg_write("Stepping\t%s", (PHPDBG_G(flags) & PHPDBG_IS_STEPPING) ? "on" : "off"); + phpdbg_write("Quietness\t%s", (PHPDBG_G(flags) & PHPDBG_IS_QUIET) ? "on" : "off"); if (PHPDBG_G(ops)) { - printf("Opcodes\t\t%d\n", PHPDBG_G(ops)->last); + phpdbg_write("Opcodes\t\t%d", PHPDBG_G(ops)->last); if (PHPDBG_G(ops)->last_var) { - printf("Variables\t%d\n", PHPDBG_G(ops)->last_var-1); + phpdbg_write("Variables\t%d", PHPDBG_G(ops)->last_var-1); } else { - printf("Variables\tNone\n"); + phpdbg_write("Variables\tNone"); } } - printf("Executing\t%s\n", EG(in_execution) ? "yes" : "no"); + phpdbg_write("Executing\t%s", EG(in_execution) ? "yes" : "no"); if (EG(in_execution)) { - printf("VM Return\t%d\n", PHPDBG_G(vmret)); + phpdbg_write("VM Return\t%d", PHPDBG_G(vmret)); } - printf("Classes\t\t%d\n", zend_hash_num_elements(EG(class_table))); - printf("Functions\t%d\n", zend_hash_num_elements(EG(function_table))); - printf("Constants\t%d\n", zend_hash_num_elements(EG(zend_constants))); - printf("Included\t%d\n", zend_hash_num_elements(&EG(included_files))); + phpdbg_write("Classes\t\t%d", zend_hash_num_elements(EG(class_table))); + phpdbg_write("Functions\t%d", zend_hash_num_elements(EG(function_table))); + phpdbg_write("Constants\t%d", zend_hash_num_elements(EG(zend_constants))); + phpdbg_write("Included\t%d", zend_hash_num_elements(&EG(included_files))); phpdbg_print_breakpoints(PHPDBG_BREAK_FILE TSRMLS_CC); phpdbg_print_breakpoints(PHPDBG_BREAK_SYM TSRMLS_CC); @@ -407,19 +407,19 @@ static PHPDBG_COMMAND(help) /* {{{ */ const phpdbg_command_t *prompt_command = phpdbg_prompt_commands; const phpdbg_command_t *help_command = phpdbg_help_commands; - printf("To get help regarding a specific command type \"help command\"\n"); + phpdbg_write("To get help regarding a specific command type \"help command\""); phpdbg_notice("Commands"); while (prompt_command && prompt_command->name) { - printf("\t%s\t%s\n", prompt_command->name, prompt_command->tip); + phpdbg_write("\t%s\t%s", prompt_command->name, prompt_command->tip); ++prompt_command; } phpdbg_notice("Helpers Loaded"); while (help_command && help_command->name) { - printf("\t%s\t%s\n", help_command->name, help_command->tip); + phpdbg_write("\t%s\t%s", help_command->name, help_command->tip); ++help_command; } } diff --git a/phpdbg_utils.c b/phpdbg_utils.c index 4607bf66fd6..2a0d976a750 100644 --- a/phpdbg_utils.c +++ b/phpdbg_utils.c @@ -98,7 +98,7 @@ void phpdbg_print(int type TSRMLS_DC, const char *format, ...) /* {{{ */ case WRITE: printf("%s%s%s\n", - ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[1;64m" : ""), + ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[37m" : ""), buffer, ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[0m" : "")); break; diff --git a/phpdbg_utils.h b/phpdbg_utils.h index af659c03fdc..d6067a61bf0 100644 --- a/phpdbg_utils.h +++ b/phpdbg_utils.h @@ -45,4 +45,7 @@ void phpdbg_print(int TSRMLS_DC, const char*, ...); #define phpdbg_notice(fmt, ...) phpdbg_print(NOTICE TSRMLS_CC, fmt, ##__VA_ARGS__) #define phpdbg_write(fmt, ...) phpdbg_print(WRITE TSRMLS_CC, fmt, ##__VA_ARGS__) +/* {{{ For writing blank lines */ +#define EMPTY "" /* }}} */ + #endif /* PHPDBG_UTILS_H */ From ce78503e15d6457a28673b15a852cbeeb03a5812 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 23:31:46 +0000 Subject: [PATCH 176/771] remove more printf --- phpdbg_list.c | 12 ++++----- phpdbg_prompt.c | 68 ++++++++++++++++++++++++------------------------- phpdbg_utils.c | 23 ++++++++++++----- phpdbg_utils.h | 5 ++++ 4 files changed, 62 insertions(+), 46 deletions(-) diff --git a/phpdbg_list.c b/phpdbg_list.c index 9f2c6a22860..435136cee21 100644 --- a/phpdbg_list.c +++ b/phpdbg_list.c @@ -41,12 +41,12 @@ void phpdbg_list_file(const char *filename, long count, long offset TSRMLS_DC) / unsigned int line = 0, displayed = 0; if (VCWD_STAT(filename, &st) == -1) { - printf("[Failed to stat file %s]\n", filename); + phpdbg_error("Failed to stat file %s", filename); return; } #ifndef _WIN32 if ((fd = VCWD_OPEN(filename, O_RDONLY)) == -1) { - printf("[Failed to open file %s to list]\n", filename); + phpdbg_error("Failed to open file %s to list", filename); return; } @@ -55,20 +55,20 @@ void phpdbg_list_file(const char *filename, long count, long offset TSRMLS_DC) / #else fd = CreateFile(filename, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); if (fd == INVALID_HANDLE_VALUE) { - printf("[Failed to open file!]\n"); + phpdbg_error("Failed to open file!"); return; } map = CreateFileMapping(fd, NULL, PAGE_EXECUTE_READ, 0, 0, 0); if (map == NULL) { - printf("[Failed to map file!]\n"); + phpdbg_error("Failed to map file!"); CloseHandle(fd); return; } last_pos = mem = (char*) MapViewOfFile(map, FILE_MAP_READ, 0, 0, 0); if (mem == NULL) { - printf("[Failed to map file in memory]\n"); + phpdbg_error("Failed to map file in memory"); CloseHandle(map); CloseHandle(fd); return; @@ -87,7 +87,7 @@ void phpdbg_list_file(const char *filename, long count, long offset TSRMLS_DC) / if (!offset || offset <= line) { /* Without offset, or offset reached */ - printf("%05u: %.*s\n", line, (int)(pos - last_pos), last_pos); + phpdbg_writeln("%05u: %.*s", line, (int)(pos - last_pos), last_pos); ++displayed; } diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 8277e166e6f..fe1c3260869 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -162,7 +162,7 @@ static PHPDBG_COMMAND(eval) /* {{{ */ &retval, "eval()'d code" TSRMLS_CC) == SUCCESS) { zend_print_zval_r(&retval, 0 TSRMLS_CC); zval_dtor(&retval); - printf("\n"); + phpdbg_writeln(EMPTY); } /* switch stepping back on */ @@ -194,12 +194,12 @@ static PHPDBG_COMMAND(back) /* {{{ */ zend_hash_get_current_data_ex(Z_ARRVAL(zbacktrace), (void**)&tmp, &position) == SUCCESS; zend_hash_move_forward_ex(Z_ARRVAL(zbacktrace), &position)) { if (i++) { - phpdbg_write(","); + phpdbg_writeln(","); } zend_print_flat_zval_r(*tmp TSRMLS_CC); } - phpdbg_write(EMPTY); + phpdbg_writeln(EMPTY); zval_dtor(&zbacktrace); return SUCCESS; @@ -217,32 +217,32 @@ static PHPDBG_COMMAND(print) /* {{{ */ PHPDBG_SEP_LINE(TSRMLS_C); phpdbg_notice("Execution Context Information:"); #ifdef HAVE_LIBREADLINE - phpdbg_write("Readline\tyes"); + phpdbg_writeln("Readline\tyes"); #else - phpdbg_write("Readline\tno"); + phpdbg_writeln("Readline\tno"); #endif - phpdbg_write("Exec\t\t%s", PHPDBG_G(exec) ? PHPDBG_G(exec) : "none"); - phpdbg_write("Compiled\t%s", PHPDBG_G(ops) ? "yes" : "no"); - phpdbg_write("Stepping\t%s", (PHPDBG_G(flags) & PHPDBG_IS_STEPPING) ? "on" : "off"); - phpdbg_write("Quietness\t%s", (PHPDBG_G(flags) & PHPDBG_IS_QUIET) ? "on" : "off"); + phpdbg_writeln("Exec\t\t%s", PHPDBG_G(exec) ? PHPDBG_G(exec) : "none"); + phpdbg_writeln("Compiled\t%s", PHPDBG_G(ops) ? "yes" : "no"); + phpdbg_writeln("Stepping\t%s", (PHPDBG_G(flags) & PHPDBG_IS_STEPPING) ? "on" : "off"); + phpdbg_writeln("Quietness\t%s", (PHPDBG_G(flags) & PHPDBG_IS_QUIET) ? "on" : "off"); if (PHPDBG_G(ops)) { - phpdbg_write("Opcodes\t\t%d", PHPDBG_G(ops)->last); + phpdbg_writeln("Opcodes\t\t%d", PHPDBG_G(ops)->last); if (PHPDBG_G(ops)->last_var) { - phpdbg_write("Variables\t%d", PHPDBG_G(ops)->last_var-1); + phpdbg_writeln("Variables\t%d", PHPDBG_G(ops)->last_var-1); } else { - phpdbg_write("Variables\tNone"); + phpdbg_writeln("Variables\tNone"); } } - phpdbg_write("Executing\t%s", EG(in_execution) ? "yes" : "no"); + phpdbg_writeln("Executing\t%s", EG(in_execution) ? "yes" : "no"); if (EG(in_execution)) { - phpdbg_write("VM Return\t%d", PHPDBG_G(vmret)); + phpdbg_writeln("VM Return\t%d", PHPDBG_G(vmret)); } - phpdbg_write("Classes\t\t%d", zend_hash_num_elements(EG(class_table))); - phpdbg_write("Functions\t%d", zend_hash_num_elements(EG(function_table))); - phpdbg_write("Constants\t%d", zend_hash_num_elements(EG(zend_constants))); - phpdbg_write("Included\t%d", zend_hash_num_elements(&EG(included_files))); + phpdbg_writeln("Classes\t\t%d", zend_hash_num_elements(EG(class_table))); + phpdbg_writeln("Functions\t%d", zend_hash_num_elements(EG(function_table))); + phpdbg_writeln("Constants\t%d", zend_hash_num_elements(EG(zend_constants))); + phpdbg_writeln("Included\t%d", zend_hash_num_elements(&EG(included_files))); phpdbg_print_breakpoints(PHPDBG_BREAK_FILE TSRMLS_CC); phpdbg_print_breakpoints(PHPDBG_BREAK_SYM TSRMLS_CC); @@ -359,19 +359,19 @@ static PHPDBG_COMMAND(clean) /* {{{ */ if (!EG(in_execution)) { phpdbg_notice("Cleaning Execution Environment"); - phpdbg_write("Classes\t%d", zend_hash_num_elements(EG(class_table))); - phpdbg_write("Functions\t%d", zend_hash_num_elements(EG(function_table))); - phpdbg_write("Constants\t%d", zend_hash_num_elements(EG(zend_constants))); - phpdbg_write("Includes\t%d", zend_hash_num_elements(&EG(included_files))); + phpdbg_writeln("Classes\t\t\t%d", zend_hash_num_elements(EG(class_table))); + phpdbg_writeln("Functions\t\t%d", zend_hash_num_elements(EG(function_table))); + phpdbg_writeln("Constants\t\t%d", zend_hash_num_elements(EG(zend_constants))); + phpdbg_writeln("Includes\t\t%d", zend_hash_num_elements(&EG(included_files))); phpdbg_clean(1 TSRMLS_CC); phpdbg_notice("Clean Execution Environment"); - phpdbg_write("Classes\t%d", zend_hash_num_elements(EG(class_table))); - phpdbg_write("Functions\t%d", zend_hash_num_elements(EG(function_table))); - phpdbg_write("Constants\t%d", zend_hash_num_elements(EG(zend_constants))); - phpdbg_write("Includes\t%d", zend_hash_num_elements(&EG(included_files))); + phpdbg_writeln("Classes\t\t\t%d", zend_hash_num_elements(EG(class_table))); + phpdbg_writeln("Functions\t\t%d", zend_hash_num_elements(EG(function_table))); + phpdbg_writeln("Constants\t\t%d", zend_hash_num_elements(EG(zend_constants))); + phpdbg_writeln("Includes\t\t%d", zend_hash_num_elements(&EG(included_files))); } else { phpdbg_error("Cannot clean environment while executing"); return FAILURE; @@ -384,10 +384,10 @@ static PHPDBG_COMMAND(clear) /* {{{ */ { phpdbg_notice("Clearing Breakpoints"); - phpdbg_write("File\t%d", zend_hash_num_elements(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE])); - phpdbg_write("Functions\t%d", zend_hash_num_elements(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM])); - phpdbg_write("Methods\t%d", zend_hash_num_elements(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD])); - phpdbg_write("Oplines\t%d", zend_hash_num_elements(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE])); + phpdbg_writeln("File\t\t\t%d", zend_hash_num_elements(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE])); + phpdbg_writeln("Functions\t\t%d", zend_hash_num_elements(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM])); + phpdbg_writeln("Methods\t\t\t%d", zend_hash_num_elements(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD])); + phpdbg_writeln("Oplines\t\t\t%d", zend_hash_num_elements(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE])); phpdbg_clear_breakpoints(TSRMLS_C); @@ -407,19 +407,19 @@ static PHPDBG_COMMAND(help) /* {{{ */ const phpdbg_command_t *prompt_command = phpdbg_prompt_commands; const phpdbg_command_t *help_command = phpdbg_help_commands; - phpdbg_write("To get help regarding a specific command type \"help command\""); + phpdbg_writeln("To get help regarding a specific command type \"help command\""); phpdbg_notice("Commands"); while (prompt_command && prompt_command->name) { - phpdbg_write("\t%s\t%s", prompt_command->name, prompt_command->tip); + phpdbg_writeln("\t%s\t%s", prompt_command->name, prompt_command->tip); ++prompt_command; } phpdbg_notice("Helpers Loaded"); while (help_command && help_command->name) { - phpdbg_write("\t%s\t%s", help_command->name, help_command->tip); + phpdbg_writeln("\t%s\t%s", help_command->name, help_command->tip); ++help_command; } } @@ -543,7 +543,7 @@ int phpdbg_interactive(TSRMLS_D) /* {{{ */ char cmd[PHPDBG_MAX_CMD]; phpdbg_interactive_enter: - printf(PHPDBG_PROMPT_LINE(TSRMLS_C)); + phpdbg_write(PROMPT); while (!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING) && fgets(cmd, PHPDBG_MAX_CMD, stdin) != NULL) { diff --git a/phpdbg_utils.c b/phpdbg_utils.c index 2a0d976a750..4031b2d209c 100644 --- a/phpdbg_utils.c +++ b/phpdbg_utils.c @@ -96,12 +96,23 @@ void phpdbg_print(int type TSRMLS_DC, const char *format, ...) /* {{{ */ ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "]\033[0m" : "]")); break; - case WRITE: - printf("%s%s%s\n", - ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[37m" : ""), - buffer, - ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[0m" : "")); - break; + case WRITELN: { + if (buffer) { + printf("%s%s%s\n", + ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[37m" : ""), + buffer, + ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[0m" : "")); + } else { + printf("\n"); + } + } break; + + case WRITE: if (buffer) { + printf("%s%s%s", + ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[37m" : ""), + buffer, + ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[0m" : "")); + } break; } if (buffer) { diff --git a/phpdbg_utils.h b/phpdbg_utils.h index d6067a61bf0..e51462c7977 100644 --- a/phpdbg_utils.h +++ b/phpdbg_utils.h @@ -36,6 +36,7 @@ int phpdbg_is_class_method(const char*, size_t, char**, char**); enum { ERROR = 1, NOTICE, + WRITELN, WRITE }; @@ -43,9 +44,13 @@ void phpdbg_print(int TSRMLS_DC, const char*, ...); #define phpdbg_error(fmt, ...) phpdbg_print(ERROR TSRMLS_CC, fmt, ##__VA_ARGS__) #define phpdbg_notice(fmt, ...) phpdbg_print(NOTICE TSRMLS_CC, fmt, ##__VA_ARGS__) +#define phpdbg_writeln(fmt, ...) phpdbg_print(WRITELN TSRMLS_CC, fmt, ##__VA_ARGS__) #define phpdbg_write(fmt, ...) phpdbg_print(WRITE TSRMLS_CC, fmt, ##__VA_ARGS__) /* {{{ For writing blank lines */ #define EMPTY "" /* }}} */ +/* {{{ For prompt lines */ +#define PROMPT ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[1;64mphpdbg>\033[0m " : "phpdbg> ") /* }}} */ + #endif /* PHPDBG_UTILS_H */ From a8285e3bbfb8685a36c370d1d39e435aa2871d96 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 23:43:49 +0000 Subject: [PATCH 177/771] no more printf --- phpdbg.c | 2 +- phpdbg_bp.c | 20 ++++----- phpdbg_help.c | 119 ++++++++++++++++++++++++++------------------------ phpdbg_list.c | 1 + 4 files changed, 73 insertions(+), 69 deletions(-) diff --git a/phpdbg.c b/phpdbg.c index 0cc5d2bcdb4..a4cb98a4516 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -443,7 +443,7 @@ int main(int argc, char **argv) /* {{{ */ /* print blurb */ phpdbg_notice("Welcome to phpdbg, the interactive PHP debugger, v%s", PHPDBG_VERSION); - printf("[To get help using phpdbg type \"help\" and press enter\n"); + phpdbg_writeln("To get help using phpdbg type \"help\" and press enter"); phpdbg_notice("Please report bugs to <%s>", PHPDBG_ISSUES); do { diff --git a/phpdbg_bp.c b/phpdbg_bp.c index f4b3d8ffb17..45ecbc5def9 100644 --- a/phpdbg_bp.c +++ b/phpdbg_bp.c @@ -287,12 +287,12 @@ void phpdbg_print_breakpoints(zend_ulong type TSRMLS_DC) /* {{{ */ phpdbg_breaksymbol_t *brake; PHPDBG_SEP_LINE(TSRMLS_C); - printf("Function Breakpoints:\n"); + phpdbg_writeln("Function Breakpoints:"); for (zend_hash_internal_pointer_reset_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM], &position); zend_hash_get_current_data_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM], (void**) &brake, &position) == SUCCESS; zend_hash_move_forward_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM], &position)) { - printf( - "#%d\t\t%s\n", brake->id, brake->symbol); + phpdbg_writeln( + "#%d\t\t%s", brake->id, brake->symbol); } } break; @@ -304,7 +304,7 @@ void phpdbg_print_breakpoints(zend_ulong type TSRMLS_DC) /* {{{ */ zend_ulong class_idx = 0L; PHPDBG_SEP_LINE(TSRMLS_C); - printf("Method Breakpoints:\n"); + phpdbg_writeln("Method Breakpoints:"); for (zend_hash_internal_pointer_reset_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], &position[0]); zend_hash_get_current_data_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], (void**) &class_table, &position[0]) == SUCCESS; zend_hash_move_forward_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], &position[0])) { @@ -318,8 +318,8 @@ void phpdbg_print_breakpoints(zend_ulong type TSRMLS_DC) /* {{{ */ for (zend_hash_internal_pointer_reset_ex(class_table, &position[1]); zend_hash_get_current_data_ex(class_table, (void**)&brake, &position[1]) == SUCCESS; zend_hash_move_forward_ex(class_table, &position[1])) { - printf( - "#%d\t\t%s::%s\n", brake->id, brake->class_name, brake->func_name); + phpdbg_writeln( + "#%d\t\t%s::%s", brake->id, brake->class_name, brake->func_name); } } @@ -331,7 +331,7 @@ void phpdbg_print_breakpoints(zend_ulong type TSRMLS_DC) /* {{{ */ zend_llist *points; PHPDBG_SEP_LINE(TSRMLS_C); - printf("File Breakpoints:\n"); + phpdbg_writeln("File Breakpoints:"); for (zend_hash_internal_pointer_reset_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE], &position); zend_hash_get_current_data_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE], (void**) &points, &position) == SUCCESS; zend_hash_move_forward_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE], &position)) { @@ -340,7 +340,7 @@ void phpdbg_print_breakpoints(zend_ulong type TSRMLS_DC) /* {{{ */ if ((brake = zend_llist_get_first_ex(points, &lposition))) { do { - printf("#%d\t\t%s:%lu\n", brake->id, brake->filename, brake->line); + phpdbg_writeln("#%d\t\t%s:%lu", brake->id, brake->filename, brake->line); } while ((brake = zend_llist_get_next_ex(points, &lposition))); } } @@ -351,11 +351,11 @@ void phpdbg_print_breakpoints(zend_ulong type TSRMLS_DC) /* {{{ */ phpdbg_breakline_t *brake; PHPDBG_SEP_LINE(TSRMLS_C); - printf("Opline Breakpoints:\n"); + phpdbg_writeln("Opline Breakpoints:"); for (zend_hash_internal_pointer_reset_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], &position); zend_hash_get_current_data_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], (void**) &brake, &position) == SUCCESS; zend_hash_move_forward_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], &position)) { - printf("#%d\t\t%#lx\n", brake->id, brake->opline); + phpdbg_writeln("#%d\t\t%#lx", brake->id, brake->opline); } } break; } diff --git a/phpdbg_help.c b/phpdbg_help.c index 8f8da951aa8..b49f45ac1ec 100644 --- a/phpdbg_help.c +++ b/phpdbg_help.c @@ -20,52 +20,53 @@ #include "phpdbg.h" #include "phpdbg_help.h" #include "phpdbg_print.h" +#include "phpdbg_utils.h" ZEND_EXTERN_MODULE_GLOBALS(phpdbg); PHPDBG_HELP(exec) /* {{{ */ { - printf("Will attempt execution, if compilation has not yet taken place, it occurs now.\n"); - printf("The execution context must be set before execution can take place\n"); + phpdbg_writeln("Will attempt execution, if compilation has not yet taken place, it occurs now."); + phpdbg_writeln("The execution context must be set before execution can take place"); return SUCCESS; } /* }}} */ PHPDBG_HELP(step) /* {{{ */ { - printf("You can enable and disable stepping at any phpdbg prompt during execution\n"); - printf("For example:\n"); - printf("\t%sstepping 1\n", PHPDBG_PROMPT_LINE(TSRMLS_C)); - printf("Will enable stepping\n"); - printf("While stepping is enabled you are presented with a prompt after the execution of each opcode\n"); + phpdbg_writeln("You can enable and disable stepping at any phpdbg prompt during execution"); + phpdbg_writeln("For example:"); + phpdbg_writeln("\t%sstepping 1", PROMPT); + phpdbg_writeln("Will enable stepping"); + phpdbg_writeln("While stepping is enabled you are presented with a prompt after the execution of each opcode"); return SUCCESS; } /* }}} */ PHPDBG_HELP(next) /* {{{ */ { - printf("While stepping through execution, or after a breakpoint, use the next command to step back into the vm and execute the next opcode\n"); + phpdbg_writeln("While stepping through execution, or after a breakpoint, use the next command to step back into the vm and execute the next opcode"); return SUCCESS; } /* }}} */ PHPDBG_HELP(compile) /* {{{ */ { - printf("Pre-compilation of the execution context provides the opportunity to inspect the opcodes before they are executed\n"); - printf("The execution context must be set for compilation to succeed\n"); - printf("If errors occur during compilation they must be resolved before execution can take place.\n"); - printf("It is a good idea to clean the environment between each compilation with the clean command\n"); - printf("You do not need to exit phpdbg to retry compilation\n"); + phpdbg_writeln("Pre-compilation of the execution context provides the opportunity to inspect the opcodes before they are executed"); + phpdbg_writeln("The execution context must be set for compilation to succeed"); + phpdbg_writeln("If errors occur during compilation they must be resolved before execution can take place."); + phpdbg_writeln("It is a good idea to clean the environment between each compilation with the clean command"); + phpdbg_writeln("You do not need to exit phpdbg to retry compilation"); return SUCCESS; } /* }}} */ PHPDBG_HELP(print) /* {{{ */ { - printf("By default, print will show information about the current execution environment\n"); - printf("Specific printers loaded are show below:\n"); - printf("%sCommands%s\n", PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C)); + phpdbg_writeln("By default, print will show information about the current execution environment"); + phpdbg_writeln("Specific printers loaded are show below:"); + phpdbg_notice("Commands"); { - phpdbg_command_t *print_command = phpdbg_print_commands; + const phpdbg_command_t *print_command = phpdbg_print_commands; while (print_command && print_command->name) { - printf("\t%s\t%s\n", print_command->name, print_command->tip); + phpdbg_writeln("\t%s\t%s", print_command->name, print_command->tip); ++print_command; } } @@ -74,80 +75,82 @@ PHPDBG_HELP(print) /* {{{ */ PHPDBG_HELP(run) /* {{{ */ { - printf("Run the code inside the debug vm, you should have break points and variables set before running\n"); - printf("The execution context must not be set, but not necessarily compiled before execution occurs\n"); + phpdbg_writeln("Run the code inside the debug vm, you should have break points and variables set before running"); + phpdbg_writeln("The execution context must not be set, but not necessarily compiled before execution occurs"); return SUCCESS; } /* }}} */ PHPDBG_HELP(eval) /* {{{ */ { - printf("Access to eval() allows you to change the environment during execution, careful though !!\n"); - printf("Note: When using eval in phpdbg do not prefix the code with return.\n"); + phpdbg_writeln("Access to eval() allows you to change the environment during execution, careful though !!"); + phpdbg_writeln("Note: When using eval in phpdbg do not prefix the code with return."); return SUCCESS; } /* }}} */ PHPDBG_HELP(break) /* {{{ */ { - printf("Setting a breakpoint stops execution at a specific stage.\n"); - printf("For example:\n"); - printf("\t%sbreak test.php:1\n", PHPDBG_PROMPT_LINE(TSRMLS_C)); - printf("Will break execution on line 1 of test.php\n"); - printf("\t%sbreak my_function\n", PHPDBG_PROMPT_LINE(TSRMLS_C)); - printf("Will break execution on entry to my_function\n"); - printf("\t%sbreak \\my\\class::method\n", PHPDBG_PROMPT_LINE(TSRMLS_C)); - printf("Will break execution on entry to \\my\\class::method\n"); - printf("\t%sbreak 0x7ff68f570e08\n", PHPDBG_PROMPT_LINE(TSRMLS_C)); - printf("Will break at the opline with the address provided (addresses are shown during execution)\n"); - printf("\t%sbreak 200\n", PHPDBG_PROMPT_LINE(TSRMLS_C)); - printf("Will break at line 200 of the currently executing file\n"); - printf("It is important to note, an address is only valid for the current compiled representation of the script\n"); - printf("If you have to clean the environment and recompile then your opline break points will be invalid\n"); + phpdbg_writeln("Setting a breakpoint stops execution at a specific stage."); + phpdbg_writeln(EMPTY); + phpdbg_writeln("For example:"); + phpdbg_writeln("\t%sbreak test.php:1", PROMPT); + phpdbg_writeln("Will break execution on line 1 of test.php"); + phpdbg_writeln("\t%sbreak my_function", PROMPT); + phpdbg_writeln("Will break execution on entry to my_function"); + phpdbg_writeln("\t%sbreak \\my\\class::method", PROMPT); + phpdbg_writeln("Will break execution on entry to \\my\\class::method"); + phpdbg_writeln("\t%sbreak 0x7ff68f570e08", PROMPT); + phpdbg_writeln("Will break at the opline with the address provided (addresses are shown during execution)"); + phpdbg_writeln("\t%sbreak 200", PROMPT); + phpdbg_writeln("Will break at line 200 of the currently executing file"); + phpdbg_writeln(EMPTY); + phpdbg_writeln("It is important to note, an address is only valid for the current compiled representation of the script"); + phpdbg_writeln("If you have to clean the environment and recompile then your opline break points will be invalid"); return SUCCESS; } /* }}} */ PHPDBG_HELP(clean) /* {{{ */ { - printf("While debugging you may experience errors because of attempts to redeclare classes, constants or functions.\n"); - printf("Cleaning the environment cleans these tables, so that files can be recompiled without exiting phpdbg.\n"); + phpdbg_writeln("While debugging you may experience errors because of attempts to redeclare classes, constants or functions."); + phpdbg_writeln("Cleaning the environment cleans these tables, so that files can be recompiled without exiting phpdbg."); return SUCCESS; } /* }}} */ PHPDBG_HELP(clear) /* {{{ */ { - printf("Clearing breakpoints means you can once again run code without interruption\n"); - printf("Careful though, all breakpoints are lost; be sure debugging is complete before clearing\n"); + phpdbg_writeln("Clearing breakpoints means you can once again run code without interruption"); + phpdbg_writeln("Careful though, all breakpoints are lost; be sure debugging is complete before clearing"); return SUCCESS; } /* }}} */ PHPDBG_HELP(quiet) /* {{{ */ { - printf("Setting quietness on will stop the OPLINE output during execution\n"); - printf("For example:\n"); - printf("\t%squiet 1\n", PHPDBG_PROMPT_LINE(TSRMLS_C)); - printf("Will silence OPLINE output, while\n"); - printf("\t%squiet 0\n", PHPDBG_PROMPT_LINE(TSRMLS_C)); - printf("Will enable OPLINE output again\n"); + phpdbg_writeln("Setting quietness on will stop the OPLINE output during execution"); + phpdbg_writeln("For example:"); + phpdbg_writeln("\t%squiet 1", PROMPT); + phpdbg_writeln("Will silence OPLINE output, while"); + phpdbg_writeln("\t%squiet 0", PROMPT); + phpdbg_writeln("Will enable OPLINE output again"); return SUCCESS; } /* }}} */ PHPDBG_HELP(back) /* {{{ */ { - printf("The backtrace is gathered with the default debug_backtrace functionality.\n"); - printf("You can set the limit on the trace, for example:\n"); - printf("\t%sback 5\n", PHPDBG_PROMPT_LINE(TSRMLS_C)); - printf("Will limit the number of frames to 5, the default is no limit\n"); + phpdbg_writeln("The backtrace is gathered with the default debug_backtrace functionality."); + phpdbg_writeln("You can set the limit on the trace, for example:"); + phpdbg_writeln("\t%sback 5", PROMPT); + phpdbg_writeln("Will limit the number of frames to 5, the default is no limit"); return SUCCESS; } /* }}} */ PHPDBG_HELP(list) /* {{{ */ { - printf("The list command displays N line from current context file.\n"); - printf("\t%slist 2\n", PHPDBG_PROMPT_LINE(TSRMLS_C)); - printf("Will print next 2 lines from the current file\n"); - printf("\t%slist func\n", PHPDBG_PROMPT_LINE(TSRMLS_C)); - printf("Will print the source of the global function \"func\"\n"); - printf("\t%slist .mine\n", PHPDBG_PROMPT_LINE(TSRMLS_C)); - printf("Will print the source of the class method \"mine\"\n"); - printf("Note: before listing functions you must have a populated function table, try compile !!\n"); + phpdbg_writeln("The list command displays N line from current context file."); + phpdbg_writeln("\t%slist 2", PROMPT); + phpdbg_writeln("Will print next 2 lines from the current file"); + phpdbg_writeln("\t%slist func", PROMPT); + phpdbg_writeln("Will print the source of the global function \"func\""); + phpdbg_writeln("\t%slist .mine", PROMPT); + phpdbg_writeln("Will print the source of the class method \"mine\""); + phpdbg_writeln("Note: before listing functions you must have a populated function table, try compile !!"); return SUCCESS; } /* }}} */ diff --git a/phpdbg_list.c b/phpdbg_list.c index 435136cee21..ae0d5c6c58e 100644 --- a/phpdbg_list.c +++ b/phpdbg_list.c @@ -27,6 +27,7 @@ #include #include "phpdbg.h" #include "phpdbg_list.h" +#include "phpdbg_utils.h" void phpdbg_list_file(const char *filename, long count, long offset TSRMLS_DC) /* {{{ */ { From 52040263083b1ab748d850d0a614b8b8bd62ffc4 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Tue, 12 Nov 2013 23:54:41 +0000 Subject: [PATCH 178/771] housework --- phpdbg.h | 13 ------------- phpdbg_bp.c | 8 ++++---- phpdbg_help.c | 6 ++++++ phpdbg_prompt.c | 6 +++--- phpdbg_utils.h | 5 +++-- 5 files changed, 16 insertions(+), 22 deletions(-) diff --git a/phpdbg.h b/phpdbg.h index 9826c8bb940..063cce1f9a9 100644 --- a/phpdbg.h +++ b/phpdbg.h @@ -101,17 +101,4 @@ ZEND_BEGIN_MODULE_GLOBALS(phpdbg) zend_ulong flags; /* phpdbg flags */ ZEND_END_MODULE_GLOBALS(phpdbg) -/* {{{ colourful helpers */ -#define PHPDBG_RED_LINE(TSRMLS_D) \ - ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[1;31m[" : "[") -#define PHPDBG_BOLD_LINE(TSRMLS_D) \ - ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[1;64m[" : "[") -#define PHPDBG_END_LINE(TSRMLS_D) \ - ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "]\033[0m" : "]") -#define PHPDBG_PROMPT_LINE(TSRMLS_D) \ - ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[1;64mphpdbg>\033[0m " : "phpdbg> ") -#define PHPDBG_SEP_LINE(TSRMLS_D) do {\ - printf("%s--------------------------------------%s\n", PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C));\ - } while(0) /* }}} */ - #endif /* PHPDBG_H */ diff --git a/phpdbg_bp.c b/phpdbg_bp.c index 45ecbc5def9..b4defa1e708 100644 --- a/phpdbg_bp.c +++ b/phpdbg_bp.c @@ -286,7 +286,7 @@ void phpdbg_print_breakpoints(zend_ulong type TSRMLS_DC) /* {{{ */ HashPosition position; phpdbg_breaksymbol_t *brake; - PHPDBG_SEP_LINE(TSRMLS_C); + phpdbg_writeln(SEPARATE); phpdbg_writeln("Function Breakpoints:"); for (zend_hash_internal_pointer_reset_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM], &position); zend_hash_get_current_data_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM], (void**) &brake, &position) == SUCCESS; @@ -303,7 +303,7 @@ void phpdbg_print_breakpoints(zend_ulong type TSRMLS_DC) /* {{{ */ zend_uint class_len = 0; zend_ulong class_idx = 0L; - PHPDBG_SEP_LINE(TSRMLS_C); + phpdbg_writeln(SEPARATE); phpdbg_writeln("Method Breakpoints:"); for (zend_hash_internal_pointer_reset_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], &position[0]); zend_hash_get_current_data_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], (void**) &class_table, &position[0]) == SUCCESS; @@ -330,7 +330,7 @@ void phpdbg_print_breakpoints(zend_ulong type TSRMLS_DC) /* {{{ */ HashPosition position; zend_llist *points; - PHPDBG_SEP_LINE(TSRMLS_C); + phpdbg_writeln(SEPARATE); phpdbg_writeln("File Breakpoints:"); for (zend_hash_internal_pointer_reset_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE], &position); zend_hash_get_current_data_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE], (void**) &points, &position) == SUCCESS; @@ -350,7 +350,7 @@ void phpdbg_print_breakpoints(zend_ulong type TSRMLS_DC) /* {{{ */ HashPosition position; phpdbg_breakline_t *brake; - PHPDBG_SEP_LINE(TSRMLS_C); + phpdbg_writeln(SEPARATE); phpdbg_writeln("Opline Breakpoints:"); for (zend_hash_internal_pointer_reset_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], &position); zend_hash_get_current_data_ex(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], (void**) &brake, &position) == SUCCESS; diff --git a/phpdbg_help.c b/phpdbg_help.c index b49f45ac1ec..575061955b6 100644 --- a/phpdbg_help.c +++ b/phpdbg_help.c @@ -34,9 +34,11 @@ PHPDBG_HELP(exec) /* {{{ */ PHPDBG_HELP(step) /* {{{ */ { phpdbg_writeln("You can enable and disable stepping at any phpdbg prompt during execution"); + phpdbg_writeln(EMPTY); phpdbg_writeln("For example:"); phpdbg_writeln("\t%sstepping 1", PROMPT); phpdbg_writeln("Will enable stepping"); + phpdbg_writeln(EMPTY); phpdbg_writeln("While stepping is enabled you are presented with a prompt after the execution of each opcode"); return SUCCESS; } /* }}} */ @@ -125,6 +127,7 @@ PHPDBG_HELP(clear) /* {{{ */ PHPDBG_HELP(quiet) /* {{{ */ { phpdbg_writeln("Setting quietness on will stop the OPLINE output during execution"); + phpdbg_writeln(EMPTY); phpdbg_writeln("For example:"); phpdbg_writeln("\t%squiet 1", PROMPT); phpdbg_writeln("Will silence OPLINE output, while"); @@ -136,6 +139,7 @@ PHPDBG_HELP(quiet) /* {{{ */ PHPDBG_HELP(back) /* {{{ */ { phpdbg_writeln("The backtrace is gathered with the default debug_backtrace functionality."); + phpdbg_writeln(EMPTY); phpdbg_writeln("You can set the limit on the trace, for example:"); phpdbg_writeln("\t%sback 5", PROMPT); phpdbg_writeln("Will limit the number of frames to 5, the default is no limit"); @@ -145,12 +149,14 @@ PHPDBG_HELP(back) /* {{{ */ PHPDBG_HELP(list) /* {{{ */ { phpdbg_writeln("The list command displays N line from current context file."); + phpdbg_writeln(EMPTY); phpdbg_writeln("\t%slist 2", PROMPT); phpdbg_writeln("Will print next 2 lines from the current file"); phpdbg_writeln("\t%slist func", PROMPT); phpdbg_writeln("Will print the source of the global function \"func\""); phpdbg_writeln("\t%slist .mine", PROMPT); phpdbg_writeln("Will print the source of the class method \"mine\""); + phpdbg_writeln(EMPTY); phpdbg_writeln("Note: before listing functions you must have a populated function table, try compile !!"); return SUCCESS; } /* }}} */ diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index fe1c3260869..f221b581eae 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -214,7 +214,7 @@ static PHPDBG_COMMAND(print) /* {{{ */ return SUCCESS; } - PHPDBG_SEP_LINE(TSRMLS_C); + phpdbg_writeln(SEPARATE); phpdbg_notice("Execution Context Information:"); #ifdef HAVE_LIBREADLINE phpdbg_writeln("Readline\tyes"); @@ -249,7 +249,7 @@ static PHPDBG_COMMAND(print) /* {{{ */ phpdbg_print_breakpoints(PHPDBG_BREAK_METHOD TSRMLS_CC); phpdbg_print_breakpoints(PHPDBG_BREAK_OPLINE TSRMLS_CC); - PHPDBG_SEP_LINE(TSRMLS_C); + phpdbg_writeln(SEPARATE); return SUCCESS; } /* }}} */ @@ -553,7 +553,7 @@ phpdbg_interactive_enter: phpdbg_interactive_enter: while (!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING)) { - cmd = readline(PHPDBG_PROMPT_LINE(TSRMLS_C)); + cmd = readline(PROMPT); cmd_len = strlen(cmd); #endif diff --git a/phpdbg_utils.h b/phpdbg_utils.h index e51462c7977..7682201493f 100644 --- a/phpdbg_utils.h +++ b/phpdbg_utils.h @@ -20,8 +20,6 @@ #ifndef PHPDBG_UTILS_H #define PHPDBG_UTILS_H -#include "TSRM.h" - /** * Input scan functions */ @@ -53,4 +51,7 @@ void phpdbg_print(int TSRMLS_DC, const char*, ...); /* {{{ For prompt lines */ #define PROMPT ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[1;64mphpdbg>\033[0m " : "phpdbg> ") /* }}} */ +/* {{{ For separation */ +#define SEPARATE "------------------------------------------------" /* }}} */ + #endif /* PHPDBG_UTILS_H */ From 43c2748dced2a77b34c09c15e403c6970b74e2b2 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Wed, 13 Nov 2013 00:36:47 +0000 Subject: [PATCH 179/771] fix bug in passing correct expression length add class printer (half done) --- phpdbg_print.c | 17 +++++++++++++++++ phpdbg_print.h | 2 ++ phpdbg_prompt.c | 19 +++++++++++-------- phpdbg_utils.c | 16 ++++++++++++++++ phpdbg_utils.h | 6 ++++++ 5 files changed, 52 insertions(+), 8 deletions(-) diff --git a/phpdbg_print.c b/phpdbg_print.c index 37daf028b3c..c0d8fb4dcd1 100644 --- a/phpdbg_print.c +++ b/phpdbg_print.c @@ -34,3 +34,20 @@ PHPDBG_PRINT(opline) /* {{{ */ return SUCCESS; } /* }}} */ + +PHPDBG_PRINT(class) /* {{{ */ +{ + zend_class_entry **ce; + + if (expr && expr_len > 0L) { + if (zend_lookup_class(expr, strlen(expr), &ce TSRMLS_CC) == SUCCESS) { + + } else { + phpdbg_error("Cannot find class %s/%lu", expr, expr_len); + } + } else { + phpdbg_error("No class name provided!"); + } + + return SUCCESS; +} /* }}} */ diff --git a/phpdbg_print.h b/phpdbg_print.h index ae8453bd0ff..2358f0bab4c 100644 --- a/phpdbg_print.h +++ b/phpdbg_print.h @@ -35,12 +35,14 @@ * Printer Forward Declarations */ PHPDBG_PRINT(opline); +PHPDBG_PRINT(class); /** * Commands */ static const phpdbg_command_t phpdbg_print_commands[] = { PHPDBG_PRINT_D(opline, "print the current opline information"), + PHPDBG_PRINT_D(class, "print out the instructions in the specified class"), {NULL, 0, 0} }; diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index f221b581eae..f7cba8cd751 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -513,21 +513,24 @@ static const phpdbg_command_t phpdbg_prompt_commands[] = { int phpdbg_do_cmd(const phpdbg_command_t *command, char *cmd_line, size_t cmd_len TSRMLS_DC) /* {{{ */ { - char *params = NULL; + char *expr = NULL; #ifndef _WIN32 - const char *cmd = strtok_r(cmd_line, " ", ¶ms); + const char *cmd = strtok_r(cmd_line, " ", &expr); #else - const char *cmd = strtok_s(cmd_line, " ", ¶ms); + const char *cmd = strtok_s(cmd_line, " ", &expr); #endif - size_t expr_len = cmd != NULL ? strlen(cmd) : 0; - + size_t expr_len = (cmd != NULL) ? strlen(cmd) : 0; + while (command && command->name) { if (command->name_len == expr_len && memcmp(cmd, command->name, expr_len) == 0) { + PHPDBG_G(last) = (phpdbg_command_t*) command; - PHPDBG_G(last_params) = params; - PHPDBG_G(last_params_len) = cmd_len - expr_len; - return command->handler(params, cmd_len - expr_len TSRMLS_CC); + PHPDBG_G(last_params) = expr; + PHPDBG_G(last_params_len) = ((cmd_len - expr_len) - sizeof(" "))+1; + + return command->handler( + PHPDBG_G(last_params), PHPDBG_G(last_params_len) TSRMLS_CC); } ++command; } diff --git a/phpdbg_utils.c b/phpdbg_utils.c index 4031b2d209c..27ada70ef7b 100644 --- a/phpdbg_utils.c +++ b/phpdbg_utils.c @@ -119,3 +119,19 @@ void phpdbg_print(int type TSRMLS_DC, const char *format, ...) /* {{{ */ efree(buffer); } } /* }}} */ + +char *phpdbg_trim(const char *expr, size_t *expr_len) /* {{{ */ +{ + char *pointer = expr; + + while (*pointer && isspace(*pointer)) { + pointer++; + (*expr_len)--; + } + + while (expr_len > 0L && isspace(pointer[(*expr_len)-1])) { + pointer[--(*expr_len)]='\0'; + } + + return pointer; +} /* }}} */ diff --git a/phpdbg_utils.h b/phpdbg_utils.h index 7682201493f..278019fd1a3 100644 --- a/phpdbg_utils.h +++ b/phpdbg_utils.h @@ -28,6 +28,12 @@ int phpdbg_is_empty(const char*); int phpdbg_is_addr(const char*); int phpdbg_is_class_method(const char*, size_t, char**, char**); +/** + * Input trim function + * NOTE: efree all the things + */ +char *phpdbg_trim(const char*, size_t*); + /** * Error/notice/formatting helper */ From 68cff82d8bd6b046cbac556136b88dd76d6a116b Mon Sep 17 00:00:00 2001 From: krakjoe Date: Wed, 13 Nov 2013 01:35:39 +0000 Subject: [PATCH 180/771] class printer --- phpdbg_opcode.c | 3 ++- phpdbg_print.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++ phpdbg_prompt.c | 2 +- phpdbg_utils.c | 1 + test.php | 1 + 5 files changed, 58 insertions(+), 2 deletions(-) diff --git a/phpdbg_opcode.c b/phpdbg_opcode.c index 5796678cad1..39a51692b19 100644 --- a/phpdbg_opcode.c +++ b/phpdbg_opcode.c @@ -191,6 +191,7 @@ const char *phpdbg_decode_opcode(zend_uchar opcode) /* {{{ */ CASE(ZEND_RECV_VARIADIC); #endif CASE(ZEND_OP_DATA); - default: return "UNKNOWN"; + default: + return "UNKNOWN"; } } /* }}} */ diff --git a/phpdbg_print.c b/phpdbg_print.c index c0d8fb4dcd1..f5cbbd3eec7 100644 --- a/phpdbg_print.c +++ b/phpdbg_print.c @@ -20,6 +20,7 @@ #include "phpdbg.h" #include "phpdbg_print.h" #include "phpdbg_utils.h" +#include "phpdbg_opcode.h" ZEND_EXTERN_MODULE_GLOBALS(phpdbg); @@ -41,7 +42,59 @@ PHPDBG_PRINT(class) /* {{{ */ if (expr && expr_len > 0L) { if (zend_lookup_class(expr, strlen(expr), &ce TSRMLS_CC) == SUCCESS) { + phpdbg_notice( + "%s %s: %s", + ((*ce)->type == ZEND_USER_CLASS) ? + "User" : "Internal", + ((*ce)->ce_flags & ZEND_ACC_INTERFACE) ? + "Interface" : + ((*ce)->ce_flags & ZEND_ACC_ABSTRACT) ? + "Abstract Class" : + "Class", + (*ce)->name); + phpdbg_writeln("Methods (%d):", zend_hash_num_elements(&(*ce)->function_table)); + if (zend_hash_num_elements(&(*ce)->function_table)) { + HashPosition position; + zend_function *method; + + for (zend_hash_internal_pointer_reset_ex(&(*ce)->function_table, &position); + zend_hash_get_current_data_ex(&(*ce)->function_table, (void**) &method, &position) == SUCCESS; + zend_hash_move_forward_ex(&(*ce)->function_table, &position)) { + switch (method->type) { + case ZEND_USER_FUNCTION: { + zend_op_array* op_array = &method->op_array; + + if (op_array) { + zend_op *opline = &op_array->opcodes[0]; + zend_uint opcode = 0, + end = op_array->last-1; + + phpdbg_writeln( + "\t%s::%s() in %s:%d-%d", + (*ce)->name, method->common.function_name, + op_array->filename ? op_array->filename : "unknown", + op_array->line_start, op_array->line_end); + + do { + char *decode = phpdbg_decode_opcode(opline->opcode); + if (decode != NULL) { + phpdbg_writeln( + "\t\t%p:%s", opline, decode); + } else phpdbg_error("\tFailed to decode opline @ %ld", opline); + + opline++; + } while (++opcode < end); + } + } break; + + default: { + phpdbg_writeln( + "\tInternal Method %s::%s()", (*ce)->name, method->common.function_name); + } + } + } + } } else { phpdbg_error("Cannot find class %s/%lu", expr, expr_len); } diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index f7cba8cd751..d2cd8be7a8a 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -547,7 +547,7 @@ int phpdbg_interactive(TSRMLS_D) /* {{{ */ phpdbg_interactive_enter: phpdbg_write(PROMPT); - + while (!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING) && fgets(cmd, PHPDBG_MAX_CMD, stdin) != NULL) { cmd_len = strlen(cmd) - 1; diff --git a/phpdbg_utils.c b/phpdbg_utils.c index 27ada70ef7b..3c8606cc22f 100644 --- a/phpdbg_utils.c +++ b/phpdbg_utils.c @@ -23,6 +23,7 @@ #include "php.h" #include "spprintf.h" #include "phpdbg.h" +#include "phpdbg_opcode.h" #include "phpdbg_utils.h" ZEND_EXTERN_MODULE_GLOBALS(phpdbg); diff --git a/test.php b/test.php index 457e487db70..0f240e1618f 100644 --- a/test.php +++ b/test.php @@ -2,6 +2,7 @@ class my { public function method() { + echo "Hello"; return $this; } } From 0781e7b86389d88bbbc28e4dfa21344cc02ae679 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Wed, 13 Nov 2013 01:44:59 +0000 Subject: [PATCH 181/771] fix segfault on set break opline address --- phpdbg_bp.c | 2 +- phpdbg_print.c | 2 +- phpdbg_utils.c | 10 ++++++---- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/phpdbg_bp.c b/phpdbg_bp.c index b4defa1e708..988898f22ed 100644 --- a/phpdbg_bp.c +++ b/phpdbg_bp.c @@ -143,7 +143,7 @@ void phpdbg_set_breakpoint_opline(zend_ulong opline TSRMLS_DC) /* {{{ */ zend_hash_index_update(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], opline, &new_break, sizeof(phpdbg_breakline_t), NULL); - phpdbg_notice("Breakpoint #%d added at %#lx%s", + phpdbg_notice("Breakpoint #%d added at %#lx", new_break.id, new_break.opline); } else { phpdbg_notice("Breakpoint exists at %#lx", opline); diff --git a/phpdbg_print.c b/phpdbg_print.c index f5cbbd3eec7..2c4c7ab5bff 100644 --- a/phpdbg_print.c +++ b/phpdbg_print.c @@ -90,7 +90,7 @@ PHPDBG_PRINT(class) /* {{{ */ default: { phpdbg_writeln( - "\tInternal Method %s::%s()", (*ce)->name, method->common.function_name); + "\tInternal %s::%s()", (*ce)->name, method->common.function_name); } } } diff --git a/phpdbg_utils.c b/phpdbg_utils.c index 3c8606cc22f..fb2253528b7 100644 --- a/phpdbg_utils.c +++ b/phpdbg_utils.c @@ -74,11 +74,13 @@ int phpdbg_is_class_method(const char *str, size_t len, char **class, char **met void phpdbg_print(int type TSRMLS_DC, const char *format, ...) /* {{{ */ { char *buffer = NULL; - va_list args; + va_list args = {0}; - va_start(args, format); - vspprintf(&buffer, 0, format, args); - va_end(args); + if (format != NULL && strlen(format) > 0L) { + va_start(args, format); + vspprintf(&buffer, 0, format, args); + va_end(args); + } /* TODO(anyone) colours */ From efee212045fa151886613d1b11cd4d2c6e74441c Mon Sep 17 00:00:00 2001 From: krakjoe Date: Wed, 13 Nov 2013 02:26:37 +0000 Subject: [PATCH 182/771] class/func printers --- phpdbg_print.c | 127 ++++++++++++++++++++++++++++++++++++------------- phpdbg_print.h | 2 + 2 files changed, 96 insertions(+), 33 deletions(-) diff --git a/phpdbg_print.c b/phpdbg_print.c index 2c4c7ab5bff..8b2f520cbbd 100644 --- a/phpdbg_print.c +++ b/phpdbg_print.c @@ -36,6 +36,56 @@ PHPDBG_PRINT(opline) /* {{{ */ return SUCCESS; } /* }}} */ +static inline phpdbg_print_function_helper(zend_function *method TSRMLS_DC) { + switch (method->type) { + case ZEND_USER_FUNCTION: { + zend_op_array* op_array = &method->op_array; + + if (op_array) { + zend_op *opline = &op_array->opcodes[0]; + zend_uint opcode = 0, + end = op_array->last-1; + + if (method->common.scope) { + phpdbg_writeln( + "\t#%d-%d %s::%s() %s", + op_array->line_start, op_array->line_end, + method->common.scope->name, + method->common.function_name, + op_array->filename ? op_array->filename : "unknown"); + } else { + phpdbg_writeln( + "\t#%d-%d %s() %s", + op_array->line_start, op_array->line_end, + method->common.function_name, + op_array->filename ? op_array->filename : "unknown"); + } + + + do { + char *decode = phpdbg_decode_opcode(opline->opcode); + if (decode != NULL) { + phpdbg_writeln( + "\t\t#%lu\t%p %s", opline->lineno, opline, decode); + } else phpdbg_error("\tFailed to decode opline @ %ld", opline); + + opline++; + } while (++opcode < end); + } + } break; + + default: { + if (method->common.scope) { + phpdbg_writeln( + "\tInternal %s::%s()", method->common.scope->name, method->common.function_name); + } else { + phpdbg_writeln( + "\tInternal %s()", method->common.function_name); + } + } + } +} + PHPDBG_PRINT(class) /* {{{ */ { zend_class_entry **ce; @@ -61,42 +111,11 @@ PHPDBG_PRINT(class) /* {{{ */ for (zend_hash_internal_pointer_reset_ex(&(*ce)->function_table, &position); zend_hash_get_current_data_ex(&(*ce)->function_table, (void**) &method, &position) == SUCCESS; zend_hash_move_forward_ex(&(*ce)->function_table, &position)) { - switch (method->type) { - case ZEND_USER_FUNCTION: { - zend_op_array* op_array = &method->op_array; - - if (op_array) { - zend_op *opline = &op_array->opcodes[0]; - zend_uint opcode = 0, - end = op_array->last-1; - - phpdbg_writeln( - "\t%s::%s() in %s:%d-%d", - (*ce)->name, method->common.function_name, - op_array->filename ? op_array->filename : "unknown", - op_array->line_start, op_array->line_end); - - do { - char *decode = phpdbg_decode_opcode(opline->opcode); - if (decode != NULL) { - phpdbg_writeln( - "\t\t%p:%s", opline, decode); - } else phpdbg_error("\tFailed to decode opline @ %ld", opline); - - opline++; - } while (++opcode < end); - } - } break; - - default: { - phpdbg_writeln( - "\tInternal %s::%s()", (*ce)->name, method->common.function_name); - } - } + phpdbg_print_function_helper(method TSRMLS_CC); } } } else { - phpdbg_error("Cannot find class %s/%lu", expr, expr_len); + phpdbg_error("Cannot find class %s", expr); } } else { phpdbg_error("No class name provided!"); @@ -104,3 +123,45 @@ PHPDBG_PRINT(class) /* {{{ */ return SUCCESS; } /* }}} */ + +PHPDBG_PRINT(func) /* {{{ */ +{ + if (expr && expr_len > 0L) { + HashTable *func_table = EG(function_table); + zend_function* fbc; + const char *func_name = expr; + size_t func_name_len = expr_len; + + /* search active scope if begins with period */ + if (func_name[0] == '.') { + if (EG(scope)) { + func_name++; + func_name_len--; + + func_table = &EG(scope)->function_table; + } else { + phpdbg_error("No active class"); + return FAILURE; + } + } else if (!EG(function_table)) { + phpdbg_error("No function table loaded"); + return SUCCESS; + } else { + func_table = EG(function_table); + } + + if (zend_hash_find(func_table, func_name, func_name_len+1, (void**)&fbc) == SUCCESS) { + phpdbg_notice( + "%s Function %s", + (fbc->type == ZEND_USER_FUNCTION) ? "User" : "Internal", + fbc->common.function_name); + + phpdbg_print_function_helper(fbc TSRMLS_CC); + } else { + phpdbg_error("Function %s not found", func_name); + } + } else { + phpdbg_error("No function name provided"); + } + return SUCCESS; +} /* }}} */ diff --git a/phpdbg_print.h b/phpdbg_print.h index 2358f0bab4c..0af042b1bf5 100644 --- a/phpdbg_print.h +++ b/phpdbg_print.h @@ -36,6 +36,7 @@ */ PHPDBG_PRINT(opline); PHPDBG_PRINT(class); +PHPDBG_PRINT(func); /** * Commands @@ -43,6 +44,7 @@ PHPDBG_PRINT(class); static const phpdbg_command_t phpdbg_print_commands[] = { PHPDBG_PRINT_D(opline, "print the current opline information"), PHPDBG_PRINT_D(class, "print out the instructions in the specified class"), + PHPDBG_PRINT_D(func, "print out the instructions in the specified function"), {NULL, 0, 0} }; From 94e887cf2a9516970bc340630cec4f334f376150 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Wed, 13 Nov 2013 02:39:02 +0000 Subject: [PATCH 183/771] ... --- phpdbg_prompt.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index d2cd8be7a8a..c3653d0284a 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -207,9 +207,9 @@ static PHPDBG_COMMAND(back) /* {{{ */ static PHPDBG_COMMAND(print) /* {{{ */ { - if (expr_len > 0L) { + if (expr && expr_len > 0L) { if (phpdbg_do_cmd(phpdbg_print_commands, (char*)expr, expr_len TSRMLS_CC) == FAILURE) { - phpdbg_error("Failed to find print command: %s/%u", expr, expr_len); + phpdbg_error("Failed to find print command %s", expr); } return SUCCESS; } @@ -527,7 +527,8 @@ int phpdbg_do_cmd(const phpdbg_command_t *command, char *cmd_line, size_t cmd_le PHPDBG_G(last) = (phpdbg_command_t*) command; PHPDBG_G(last_params) = expr; - PHPDBG_G(last_params_len) = ((cmd_len - expr_len) - sizeof(" "))+1; + PHPDBG_G(last_params_len) = (cmd_len - expr_len) ? + (((cmd_len - expr_len) - sizeof(" "))+1) : 0; return command->handler( PHPDBG_G(last_params), PHPDBG_G(last_params_len) TSRMLS_CC); From 0ade5f0d9d9fc1fe40a9cbaa721e5cea685fdab5 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Wed, 13 Nov 2013 02:43:09 +0000 Subject: [PATCH 184/771] fix list length lookup --- phpdbg_prompt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index c3653d0284a..5996bc23b37 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -481,7 +481,7 @@ static PHPDBG_COMMAND(list) /* {{{ */ func_table = EG(function_table); } - if (zend_hash_find(func_table, func_name, func_name_len, + if (zend_hash_find(func_table, func_name, func_name_len+1, (void**)&fbc) == SUCCESS) { phpdbg_list_function(fbc TSRMLS_CC); } else { From fec3b77a0ff2b986723acf92e1b75e774f1f3753 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Wed, 13 Nov 2013 02:48:22 +0000 Subject: [PATCH 185/771] ... --- phpdbg_prompt.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 5996bc23b37..fbdd7def791 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -215,7 +215,7 @@ static PHPDBG_COMMAND(print) /* {{{ */ } phpdbg_writeln(SEPARATE); - phpdbg_notice("Execution Context Information:"); + phpdbg_notice("Execution Context Information"); #ifdef HAVE_LIBREADLINE phpdbg_writeln("Readline\tyes"); #else @@ -401,7 +401,7 @@ static PHPDBG_COMMAND(help) /* {{{ */ if (expr_len > 0L) { if (phpdbg_do_cmd(phpdbg_help_commands, (char*)expr, expr_len TSRMLS_CC) == FAILURE) { - phpdbg_error("Failed to find help command: %s/%lu", expr, expr_len); + phpdbg_error("Failed to find help command: %s", expr); } } else { const phpdbg_command_t *prompt_command = phpdbg_prompt_commands; From 2464629b5c43ff7d02ba98588f38971526538619 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Wed, 13 Nov 2013 02:50:00 +0000 Subject: [PATCH 186/771] fix --- phpdbg_prompt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index fbdd7def791..30f8e8adf45 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -158,7 +158,7 @@ static PHPDBG_COMMAND(eval) /* {{{ */ /* disable stepping while eval() in progress */ PHPDBG_G(flags) &= ~ PHPDBG_IS_STEPPING; - if (zend_eval_stringl((char*)expr, expr_len-1, + if (zend_eval_stringl((char*)expr, expr_len, &retval, "eval()'d code" TSRMLS_CC) == SUCCESS) { zend_print_zval_r(&retval, 0 TSRMLS_CC); zval_dtor(&retval); From 0354bab777b9c08ee6aac34a64f6cdbd6c9dc9cd Mon Sep 17 00:00:00 2001 From: krakjoe Date: Wed, 13 Nov 2013 02:59:10 +0000 Subject: [PATCH 187/771] ... --- phpdbg_help.c | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/phpdbg_help.c b/phpdbg_help.c index 575061955b6..78d12c82a8a 100644 --- a/phpdbg_help.c +++ b/phpdbg_help.c @@ -35,7 +35,7 @@ PHPDBG_HELP(step) /* {{{ */ { phpdbg_writeln("You can enable and disable stepping at any phpdbg prompt during execution"); phpdbg_writeln(EMPTY); - phpdbg_writeln("For example:"); + phpdbg_writeln("Examples:"); phpdbg_writeln("\t%sstepping 1", PROMPT); phpdbg_writeln("Will enable stepping"); phpdbg_writeln(EMPTY); @@ -62,6 +62,16 @@ PHPDBG_HELP(compile) /* {{{ */ PHPDBG_HELP(print) /* {{{ */ { phpdbg_writeln("By default, print will show information about the current execution environment"); + phpdbg_writeln("Other printing commands give access to address, file and line information"); + phpdbg_writeln(EMPTY); + phpdbg_writeln("Examples:"); + phpdbg_writeln("\t%sprint class \\my\\class", PROMPT); + phpdbg_writeln("Will print information about \\my\\class, including the instructions for every method and their address"); + phpdbg_writeln("\t%sprint func .getSomething", PROMPT); + phpdbg_writeln("Will print the instructions for the method getSomething in the currently active scope"); + phpdbg_writeln("\t%sprint opline", PROMPT); + phpdbg_writeln("Will print the instruction for the current opline"); + phpdbg_writeln(EMPTY); phpdbg_writeln("Specific printers loaded are show below:"); phpdbg_notice("Commands"); { @@ -93,7 +103,7 @@ PHPDBG_HELP(break) /* {{{ */ { phpdbg_writeln("Setting a breakpoint stops execution at a specific stage."); phpdbg_writeln(EMPTY); - phpdbg_writeln("For example:"); + phpdbg_writeln("Examples:"); phpdbg_writeln("\t%sbreak test.php:1", PROMPT); phpdbg_writeln("Will break execution on line 1 of test.php"); phpdbg_writeln("\t%sbreak my_function", PROMPT); @@ -128,11 +138,13 @@ PHPDBG_HELP(quiet) /* {{{ */ { phpdbg_writeln("Setting quietness on will stop the OPLINE output during execution"); phpdbg_writeln(EMPTY); - phpdbg_writeln("For example:"); + phpdbg_writeln("Examples:"); phpdbg_writeln("\t%squiet 1", PROMPT); phpdbg_writeln("Will silence OPLINE output, while"); phpdbg_writeln("\t%squiet 0", PROMPT); phpdbg_writeln("Will enable OPLINE output again"); + phpdbg_writeln(EMPTY); + phpdbg_writeln("Quietness is disabled while stepping through execution automatically"); return SUCCESS; } /* }}} */ @@ -140,7 +152,8 @@ PHPDBG_HELP(back) /* {{{ */ { phpdbg_writeln("The backtrace is gathered with the default debug_backtrace functionality."); phpdbg_writeln(EMPTY); - phpdbg_writeln("You can set the limit on the trace, for example:"); + phpdbg_writeln("Examples:"); + phpdbg_writeln("You can set the limit on the trace"); phpdbg_writeln("\t%sback 5", PROMPT); phpdbg_writeln("Will limit the number of frames to 5, the default is no limit"); return SUCCESS; @@ -150,6 +163,7 @@ PHPDBG_HELP(list) /* {{{ */ { phpdbg_writeln("The list command displays N line from current context file."); phpdbg_writeln(EMPTY); + phpdbg_writeln("Examples:"); phpdbg_writeln("\t%slist 2", PROMPT); phpdbg_writeln("Will print next 2 lines from the current file"); phpdbg_writeln("\t%slist func", PROMPT); From 60a8d908ce0735ec3973ec3d62aafbfeab52e8f2 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Wed, 13 Nov 2013 03:04:47 +0000 Subject: [PATCH 188/771] ... --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e9f7fbe4b55..1ed77d9b7ec 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ Features ======== - Stepthrough Debugging - - Flexible Breakpoints (Class Method, Function, File:Line, internally Opline) + - Flexible Breakpoints (Class Method, Function, File:Line, Address) - Easy Access to PHP with built-in eval() - Easy Access to Currently Executing Code - Userland API From 176f995c245c3cf89a06e9f4e6f88a27a5ce1f08 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Wed, 13 Nov 2013 04:04:41 +0000 Subject: [PATCH 189/771] activate globals --- phpdbg.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/phpdbg.c b/phpdbg.c index a4cb98a4516..24c5c1078a1 100644 --- a/phpdbg.c +++ b/phpdbg.c @@ -439,6 +439,10 @@ int main(int argc, char **argv) /* {{{ */ zend_try { zend_activate_modules(TSRMLS_C); } zend_end_try(); + + zend_try { + zend_activate_auto_globals(TSRMLS_C); + } zend_end_try(); /* print blurb */ phpdbg_notice("Welcome to phpdbg, the interactive PHP debugger, v%s", @@ -446,6 +450,7 @@ int main(int argc, char **argv) /* {{{ */ phpdbg_writeln("To get help using phpdbg type \"help\" and press enter"); phpdbg_notice("Please report bugs to <%s>", PHPDBG_ISSUES); + do { zend_try { phpdbg_interactive(TSRMLS_C); From a6d08af06b8ee4e9b3f6486fb2da7cfc69472965 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Wed, 13 Nov 2013 04:20:39 +0000 Subject: [PATCH 190/771] fix leak from readline --- phpdbg_prompt.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 30f8e8adf45..951fe1d39b8 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -594,6 +594,12 @@ phpdbg_interactive_enter: } if (!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING)) { +#ifdef HAVE_LIBREADLINE + if (cmd) { + free(cmd); + cmd = NULL; + } +#endif goto phpdbg_interactive_enter; } } From 63a0c1ca15f695f648dbed477e8c0dda8c85fdb7 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Wed, 13 Nov 2013 04:34:02 +0000 Subject: [PATCH 191/771] ... --- phpdbg_prompt.c | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 951fe1d39b8..012fdd73cc9 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -563,7 +563,7 @@ phpdbg_interactive_enter: #endif /* trim space from end of input */ - while (isspace(cmd[cmd_len-1])) + while (*cmd && isspace(cmd[cmd_len-1])) cmd_len--; /* ensure string is null terminated */ @@ -588,21 +588,29 @@ phpdbg_interactive_enter: return PHPDBG_NEXT; } } - } else if (PHPDBG_G(last)) { - PHPDBG_G(last)->handler( - PHPDBG_G(last_params), PHPDBG_G(last_params_len) TSRMLS_CC); - } - - if (!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING)) { + #ifdef HAVE_LIBREADLINE if (cmd) { free(cmd); cmd = NULL; } #endif + + } else if (PHPDBG_G(last)) { + PHPDBG_G(last)->handler( + PHPDBG_G(last_params), PHPDBG_G(last_params_len) TSRMLS_CC); + } + + if (!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING)) { goto phpdbg_interactive_enter; } } + +#ifdef HAVE_LIBREADLINE + if (cmd) { + free(cmd); + } +#endif return SUCCESS; } /* }}} */ From 88ad7f92791f7578656b3a9e0de5a78e7dd66e86 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Wed, 13 Nov 2013 04:47:07 +0000 Subject: [PATCH 192/771] more detailed opline --- phpdbg_prompt.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 012fdd73cc9..f9b1bf57936 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -623,9 +623,11 @@ void phpdbg_print_opline(zend_execute_data *execute_data, zend_bool ignore_flags (PHPDBG_G(flags) & PHPDBG_IS_STEPPING))) { zend_op *opline = execute_data->opline; - - phpdbg_notice("OPLINE: %p:%s", - opline, phpdbg_decode_opcode(opline->opcode)); + /* output line info */ + phpdbg_notice("#%lu %p %s %s", + opline->lineno, + opline, phpdbg_decode_opcode(opline->opcode), + execute_data->op_array->filename ? execute_data->op_array->filename : "unknown"); } } /* }}} */ From 99bbc8e8118804367cf4a77f0c9b66118135229f Mon Sep 17 00:00:00 2001 From: krakjoe Date: Wed, 13 Nov 2013 05:36:01 +0000 Subject: [PATCH 193/771] method printer --- phpdbg_print.c | 38 +++++++++++++++++++++++++++++++++++++- phpdbg_print.h | 4 +++- phpdbg_prompt.c | 21 ++++++++------------- phpdbg_utils.c | 18 +----------------- phpdbg_utils.h | 6 ------ 5 files changed, 49 insertions(+), 38 deletions(-) diff --git a/phpdbg_print.c b/phpdbg_print.c index 8b2f520cbbd..6ef3d4c37f3 100644 --- a/phpdbg_print.c +++ b/phpdbg_print.c @@ -124,6 +124,41 @@ PHPDBG_PRINT(class) /* {{{ */ return SUCCESS; } /* }}} */ +PHPDBG_PRINT(method) /* {{{ */ +{ + if (expr && expr_len > 0L) { + char *class_name = NULL; + char *func_name = NULL; + + if (phpdbg_is_class_method(expr, expr_len, &class_name, &func_name)) { + zend_class_entry **ce; + + if (zend_lookup_class(class_name, strlen(class_name), &ce TSRMLS_CC) == SUCCESS) { + zend_function *fbc; + + if (zend_hash_find(&(*ce)->function_table, func_name, strlen(func_name), (void**)&fbc) == SUCCESS) { + phpdbg_notice( + "%s Method %s", + (fbc->type == ZEND_USER_FUNCTION) ? "User" : "Internal", + fbc->common.function_name); + + phpdbg_print_function_helper(fbc TSRMLS_CC); + } else { + phpdbg_error("The method %s could not be found", func_name); + } + } + + efree(class_name); + efree(func_name); + } else { + phpdbg_error("The expression provided is not a valid method %s", expr); + } + } else { + phpdbg_error("No expression provided"); + } + return SUCCESS; +} /* }}} */ + PHPDBG_PRINT(func) /* {{{ */ { if (expr && expr_len > 0L) { @@ -152,8 +187,9 @@ PHPDBG_PRINT(func) /* {{{ */ if (zend_hash_find(func_table, func_name, func_name_len+1, (void**)&fbc) == SUCCESS) { phpdbg_notice( - "%s Function %s", + "%s %s %s", (fbc->type == ZEND_USER_FUNCTION) ? "User" : "Internal", + (fbc->common.scope) ? "Method" : "Function", fbc->common.function_name); phpdbg_print_function_helper(fbc TSRMLS_CC); diff --git a/phpdbg_print.h b/phpdbg_print.h index 0af042b1bf5..d906ab0230d 100644 --- a/phpdbg_print.h +++ b/phpdbg_print.h @@ -36,6 +36,7 @@ */ PHPDBG_PRINT(opline); PHPDBG_PRINT(class); +PHPDBG_PRINT(method); PHPDBG_PRINT(func); /** @@ -44,8 +45,9 @@ PHPDBG_PRINT(func); static const phpdbg_command_t phpdbg_print_commands[] = { PHPDBG_PRINT_D(opline, "print the current opline information"), PHPDBG_PRINT_D(class, "print out the instructions in the specified class"), + PHPDBG_PRINT_D(method, "print out the instructions in the specified method"), PHPDBG_PRINT_D(func, "print out the instructions in the specified function"), - {NULL, 0, 0} + {0, 0, 0, 0} }; #endif /* PHPDBG_PRINT_H */ diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index f9b1bf57936..60982a9d805 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -208,7 +208,8 @@ static PHPDBG_COMMAND(back) /* {{{ */ static PHPDBG_COMMAND(print) /* {{{ */ { if (expr && expr_len > 0L) { - if (phpdbg_do_cmd(phpdbg_print_commands, (char*)expr, expr_len TSRMLS_CC) == FAILURE) { + if (phpdbg_print_commands && + phpdbg_do_cmd(phpdbg_print_commands, (char*)expr, expr_len TSRMLS_CC) == FAILURE) { phpdbg_error("Failed to find print command %s", expr); } return SUCCESS; @@ -521,7 +522,7 @@ int phpdbg_do_cmd(const phpdbg_command_t *command, char *cmd_line, size_t cmd_le #endif size_t expr_len = (cmd != NULL) ? strlen(cmd) : 0; - while (command && command->name) { + while (command && command->name && command->handler) { if (command->name_len == expr_len && memcmp(cmd, command->name, expr_len) == 0) { @@ -546,20 +547,19 @@ int phpdbg_interactive(TSRMLS_D) /* {{{ */ #ifndef HAVE_LIBREADLINE char cmd[PHPDBG_MAX_CMD]; -phpdbg_interactive_enter: - phpdbg_write(PROMPT); - while (!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING) && - fgets(cmd, PHPDBG_MAX_CMD, stdin) != NULL) { + phpdbg_write(PROMPT) && + (fgets(cmd, PHPDBG_MAX_CMD, stdin) != NULL)) { cmd_len = strlen(cmd) - 1; #else char *cmd = NULL; -phpdbg_interactive_enter: while (!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING)) { cmd = readline(PROMPT); - cmd_len = strlen(cmd); + if (cmd) { + cmd_len = strlen(cmd); + } else cmd_len = 0L; #endif /* trim space from end of input */ @@ -595,15 +595,10 @@ phpdbg_interactive_enter: cmd = NULL; } #endif - } else if (PHPDBG_G(last)) { PHPDBG_G(last)->handler( PHPDBG_G(last_params), PHPDBG_G(last_params_len) TSRMLS_CC); } - - if (!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING)) { - goto phpdbg_interactive_enter; - } } #ifdef HAVE_LIBREADLINE diff --git a/phpdbg_utils.c b/phpdbg_utils.c index fb2253528b7..b567850c2cd 100644 --- a/phpdbg_utils.c +++ b/phpdbg_utils.c @@ -74,7 +74,7 @@ int phpdbg_is_class_method(const char *str, size_t len, char **class, char **met void phpdbg_print(int type TSRMLS_DC, const char *format, ...) /* {{{ */ { char *buffer = NULL; - va_list args = {0}; + va_list args; if (format != NULL && strlen(format) > 0L) { va_start(args, format); @@ -122,19 +122,3 @@ void phpdbg_print(int type TSRMLS_DC, const char *format, ...) /* {{{ */ efree(buffer); } } /* }}} */ - -char *phpdbg_trim(const char *expr, size_t *expr_len) /* {{{ */ -{ - char *pointer = expr; - - while (*pointer && isspace(*pointer)) { - pointer++; - (*expr_len)--; - } - - while (expr_len > 0L && isspace(pointer[(*expr_len)-1])) { - pointer[--(*expr_len)]='\0'; - } - - return pointer; -} /* }}} */ diff --git a/phpdbg_utils.h b/phpdbg_utils.h index 278019fd1a3..7682201493f 100644 --- a/phpdbg_utils.h +++ b/phpdbg_utils.h @@ -28,12 +28,6 @@ int phpdbg_is_empty(const char*); int phpdbg_is_addr(const char*); int phpdbg_is_class_method(const char*, size_t, char**, char**); -/** - * Input trim function - * NOTE: efree all the things - */ -char *phpdbg_trim(const char*, size_t*); - /** * Error/notice/formatting helper */ From b6c4fbee1b4e0fbfea56d335142a917b40b42a25 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Wed, 13 Nov 2013 05:39:18 +0000 Subject: [PATCH 194/771] ... --- phpdbg_print.c | 2 +- phpdbg_utils.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/phpdbg_print.c b/phpdbg_print.c index 6ef3d4c37f3..1524ec5bf9d 100644 --- a/phpdbg_print.c +++ b/phpdbg_print.c @@ -136,7 +136,7 @@ PHPDBG_PRINT(method) /* {{{ */ if (zend_lookup_class(class_name, strlen(class_name), &ce TSRMLS_CC) == SUCCESS) { zend_function *fbc; - if (zend_hash_find(&(*ce)->function_table, func_name, strlen(func_name), (void**)&fbc) == SUCCESS) { + if (zend_hash_find(&(*ce)->function_table, func_name, strlen(func_name)+1, (void**)&fbc) == SUCCESS) { phpdbg_notice( "%s Method %s", (fbc->type == ZEND_USER_FUNCTION) ? "User" : "Internal", diff --git a/phpdbg_utils.c b/phpdbg_utils.c index b567850c2cd..df37df088e1 100644 --- a/phpdbg_utils.c +++ b/phpdbg_utils.c @@ -64,7 +64,7 @@ int phpdbg_is_class_method(const char *str, size_t len, char **class, char **met } *class = estrndup(str, sep - str); - class[sep - str] = 0; + (*class)[sep - str] = 0; *method = estrndup(sep+2, str + len - (sep + 2)); From 5e266f34fc4b45be6ee04749d62bb379bef2c692 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Wed, 13 Nov 2013 08:05:26 +0000 Subject: [PATCH 195/771] non readline fixes --- phpdbg_help.c | 4 ++++ phpdbg_print.c | 2 ++ phpdbg_prompt.c | 5 ++--- phpdbg_utils.c | 39 +++++++++++++++++++++------------------ phpdbg_utils.h | 2 +- 5 files changed, 30 insertions(+), 22 deletions(-) diff --git a/phpdbg_help.c b/phpdbg_help.c index 78d12c82a8a..c337ec92142 100644 --- a/phpdbg_help.c +++ b/phpdbg_help.c @@ -67,8 +67,12 @@ PHPDBG_HELP(print) /* {{{ */ phpdbg_writeln("Examples:"); phpdbg_writeln("\t%sprint class \\my\\class", PROMPT); phpdbg_writeln("Will print information about \\my\\class, including the instructions for every method and their address"); + phpdbg_writeln("\t%sprint method \\my\\class::method", PROMPT); + phpdbg_writeln("Will print the instructions for \\my\\class::method"); phpdbg_writeln("\t%sprint func .getSomething", PROMPT); phpdbg_writeln("Will print the instructions for the method getSomething in the currently active scope"); + phpdbg_writeln("\t%sprint func my_function", PROMPT); + phpdbg_writeln("Will print the instructions for the global function my_function"); phpdbg_writeln("\t%sprint opline", PROMPT); phpdbg_writeln("Will print the instruction for the current opline"); phpdbg_writeln(EMPTY); diff --git a/phpdbg_print.c b/phpdbg_print.c index 1524ec5bf9d..600d8f2795c 100644 --- a/phpdbg_print.c +++ b/phpdbg_print.c @@ -146,6 +146,8 @@ PHPDBG_PRINT(method) /* {{{ */ } else { phpdbg_error("The method %s could not be found", func_name); } + } else { + phpdbg_error("Failed to find the requested class %s", class_name); } efree(class_name); diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 60982a9d805..85c5345fcc8 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -208,8 +208,7 @@ static PHPDBG_COMMAND(back) /* {{{ */ static PHPDBG_COMMAND(print) /* {{{ */ { if (expr && expr_len > 0L) { - if (phpdbg_print_commands && - phpdbg_do_cmd(phpdbg_print_commands, (char*)expr, expr_len TSRMLS_CC) == FAILURE) { + if (phpdbg_do_cmd(phpdbg_print_commands, (char*)expr, expr_len TSRMLS_CC) == FAILURE) { phpdbg_error("Failed to find print command %s", expr); } return SUCCESS; @@ -569,7 +568,7 @@ int phpdbg_interactive(TSRMLS_D) /* {{{ */ /* ensure string is null terminated */ cmd[cmd_len] = '\0'; - if (cmd && cmd_len > 0L) { + if (*cmd && cmd_len > 0L) { #ifdef HAVE_LIBREADLINE add_history(cmd); #endif diff --git a/phpdbg_utils.c b/phpdbg_utils.c index df37df088e1..4fff4673e14 100644 --- a/phpdbg_utils.c +++ b/phpdbg_utils.c @@ -71,8 +71,9 @@ int phpdbg_is_class_method(const char *str, size_t len, char **class, char **met return 1; } /* }}} */ -void phpdbg_print(int type TSRMLS_DC, const char *format, ...) /* {{{ */ +int phpdbg_print(int type TSRMLS_DC, const char *format, ...) /* {{{ */ { + int rc = 0; char *buffer = NULL; va_list args; @@ -86,39 +87,41 @@ void phpdbg_print(int type TSRMLS_DC, const char *format, ...) /* {{{ */ switch (type) { case ERROR: - printf("%s%s%s\n", - ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[1;31m[" : "["), - buffer, - ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "]\033[0m" : "]")); + rc = printf("%s%s%s\n", + ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[1;31m[" : "["), + buffer, + ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "]\033[0m" : "]")); break; case NOTICE: - printf("%s%s%s\n", - ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[1;64m[" : "["), - buffer, - ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "]\033[0m" : "]")); + rc = printf("%s%s%s\n", + ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[1;64m[" : "["), + buffer, + ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "]\033[0m" : "]")); break; case WRITELN: { if (buffer) { - printf("%s%s%s\n", - ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[37m" : ""), - buffer, - ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[0m" : "")); + rc = printf("%s%s%s\n", + ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[37m" : ""), + buffer, + ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[0m" : "")); } else { - printf("\n"); + rc = printf("\n"); } } break; case WRITE: if (buffer) { - printf("%s%s%s", - ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[37m" : ""), - buffer, - ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[0m" : "")); + rc = printf("%s%s%s", + ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[37m" : ""), + buffer, + ((PHPDBG_G(flags) & PHPDBG_IS_COLOURED) ? "\033[0m" : "")); } break; } if (buffer) { efree(buffer); } + + return rc; } /* }}} */ diff --git a/phpdbg_utils.h b/phpdbg_utils.h index 7682201493f..b45342d0e07 100644 --- a/phpdbg_utils.h +++ b/phpdbg_utils.h @@ -38,7 +38,7 @@ enum { WRITE }; -void phpdbg_print(int TSRMLS_DC, const char*, ...); +int phpdbg_print(int TSRMLS_DC, const char*, ...); #define phpdbg_error(fmt, ...) phpdbg_print(ERROR TSRMLS_CC, fmt, ##__VA_ARGS__) #define phpdbg_notice(fmt, ...) phpdbg_print(NOTICE TSRMLS_CC, fmt, ##__VA_ARGS__) From 8b7ab830146e5b0eb40f3c310e1abe374db453c6 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Wed, 13 Nov 2013 08:11:23 +0000 Subject: [PATCH 196/771] clean up build --- phpdbg_print.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/phpdbg_print.c b/phpdbg_print.c index 600d8f2795c..f337de043da 100644 --- a/phpdbg_print.c +++ b/phpdbg_print.c @@ -36,7 +36,7 @@ PHPDBG_PRINT(opline) /* {{{ */ return SUCCESS; } /* }}} */ -static inline phpdbg_print_function_helper(zend_function *method TSRMLS_DC) { +static inline void phpdbg_print_function_helper(zend_function *method TSRMLS_DC) { switch (method->type) { case ZEND_USER_FUNCTION: { zend_op_array* op_array = &method->op_array; @@ -63,7 +63,7 @@ static inline phpdbg_print_function_helper(zend_function *method TSRMLS_DC) { do { - char *decode = phpdbg_decode_opcode(opline->opcode); + const char *decode = phpdbg_decode_opcode(opline->opcode); if (decode != NULL) { phpdbg_writeln( "\t\t#%lu\t%p %s", opline->lineno, opline, decode); From b72a37dc5f9ae8a58902ce7ffa72c2d0260a06aa Mon Sep 17 00:00:00 2001 From: krakjoe Date: Wed, 13 Nov 2013 08:23:40 +0000 Subject: [PATCH 197/771] tutorials directory for images and markdown --- tutorials/breaking.md | 6 ++++++ tutorials/welcome.png | Bin 0 -> 50332 bytes 2 files changed, 6 insertions(+) create mode 100644 tutorials/breaking.md create mode 100644 tutorials/welcome.png diff --git a/tutorials/breaking.md b/tutorials/breaking.md new file mode 100644 index 00000000000..2cd2597087c --- /dev/null +++ b/tutorials/breaking.md @@ -0,0 +1,6 @@ +phpdbg - breaking +================= + +A breakpoint is a stage in the execution that you wish to halt the executor while you inspect, or change, the environment. + + diff --git a/tutorials/welcome.png b/tutorials/welcome.png new file mode 100644 index 0000000000000000000000000000000000000000..5417222169c7f86c64f35fdbc9acb9d55303aa06 GIT binary patch literal 50332 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 }lrZ41v(U3&n| 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ΞQFsyMS^62|SA^F8A40`=QD*|UH`Apv{RR=8a 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 literal 0 HcmV?d00001 From f4f8246de930f7b764ddf5e9d2c6fa621a22a72d Mon Sep 17 00:00:00 2001 From: krakjoe Date: Wed, 13 Nov 2013 08:29:00 +0000 Subject: [PATCH 198/771] help image --- tutorials/help.png | Bin 0 -> 132986 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 tutorials/help.png diff --git a/tutorials/help.png b/tutorials/help.png new file mode 100644 index 0000000000000000000000000000000000000000..2e8904ff30700673c2de23e735719a76e9a65445 GIT binary patch literal 132986 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

    Fc8HKCXqj{DpSR6hi3B>;(hF|Dw*^ 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 z

    z6j<|W*nbLRhI*f>8bu}jgrm$c4?9SFw(8U+?`Ow>^H!&`5DTNk#mnPL6&S%yqWIc{A9%d92K7p@ z^ehJYVMbx==2sw6EFguSCHJnX3iY)x+zi#EM_`t8gq$gaL&aoYgkau9?tO)G-d<9j z2KDN)T{LA3eJ9%Vm@M^79eu-KWS#}v`IF!0?&ysmKY5@xQ2h0XXMtqj(>2BJUF00J z;k0~d!75VAR;nfw`R9hKp`y#JihhK$Yibo_Tt>rM2iaY7-PlJrAdvQp5A6l%<2!?w zJ6lGrgivF=c=)5giARPd;?TyhKxIqNceR1lkQp+abJkP zfkqR#K*n0OVc})-mDB}W6a%C0d8amq-Rt)HuN5(Xxa`;4$(n2cTjZwkzCOu~KWR~D z^byop$ha2Fh5_VxwQPFmR6deg$3nmBYu*U99||mxOOoer<&+Bj8B_mCrkP-P$GPEa zg3_hfYfHzES)&kuxmi6#*}c>46?l_1bnXHF+z;=_vpW&jLe@ptoZ7fJYO8v8jYDPx zc*U+7djLIkNIEk4zxw#^#q}EDn)CZ=!oR@wr#6UR?%zHHZP|R^n8&ZiB-bA#e)X&P zc(cJphFY;Le|Nor?Ae;@Izrx+$hmUsDs5N6$7Aoq=O^z0PZ#^`n^=rii^ZFYFC@fq z&zuwf=hkwdafT=7j3Be_bLXk+(!xNhTq9)oP3&|zqtV%#Kef_HtQXmX3G#Qn4=-e4 z;A@E2dEc|?6Rf`TA}-ywwmosQubrOg2L4+ZYPNThF>>2G$mFKGhC*Lsb^-v?;Z12_ z_nw=uck?yQO9rQ+RG$_$Z{KkMUQn9X{RJmoI@*jJHNWH^=}%kUt~;-&_fBiVL6s{) zyEf5YZYUQdw>TPw#E2JMZ#47ja1&vKzub(*6n&U?1ibDbMh-f(lD4ETZaq`Mz1F`+ z@a_2aG{6HI(`Va`U|{v}gRRSjtGg9KDl|O1h2by$`bDIE6a2IvgF@B`)L1hE6LFJt zQ-(P_^9%T|vN)YidQYhiIQoUi`xf18r#O zdEQ-yi*keD6*pWk91PTi%OAOxF7fe=XSJqtk2tYnpTo!Aqy|e3q82c@#(F|1W91b| zq6|B3;B$XH_wTgM1R|jcUd!FZxn8-6C%_4th?3OxbURIYtJbn+{SIp<4?mq;K|yY> z5R!%MGmiJ-nzB^3P$~)Jo$nm%+YeW~YF@BJT72hMZfGc_TkP@mSD*&2`CBpXbYa~7 z(1|02lUw@b0>T8{-rl)Fs!WEady={c#D_n8(mMS#(ht z<4V8N6HSm)`rT5jBTKR(2e8=mi!&AGwe;fXcEqCk?@LN(Idg4h+TBh|JTI5o7dl&c zr>j~IUo=TPcM|)ferpZI_^gT1CWYrp@kpl$k~$D#u;+Ijd?pJ~c-(Y@U;)1_rGoRY50b`uo zz_(nve6N?xAUQrvnuKo~WxSTk?O1PQ)Q{>2M#3j-R)c$fiwLWuv*}l?x#A~ZR&#U5 zkM8x%5$q7fyFaokZ@LycQ-$mGd>iI@tDax}X)KtMXF-UoHAs&Zsbt`N+{Y~mGGGU6 z67086QzmRjobD*(TvmATECj6b*wJv`l$6w=7p$AREbqgEk&|=-j@T*yPPM`9lN!%# zEX6%yv^n7y8_g}EZA#L+XrX?1-XTHQC|yVDuO|a3zaHwMYPF+72)*}i!saK+_c7nA zO?4CYCHCF)@8|U@`jR1y;>Ypsl6*lQE=m z00b+E;#1t$*M!B0_k{7GN}^$E6XVP+Skq!9l()$-FO~Oei19aJHLpZ#sG61KtekNr zUd=lw+Lg0`GG%Az>M(?raqe^+{Ye5IZCNZdm>q|!w7LYk3yW#GefDLjRu?iI?d|tN z^|!JUG0d^i+syRFl=6j~F%pA6W zJ<*JTn&eCXgi1N#9Z@x$@(S*|7W+9r&(4TQt$GzqMF94_peB*B>GxH~94h!J+1sM+ zXAE*4VI0!ynIQVjG%eZuF@!Ame4;xqbFhZpVhsQXU70ENhsEr{M!;ABMXrn%77Er! z5&j=`+=J$pyBXHEY z4n7idGQ5)#R2B*c<*?5Rp!`~j<}Y|w&=rjoc>nI8d0@)1 zw8&{cBZ~_5LiTI$kSGmh<|Ge z9l==9e`F+L3{XeYu+wyut6e7Ro3b6l{zNaobh2c)9ZMxEOUK#g#`$!A2rE{~9IQ2g zLKR^^yuY{C{A>3oe?Hx>8ut0bcAM`xs*TUTx_V^7UmY&z#8>?6EhSi@mlPD@ZYc<;WlO>cJxwqlv}&u| z7Y#I&@Z526)fl%Tzke{%7Rd~t7)PNer7Q?jN`wh&%vvq+3*19wrfg*&mY3qcyuEUA zoqU}DHnDq7WV>1@41dM!%U7f*qx&wBFRTRj@m#W@+yb?r9x==)ne9VmM^C{wJI|d@ zb+L=|&dJ5kqjpqkX5KG3%M^9VZE^l8POa<37%mDn8-MJ!hQqb9-wPZo*}muh`QXy1 zP41M>bY=qgHL9g!pcFl-Q!yVixAVjlTfwHES@24Vj94l;wE%w!YBLgJM%Q9qg(5p@eMP{4FY|FEoM>J*ok%smc zAJou3Rk-}tR4e|)h5c5cF!e4g`_E8W^2iQ$K=1?EG+fFctb;6 zha5p&AF;j8?>sEKdL^lA3H}u3;V7DQ(Yq}6Ap*H>socU>cDXH4+Z7c;m*` zIDp1kXIXS!isl*U!n2Dcd9$0+<~RYYyT!UZ3E!#moph-sikcF$h9vP*As-G4u3t~({~a_d07(%aS2@9L8@ z>r~M`gsG9`QHtk0*lqLE0V3hsTiABb-7D99(q@d^^=A9b!;SCp6ImX)EJSj{^5F$! zRhC@n`HQJO!f&0Icu@t12s8W7BDTX}bd#dCFE$ z%@HG?#Z_Rf<6fciaqej}b_(^w7&3`*uL$`AqP}(fR0^aLFw_%MGb>0L>*37xx=hSV z1T#FJTd;fBz|0g?*_oyNdZF(Y#}H1OjCj}K`(d+sWdIza{i6z)su}J{$)y&$$CqQ= ze_vW<3VtfczDSI;fLCexY%XkKHaFwE;~a~(_IjbB@<2}Q`VuGCRgA6> zbrXxn&FU=ui7@^=poj# zLI73O_&Zz?;3M&v0>VaHG78%mUZYt`;PDj?jt>xf* zx9_m@<&brxNvgmD2SASu1>z!?_E3>%fD`Qr-{zPqnu;s!b z>mLVR3c5K-LMORvfIYnSGv<))a6J3!RLP5y#(vh3W&i7rcFaH(&+g%1>-|0{^zSVRT0r)!aZ1(_j5xeH?s+oA_CIs?8x9tKYy9q{A zb8kvZ;(v`EAF?z(L3B|k%-S=aZARZK`+TuCK}`(}>0xsh8c6Jqym@Uj7)K)Z!y41^ zmb_a2t&(GJ?rB=RE+_6hrj0)noSSusATc@|;XT7_vzqgN$E2VB zNX`x#JL5)?0^MQ8E)mU^dZOywUC2}IzwMrsD$ehC$e;|unhi#k6p}k6NI6SkUslhy z?PpKtHEzh%*h7`&WhQ9=8_##uKgSVTfJPfTux=QL#%@F-3Z$daqbXWNB9^{s?HMt{ zlG?G!e`nK;)Bf*NVnGWs3^&FJ73#J)FzVEQt6pzoyYKy3snb;6rXCf^*Z5nED)5C& z;0EFDVio)Fp(UfT^S7($%ez|O63CKSL{hdb`#>!6v?m#Wd5ht(vm=b*@nOSZ431Z<}AoWm4;oBX*{zH1`($0N#43gNGA0wTzkDwbHWOsk)#IG8xp{azb> z@FQrmPE>RQOqjoqw!aH)FV^rjUW11(vVsk!wk?Me7iK{ zGeaC-cVRy@fP-ApkEn0u`#q?K)L-KL_trPx=-4#p!KKYN^^y7BEspJ+6EnR^w<589VJd%~!p(Ip=f=kBZZ zyphqsBl~a+3|iVFIUv6gnd&7|e3yL+d@-ysxeyVY3yUoE;>{~iDLXN0N!p6%F*bLk zh&%U&waSz_6hne|QacsC5y7<1rJ!!NI#W}!iXKJmS!Q?bNaIaRV7FYG+HUJ@>&iLEeObxRE*?@Cdi)Qnq)V|ul2oRpEvt}^@>zW zreyNR&40JEyJP~_u~$1iBaO8 z6+1bf`yMp06&*ljb$OE@WJ$zd`TF&R@yHTkTsBM-!57Pt)15RAA@YZzcdC5bD*H`& ze1|TTWiMn&mGEZ6t!p_s>Hy=|bAD)syjfW#VD~KEkI3-V8Gd{{H$l_A#8vxdy6Zy$ zBP7$92BLuQ{)Xxkh?^mJ8i- zqYT54>AOuSU;&xYcHcfpeUtH%KmM#hHE-IhKaag#xR#JJB~oM@Lj_2chUM?MKy_et z5*!sLl&fIk$C#<(_F;h|<;OR8p-eEcq5x2h(^kv*WR7C$ifn5#o8sxA&Zq@RaYfI= zNBH)_)VB*!0@ikLW2p18lKLXIX1T)?3E=MrsN$Y9vb@es`b|~>xWd}B3#}-%|8Q%y z1g$J&eyYp;d2g9T3gAf+rSe#Be|)Ov<3@ID@Z}zJJK^|aHh3iN^=ahzhg{${N{E4O z<6++%4C=FXffK_n-I%ecf~|pG&TxY1GZb*Jfd%RjU(-Sz^}e=kW9Ryrv4xK`sQqO0 zKBtHx^A4NjKE2DWjmJc?NYq@BVGShHh69*wf7>|90vu*Y;)U*EHr!21K3&DZ9Cm^Q z*~9RZ2w;l(^ht-w6u+2!aK;D(GH*nE9PPFcBQ~s1q^l|ePoEqDlhO>Hq5&?eS8F?) z=|1*Cq1#FR7N9{nfb0Vj&sA^B**yb2xN{7+4Kt`#RtZ+uPyg?Hp|o6`j2hOlbt7Po zgF+`IPT>C_kwN#8%8tZWa(zflJb4+()8;yw_cH^AK4*%%_36`9xv1a$-Mb6$X3#Dw z%7|a+@W;fz$gt-l6{Qef%d7~i*G^)q5vy?JsOKJ||w@yB4U>F~}@K zOkHF#MQh!DHU}fiLGuhlzV6haw3l|3w0`{9<<}bX@P!-i&d!cq^%9SypGjenh)aEg zh)NB--v>CJ1%Az7fke5HKTco@4HO`asK*|m8W{6GtsU?j- zeXo4@8MYfg;4#3_(Y_7t98q}D?jl|_ONfcUw=+{UD(5xKg*~wF55I`?YASt&d@~PC*@AqwV`li8p>SYW_^oAsm z7Cgb~Sl?&;MTq$N0qQc4m~?Wi$llOVYsmyyeSTg5)rnTq4RYsUy>pLwqty5Q)b{Ky zdlqwX2j264jtCiNYpGc7q>+VFwa(bp-n&`a8*4?&VCX>>j(2%E=ygqR{_x{l92^`1 zk#3f)+h@1=OVxWL;fH59SaH-55hnT!N?_;VAto5gW+!|R?{jkP;5PcVru zRovKyZV)U*^0^_ygXH_oq*vX92TGFwC|oZLA-hv~7oDs}3!*Cwuz0{{*e=bV`)F3C z0!hLROk&*G6pV=BMo_E0EqM+kM`bFLC_9$w0vF z?aYnR()1tpDGEckUMr)F zA*P-E;Y>xuZR2(p*gih+?0&k`n<|9v6p>bjhoDf1F*Nm5b7 z6|HYGDQEPgzmW*BS<&A-X=}H!dO|_{$atrIHji|VAliF~D^$*E0e0os8vFJoU^5^+ zc*aHf3CiINH}LnjahAU!?FX{>lz$fb3p1mp)MEO6dFeTDM;0anC(k`*DJZv>_~C7_ zn~Z3u=ykkw{nGF$N*GKHIumO0p1E~VVBKChtu;i}^l|5G?fO<%y2e-7Ax8y5z?Ok+a zw5_Ytm(9w0s})QUdx_0HWU2rIvCK&w4r)twW-#Z;q7!~A- z8vDzK57@KUG7f|;2#2{F$?(4M*>^FO>5mAT)g!+z>)#nRye6zQcH7a5KHnFr-og(p zPq1vt?KbQmKk4DUYJP_F#)j z=p4r%EGCZ*fXpAhV*Mq0ata?9k(z?{N_M|X{$d7mZ}>h?lKDLNYtZTqQc>}3HQ$LI z7LLouvF|l<`d!t80|$@dq^&vAW2O5&#Yh_oUU`c6&JRu@0u!QfF_s0FC}bVy(S^^V z4Jk!rB#I~7Y6AeCNaZ34wv&RzB@6eGnfb8O$uWzKZ*<;QL6%;SI0?O%$5Cs$hN-Tf zfjD~7q=a)e#It!2Buv3uG6rnNt-1nxXKl5bU$M5UmzEEZ>5KUh8yF0FqKx;2kvmM}h+A~3<>6y^br_BCA zi6pS%l~*90t&n%dAo;I6Is-^*v_{(On0ZfN@qVD!Mb>aulVfB=$1+ev#i{?-)p%e= z>874&(kRk)=F1yJ1wF;60Fde_y=@Ubjo|wj!mv?tmHe-fRUeodN9*OjBiz7bPnFrx`cJfk^%4=)3 zui6_z##fh*x)^)$c}YDbG`GB&UKqm|sOP$r>BEIAqF~Ec?y^t}6s!@(ODrht0hp6SxxiU=6f zkvQogaj93)dhY-5IqI~f-g2l9Qu3T-+}~BtN{wTQHaxB~U9SDv*^8&v8o@AtHDBX~I&O$!%kE=?(KA-lhyrmmBjVc7WMLBUwyn z5K1$@$eH)+vzQs?0_M7c4n`$a^~8(rN30B)j24l>(!Ga#Sp*F1%KcUdXT#Uw%#7&4 z;3?g9xqJ3&md|XYFV3g60k6gW*jPCzi9fdHRO)oC4Py&hM+YxkjqeZ73WWs++w9+i z980~|N`~;9O>OAAKb{=1;8gKW! zncF${3kxHfQcx+DsTE)D%IGM*4T+@7H{BASjRL$(nbSpDw}w7RjMR(_8DigM$BZpI zqjDQg#iw*P?q=d;Fs^0y)~#nv@5SMwq35;GlV!Ff|62H8<_pT7P=eOPXp6I(7k6!m zaR-X~R@z-0@XYrUG{E@YwwTnhB(JxxdqM-P9il^m zx_Q{|Im>&ZPI)ab(B&4|{{SLEYqPr0&`PTb9kUPU2#9J4YFq7{YfYqC z0}6&dCkp0jbUN(h^*WS{pR_E&ChXd#_YGd`3sa=VB4dDuP_^cMVksBdZOUz&y}mn- zA(6d~$u^umbYwG!)`oqfa#&4w(Zz6lb}E+C>AI9jzK~HkoF`L&mnL9!BB2L zU>d)&tY@SNgYA8u;+lvR>|*i{(-*ZnLHP{Q*kjkK-{|3_VlEafg!9!S_Q7lovxwc@ zkJ1=MdtOCojGRV>M>EmQ9sRxPP;CFyg|aT0>OpkqDKns)k#$kkOwRL%)=~8N(JtTy zt*nSQB<#MxzJnC{qGz;D#Ki*|Gqr(P_3=CQ+Zr=EA&CLsJJw}hG7e2wA9OM~*$Uat zS3<`1y}ir=e=BUuL9)%*D95f;JPcRmihIeq&1kE0SI@0WOpH>;#ge{v6kC}2L>_jD zm`zWASXBJRcd&=HUTDakHvrKa=SfZ(WQ9|IpCtY2G$@tpbI80i zY`Hnm-*G#Qhr)C|%wTqShz)#rP!@PzsOm%fyi{w)hSYHwc0u>DbUO~;^~-^$rIR%~ zRT?Gqh3j_qwT9;%nCfzM@XUJ^cnHEyhl=(;uBpV9hDiJ|d9lHZ0_Z8U_!{o?w&x74 zB3+r+Qa=iio!h044 z|4co^I9UVDitUZS{0&Q|NG7ZiHQIi!XNFfqmu1{+Phibo?balFXJ+%SirVKj@Q{p= ztVYL+{Gl7=JaW0Rlh>xo@L}L!;MaXf+IappS;^&%(;sRrHK6Le+9ObL?=L=ndxC+R zQ;L$7BpN7doQErwDy@d=rXMlC&b5AAd+gDFF@@89;lXEDzfQTD%^W^@o_MB^M#aoL zaS$2f+DAvrM?_7>PfShIik*~*FXREL4bjeMyqx-2>5h;#sxYNF0!K?tnAIDkpOC;h z#hD^ZL9ha692(ytFYzV(n@}|AdMLCCt4V3ikX!%7ZwJ+Q8df)SP6BEz6aPXp*PTX& z0vc_;00x#p=JD#Ju7;&9yTR?o@Z8@7Hk2g9Fu6Ak$|4Sf;^$dKwiD+UZ+4Bc!tVov|S{M1*Apx)W08LEc zMRy$W0^{8hwDhZSM#qb3yTFO*qM+=vGvNS->XTa>coYKqKW(+GFsJc%Sf*;6SvSxX`!i!DN>UEEDxd$7qKVzUn^e0mfT%MSXK~XfBznKgP=i&x>^|d(x4Ibe)LBew zmX8GTV&J>SAAZ!hW52E`K)CXiJ!?_!C9z)ViY2-#2-AGes6qRxpH%$Qp$Ad|d{3zQ zBDWs`-$-G8na&$i5@;vJO?A=8?NQ~BD@?WDO=e2-zTdSi z4wM`*JQd@ENX1%Y2imh^Ft5mLNEhW<-O{1h^!|@Gzio1TrGX!JO1x!9;Ra($znZu3v)bm_sU0 zfvSt=*neTcoSouwFyrW0)~$SNT8M%7Jm+9)2$#)FGAy>m;?aJ7)9rCSa%V<2G{>I} z)i=~@@mHg!0G;^s(YJ2#RJ4xz4{HWcUrqQQ$4Whe)e~BOkfH-ieq=fIlL{&E|NQuGn=+cYU=btU_{5{z8>?!E_h$1+&?F}W zYzEm5In!?c+L9L#hK@kds$jWfi>lR47gZ^Es(rPhq~IwXKNXI!s`6yA;dnMAAh&R_ zneoz7S}8TYHx)EK7T^KDDgG(2k(dp}MIf-%5@oc-+=bqi&i0^lAilYPGzuA-_|KJf zI6&OUs*6sB3m;m8uKwtbq3mYCMg8a$Y4&`X z#rrbIV6Rgsy{G1I`ZVYfc(d&AizYN(BIg(Q1JdOh7z>FgcXXcH{U8vtd!*}$`Ht9~ zbU0z;vNH?Af#Sd|tOXQuh?G4F^kgpVF~__)@P)H3he`Y*=l2GAIL7J~B#QRSo)&?L zd9S%nah3)#KB@I?JYsFNlycROXu=fWNx}OX!F}Nnoxv9L!Ysda%0E%+nr5H}@Sz;Q z#hj+8))8R->pK5TjtwDnG*)p%@*SjVn8ygk9o38L3H;&i#X+ePbgql_9v5^!Y|)SS z&J_6CV5sdRgos=0DKt~+wvBHe3MVgqEG+$ayFZ*G?F5r6A5Hke2DltDS}b2a!~A8n z1kHc;BDsdP1KqAQJgW4E0=k1=8rh|4;h@>rxr&d~za2^f+f$ov0j4e7ath8+!UQdL z2@j3P9cl4V5N@zKv;(*|Ye!!uGx$%)LcJC~xb4e25q!D9Xa7(1%$dIw0^*Qj;rZxz z6QG?3!oC3>d#OQFk5({9UxP}l3v#{>0%Riv?_B!oM{?+wtbOiX<#g*48Y}H$FS5r& zBaEV~6{4BsFrm<1u~*6e=qojYxcjP!HK}cgQF=fREAM1p$JG__*yc%T@4e#HLG+~- z@X$u6tqIrTnu6eeoZBdIiB$g|!>84L2@uc#TiO41Y(FAMY zs@e_yd{0Z=kvNbUac_H6er7!z7Mz>d$i8`t4Y5ggP`qzQZLC*7H?2zv_qRBTq!jJ7N*vw75Io*`;mHnhl)cFeob?mRA|Am*}%8$M4Cz z*Lm#Mz>7alI&)c`(1@89ciHpfG4CLA;`-^)VXM@<+m)K0Y83Wb=I#F-dBh6aTaL&DsRxDMD+8KCbanW_((?FwD;=a*&R;pLn!5|>$Ap6_YF3nb0)WH7BU=P zXZtgm$vrgiX6KguiK+#?DDWvJ4slrCao?n zfHG65&mN`3rTQWglBmzu&ml+jeSQ5VqW!zqyU|QQZBbE?j}3bLs!HFDUAH}!m0{#n z6L9!l%H&WTiyFJpp?L(4_S)h6v}A5!=+?wXvV=p34A;5D)kMFF^*m-e8!T&0MjplF z$?LyrFcP_jBBA}SAn*$ z%1IVz={&xv+>chxfWxC{VFeEl3IMm}y*J7m1Ox<$sY}$S4k7*f7d1hG_)f5}@N}?? z66y%}>q$cAr~1kS+gS=-B#y|iRG%Zr&SZbG?~*k;;KwuXaCt`_;S}F{T`T%>B$QZ8 z7+5#lZq0r}6^!3g$j<`s{xql@D7UwEvlX_JhrhX)?+7->2?jE3G7I6z|kX3{h%? zfHogrO#XdzAEd*EtwqeGiDL8K-Jf=BOh|O_^1f(sK30AHy6O~2^-pM0$k>3zHL3{U zQQ%V|sdwG@6BwR@lQR|cTPCB+o4dPSH2>*@NR=cbQkDHu;;}P`KFq*_c6{C7p(i0rX@=3&&epy_gPEH7P)G`!ppgnQeyx2leGMJ(1lxt_vy8Czgm89Zu! z2()g9+!)vT6&eV*a%}b*U*Z1QT@JcD8A-q9zPV2_Zfoo9>h0^=xk<0LPhC4d@_eDM zKA(?8+^hAy7bsEC70YDV>%Q*Q60+p?N7R!$q*d^HS^VsHgL80sqtkw9o@l7tXF3>?|4@ik#w&p(b)6Ks4US&v;SQTUvq`E~CqTP&AToY* zdz`YMBzwsFHO~nJA)?M8zxCh_<05GYo!4tUV^;?Fv+9g%LZZT9hb&8Jt1VG``OAmJ z`Al814!qT~7O(9bG!!)Mn3Y`d%P6F2mtHduANjM};;R$5A|;bHR-e}xKhPdevk$Cj zucdXM9_LGUBVpOqWrxK>XqsW*ja({}8y%7a>aKZqfbLGuN@@HZe7{RdUhMqDY}rjQ z%l=CvJ{o4+JY#p9JI@wuhO9vzN3}s`e)VeXkc_3nsCxg|CkevtvRf#Z4)sTo7}`u{ z$vQhG!j|t)bck%p{;a>Z7k+%Jm6j`ik-!n~;z1cyoi@FOY?M!?KUjKMQw$O`C2&>r zUFd)ypT?DoH*i?o#2(yrms3`hju`==wAk?E;m}45V+$GFe~kLKRIscym#%dyE6TlI+bJr>uJ5Vgg)4|LB`Mc3p(6hm<46crz?wpkc`nh zZfT_YbrGDOjar?ckzx-SZR3wFB_@c9IM8OLj_peA@KW7v9OMEmStqm3iaD+Ej!F)6U0Q`KR4?t^T~TNhM(p-3TbRL z_V%?_2E4SKhC+xwaifuP67ZPQO7!JTj76{$&O!XD+f7+xvbd-hy2JB?a)#!}F$;CC z6*=bIA)^kNyd9Mj*P)1(p5h{_5)ijn{vX zI<$*rRC7-v`4nj5vJxIB35IK;{dMjIY3wFRNnxG2e=Rm?re)&W+Y zGUorPBB0$=l6^NSVv7xiV>BpcJ$gp9!Y#snOVHOWkQU^*Cc&>cO(_#%u*O@DTS417 z+Mc8_ZL^niXOpj$gh}!b?IPsF?!Q8}t%9RBOnS`kMs2S@Z*lLuM*8cr;QihCO0rfk z)C<*mV?TH+qcZ}LVAf^-WsY)DfhP}vTW_;EV_F{yF{qbtNznP6hHHBo-BPC-{ydof zWvhbz7h8o+!R3yS0d|>F#j|)&*LX4i>keZle-p&eaa6FCJ$(`jIoea?G@-54*tVSH z#!lya!gC2_=Y6)TOnh2bF?>w{Vj383KW9Z7D>W|uJ_DLd6kX#V_6(g zodK-(lXX51?7kNsU~h<+P;3L0Z;Os!nnJa+37JQRlgXbTHNnkGXFzoM8t zZBWWK)qlOeytMGKu6KWLYExy&5+TtXOC3R9)5N_+-jmO+O}~zxqrbWxs)n%h9O5b+ z-F9iGZlB%%9u?KlYO+gm9T5?WI6ORoC@p=__hSzjr^kI}WPwOJafDU;(;Wf1-(e6+ znNSO}tf=D7MHhZ9#cn72jnBApN4=`g^MeBX6|ar`y>wTZUNdgWXgz#b7#wlE^J!jr-KI6K25`YbpoDoOn@hx$agnL2uZ z^*j24z@HD4yKb#Ye|#OKS7`{d)`RqsftsjTZ_CB^6QgI%>9ls9lDgQh4WX>wkB8A% z$Hr^+3d8>_arQLsqZVe`7Cmdc{}1*^PBP<=r@Gw|VZQXlZL2P#M}bDS=~f?aLr1G* z1Bh2L4iTyYfdjU-mQSj_qo=254Gu8;eRzLdzFB(G^Y!c==}jbFa)^%71CmiInK+J*hVax4P9Cpnn> z(NL|r0`|2e?xltdO`axSTxDXcYf9M$#xT^b(f~r-CX@edN92AlM7E{oC?fU!Uzu&3 zN*1@!TJ{{jx^Q>s1+ zC8dBheL{9?H2w8rKgcwr#dv0aWt_}M{I@o6AG(W*7$JYzVdzT5HWw=xgd4z?kuP%v z-K>&ouozplN7DXOU`9hLM*KOtUW|GyL$;y&UyYPz*`g!k_#@5H;fnC0_50-V^IyM_ z4LHxtzKbbDio;3O@c6`*6;XDP5oxswy?$`Y$0^udLEP}lFdFC{T7D5&82EP_TR0Sm zLBVa|e}T(r?oT#`8k<7r4;eq6c+2H9f9J?kb_@63@!vaNZ@x*~KPe|@V)r{uqvwCDsRr7WK~gZ>zXIea_T zSs9(_9qpujR!@a|Xd*{Oy?MXu7}m~U`r+8nZw#84+8zYmow;H_>wPRe&FgkF7||IN zecsWXyyZ{q$QF)!F*N&j2`8brE(hzJ?S05|;XJ<8`nV8Zs%r&E4Ah6tELfr|;PaS+ z=aQ!d2+0+aG2r;hnmW0xkOzxD+Zutr32qw85(ovhcPtou#jyvA*=$0kH?#p0^plwX zxKMIPCg5#lg>2-fZ!xr>yshie`X`I$Q90>JaT&gxTjtK}gKF!uo7Q8V8)Y!wBdH?* z#P?z?owrK1Go8>5t+aIRMMG#Ajk?(pc>ROzyR#zN!Ea)gt8ZNK)1D7S$CH6uawkLi z3xMl`BkMEnOxNuy%$udDbpd{V?yj;&FoT;yffaT^DE9QDvNGV;Z z(J|lhd~lE@Q0rlWy~9_lWWM;(71Ha!1isui%gf*VFOEX)93%c+xhB>vb8l#Uo@GSK zlF_$0)}2VA4Y@L1so7b-W?#m&lkR>GXWg{N)C?`Q?dU)0i0v(yht3Yz4t9QID?hZd zU=4nmSRR%v;*PJ;wchOOE*=*S4LoF0gna4`v;ck_=1H2^D!J(Xynj#UwYpm(+Kto- zxlC(#UIvtg52L0hy0S|qlt_c9Dp&o}d)pV2u!l@R7osFG zx{5*V=yhBa={=8z-}W$z>)jSGr*=^?c_RW8lN$&@%q};*gST2)x$+JkMBU@s!uhBB z9G;m`a9iu+l8~J7%XW;UG~f7S+|7i|Cjp||ABIP+#_3%a`x(dE zV}y~FCDZQTyzXnwiFd^l+DaI4#nRK7#+Sxu@X%szTgiPsym(sG`5pPZ

    of?zh8D-EA3V*O*L`o-A`YwNle zQrhhY8NOMED>X4^2Ef%HD}I+pYOsr&w#BP+z5SUeJJRKLrVEp3JfPpcV5iH4^VzMi z!7cxo|KYsOoydUcRG*!q9r~2|3|p5hs3E+n5(oGJH%LV?RVF z9A@@=miR~)TI|tzF^N8IRBt5JWj#PyIo+F|aos&0KD^b#1BV3glVUJ<21Y__?JtCF zY;D}hHcyPMd`oXTkba1(@!MfB9J{4NK1sC$EcMw);oFu?DBnS|;z1f`I85#rm6>OF zHZY5>z;uL!-~lvX;aox-TO9L|GlJC67en3}zjo2;Lrq@_gKFxiFRt;CzpUM1xwm&` z1dJv$VC`oR^#CO#T43_Kcd}1s!ybmt5i<8tRg$GX;tZWLWllyH3!Sp8R;P^ZGMAN> zX4k;M9+IS`-F}sypYV#qV*ZnP?yv`R`@MMN=4ge}f?h`jYHVN7nBKdXcgjeQafJj+ zOE;5cQ0EN0En`?Du+3W$yK%<>Q&W!;s|Lc?&}OBFAas@Q^rC{cdey9qtY5VoQNAo3 z@@Hx+QG^+{nwINvzKWWBU~aFf^Kvc$RSwuoN`i7EQSmZ#F32)UUKzP%B+`;~-D!{e zsaQ<;{2&bwFH52O%g1+T>u0xef-89Wm^pO8W-Cc|cIHb@V(~)T0vEEr%`aTsq13Wm z^eG&kBf=8mzqAwqpGX^{QDr?ujsLO|*mHm;s7R$8;QbL+gasIrv23?wB^#i;qkRS} zCD8p=WjlFia3vS$by)+*LScc@eXg2i&bQWD)(d@7iC(zbu|><%E6E0@cus|5Y``q$ zJ3`}rc8An9BmGi3iGeEY2`Yy?w$QfXM#BeiaDdkU7C@mmk4=bv06cW4pnhRF^1_1XK;NGpaSZV{Bz=ixySZXn?*Q9Qu7U5wN5RPgf- zt)VD-a_XjaOExD}{21>4du~!s*A%KE<0CY@i(tr1L1uuaqn=Uv0B>a|sY(7(+{4ns z!Tlx`SpH*AokfL5^60mxb)Iqi&G5^6iPK86E$1ty5} zu0F4vbi%SMkrH(FG~*)Cg_+-pJNz2^oSBH<2qP^^sR7lpx+k_nF3{cfW?;k2(j~gu zjTT36MT19^@D~j(?}WASJLdT@!ii93lJX_iYoKLwrA3BeE_0`2<4QF(FjtPQ(!g}bI{irX(gxrdhLrw;aPE8UaT`G zu@`?m{Y>FXH!G_^3ECC*yKBF#3)={sku+KgO_^;iW$#CHzaIC;SbOwP|DV75n)@cT zB2qv8y6E#wLmp8DVakBI<~J<<^M6?`W#B*G^yr~dENYS3SG>PJ)wlPDlIL(XHVB%W zt0ArTI||^>J8e_)pH!-``23^oqxaSC{-udL!wVd>zjXld+HWd;0-cCn7d|qd;>!L< zKhp4&s@DnP|TGrxq?hp3s$j_Aj+f$a!1jTJX%; zgk@DMUkt71?}PSEp5%uPj+$h5KXBQLqFqE;*|uRMMCBjXUvncVfl&`>(UK_()4GPA z5)j4gU5?UNyLfkpf^6E}lN|+yuj?Er=@7Rhv_E+L@38+2Kx>WU;hO^bqMfL7>j+ zogAZ8f^0>fILv1V%5FpDplaff89e%tU0H8R{kMhnYb?@~mEHpFqdt0`o1{1#yqtZ9 zMU*FJWYdE}I9-ol&5OC=6X5}Nze8X_${95x+X+!bHM|@CNI}k+k=h!)UGgP~c+`?p zs##km!Xbx~(hXk=n{HkkT)4XpIlB85*%H|=u-hE&%(|7+<8}!~Eh?}>lY4IIE1KwQ zyuSja=+HPZnNF3v*o8L@-5ithdz#Q$V(Xc8T6IA5?wrW7GTf6;0A3L;CRW{^>bkGg zItro@DIAFlIg{(UaxC6)ZtE#q~41dt(L8@bJRKhCuTX7~(gj?93x+6N*d3@NY= zgj|CWSShyI)`S&&fpqHyjC;VX0>$icQdL-}NYi?7VmEC zhqr8rS`KWCCUWcaL~Slbvl{E zIULV#&jxZXfz5QZ*Gq;e*dYP|*>P0t!)NyF5UvO-c*KZHN!JN_Ur%LhBH*RJZ^YZo zQs384e}A;7%vT;ySEkPND3_s3UndDkQ8RL2f-EW7F+oe)xRS7wJa?QIJCBj|OaU^Csg( z<~`6QU2&{o+xL@pTBPF+L+QS6H|a-v7q)=?89B0UkDzJ*+z)el^V2I4K`*tqzxwsG zeJjgZT5l*y%~{k#@1eYeDPK~9rRHqA_H%0pNvt>hQxVG}8A9evg6kYM@WLherUx|2 zmX1m05Z_CiUiK9)gXP<6l#dRaoyUAW#{RIF;E||uT5OZfH786Sw}#~Fd68*?gnDYs zFS29JQ=ULmh6;Le&2>|I3!w~R=AgpqrmkiQES>i+9{>I@3gx}kAaSY5&QwTt2U1Wu~!UwC;2GGOjtj3YlL+bU{Sbw_u`2CM! zbMeQVN{Dd-c?RBo-_xqL<2^Zg+u60#*kDH%DYTfNZBv@{PN1`~UWm=JSHxJrOmtwt z@V<7SZ=6?5w>f2~Kl7TO#fat#mq47;Ye>`K##ZdzEU1I4Qq^GzM0E~>&qfRI`Q;%O z65q|>3O2aBz-(d<5(|EITy#{V-T1}eRjWcm5!3gPCIiA*=*PpKp^JW+YWz-u;vcd~ za{{^FVAx^*)!DUkyOIgesH6Sq%BS9uXB2%Dw|LKmgE`XhJFF`SRl3Y4@Cw(e7U(Oc zs5B2TQakpdikt%(7#WAxgTgDPBqhoysVL`g4yK)`CS~sIl}>zGwhSls=Q(|XQ!CRX zQ}eUj*(p+S3iH>`o=ji%b5djU1&X5)Z&J{59&)0E(0@+h1%d!w=4}TGV+yw1#kc(s zb@Mj=+9z!AeAL4$+TNJpwVO;cU>NIEv>}~yAf9N9uan}~(7Op*6(Y_;UwX-;07S%p z;0&Pm{imYYB79s?vG&eUC#VjSAUOrD_B@9FHr*ddL#$}iof?MTioqEv{OGi_Fy->s zlCK9?V<^7Um;h$84tRSU9QMYm`2s$Fqj`1}Lo~XR-gUwM73`+*9@t#_nrTE+OKn$G zN=qkk!03*Bs?c4jqck7bu@f(lf++AWIF|=896Df%762Nm=Z$6xXFS|}JU#g;4X7cv zJDESumaOr@N5BJa@s<7N<$x7>=}y@0k9-dWfn~Od+mDL7KdhUeAcIF&ES_&O>~B_| z46u0qu-2W0jCsAvuuXiRc=LU4ON;+rYW)TE--UvY!yB{cZvyN4TAq%qj3dZ|nn~!4 zRq*Uk`S0ymsy~}#2DPdLL5ZvGv=HF5K{lGUGJ8UMb`PvR8uY`P%TZ>;1f#vDp_#j0sHPr1f20kwg}!nhbQ9QQc5))H{PxZx!xuaMifIbk~B|pqiYg$ zxGuLnDoHAZUbT&t3a)P;7tU#BE1Jc`7J7tJH64U!tA+5CS-&|MQSZZIxHWdjWdV*O zS!&0ME<|ueYvd(ap)G%&AHR2%ZjI?=xDk+s^OcZyeUGU&W2s!x>=%?{ZZgbM2n1%| zG^JNj^e$8efZ5p85_gz1u?}T^vUsXV)eL!prskG=5ti=+q0kj_Nw|V-r<&Vm=O?^h zJWz1Nng?a&vhVsjs}8$YVN3P(Zmef20OY{hv!zV1XSE>F5SAz`djH0qx232rN3oVj zvK%)WyzyZfVv47pa}*lyUW>j~D!@0!I~R~poh({uTuw3J_fq*T%K5c)ldJ$)!IKk? zzfEzW-E58crPvju#Q1K6s9ZMlhJLjPGq`jB*mECQr*J>8WZ%EQ71jjkw^MCMWw9?Y!pC^7ki!*Y*?Q1n_-4xgz zVR|011cbsau+$t;xVu0V*%jNvVm|3G2(2e=3UtY7rtH7W+3M`X z*3``E{9`7xiz;4Fml+?aM|!pWKmj|RQE>u!5|MPMX^$Xw%DX!6ZypMQjZq*#^^Xa; zFFcGa){7OgU35fSu4%cOP?8{9VnB5$ElRtLXMeWMY_m7B7uypTNy=%LFZH_6K_*?V z{#?PV6Yc>a-M-*M{ia zIY{ocWaWeW^&{WV=AecXX}zas{B2aN+%u2LMV|}xT*uD`RF!h2=735!XAHo&I{<@& zkgiSYWsw+${>vAx#8c#cgqISy3ZMVdh)>@nyqFPd#>OD9FeT3IL`j(K?hLrjUdwqm z#iD>DB|-U;w&1dyJ-9l}NkAWLm$P>;%HQ@3(H`H-l(-WwWqImV&)~~79KNK`@E6MYkO`Msv<@A3f z&c8~r>&W&VFLnGtt!}&9VB7!T-&uOHL-2If*yRlxk8FHsiSl!c%0k;G`1!#9#*V{2 z;{W*}dVa>%p-LW2hihy~-?7W?F15_`ZfBD9ZzJ%7n8l|!oE~F;fq`bS=kvp+O)e#p zr^ysbga{i>;BAW;Zztam8`UxipM$t1m^x<@A4OAvu&{%|k$v(9J!~$&#dS-dC9}A89-j;lpOFDz=)5l-)IBho6CIjZ4xVR%8cg z!WzAk3Ibo6P?5wg+nXJ!yi#dyNH)EeUVtH(u2B^eU#e@W68m^n#V~Q$L z{j=V@Nz@i3$_MV^9%&Bk1WuC;uvSn;P}N><^gZ;eGhfm?oFLl-gqIz8JQ{jkr_)j7 zYU3@shx}*C*Z8NPl%4ty&*lhqq}Bcw3y?M>*;0vD{1fwgy<(o;z#|N0suyZH?ucmN z>f#qmb7^muG{^Rb9a925!X)P|HQ`K2u-6yfg2Bg@vUlmlX4;%ygHBMZISglbRaCy* z&1%TfOManK&Jsj^TV&IsA5sskc6T0E7qptdy?=p-W1~(6Q@+} zf=RN9D6iFnBNa|JL8~IoXe|O?otsX+mordcPDs5k4>>rsHy-5aJ|e#xA6M^7&io#e zrTZR|AUXRXR;&P2i5wY0ES*TLs8SHSqS2+F zAK2}ozIdO8*Hy{p`pU-t&MuDfKx)_FgzyPx3wFaX+080GzFhhU7DEcuZ$=7J;n_{n zD~{B7(IYqge))Y`#t6&1l-lj%;0muSX9u@eFg!XnSYWx}!?er7NSTP9$?&*3}RkEV1UUbt$g5nY`dO z;ugd}18RvfBC^O_JpC^pRD>s~QLDUs-h$buFDytWgjBlHX&&8nx<+faArQYD!qy!u z6a6}$V1UbOkbx33@!iRLx}LtXbDqUZr%^|D3lK|2%bmvQ*b>~8`Px8#SBHJb+Z~>l zy=tp*=GM{{63meS`m?FmZiqvD)5%qWQReM zWY!2!kgIB5{Kc?*qfGtLfTs+}l~P9ZzDbvH^*0(;Y^s2gjT`r~m&S46#F}WNudJm# zRckgjn8q+goY@1#C`z0Tz6xRWxB1gKBbR_#WaJmB@Yjl_a_?~UZVy+@T3 z(X*gLDs4z=Z)asn1!{doe!~=Z?}C_t00I}g-HhSUS#>w?*C4Z@iOB48aGsFfGE6+B zixAi5E+i}C-Th)o1(7*j+oZyh4|7^+qg7sR#C{14u~jC7oqr7@?~(LU=ss<1eQDLO z$&S^n(l8~n=^Y0@%=RFId}<^xH_?Hm02*u?6!Wq!&-TrXt(C{L1zvV!uBTmV>~HHI zVIL5!BO|`d32x%2)3p=z_2se9la-D59{dbeK<`;j4&rI6OHyb`Ja>N1TzXER{V_*& zI@yODGT7pCIb>o(09*=eledaNBl)Q5W?|lZgQ$5qc_8CBhezhw2Rj!&7b-I~GOy7IOnIJ#|AI%$c^Ax(#@NK6;yxf+STIhMK-9Kb%Y`8_iJ zDF7dVuI02Is+K_#NfXew9Ezp3fmlFRy}<1Ux9D%H4_PR;M1#q+3Csh6qPNlTP#aq_ zNk9Y_un`wLVRp;lDoNYQ&nGsxpaCxx7Yap@kAHTa0-2-a*1OO?_E^(cQ-OmRj&gKK zW2&z8Z{G&|f<&gY+Gx(o6m0Bi79Dg7{l5~1MnJS?a#e3`u{IR{{NDM=49d=*p?-7N z+KL7W*M(_7+rST&<_6h^Ms$%ukl_2!j~`^+yJ-$8Hb z!!oEchFpVLdK2NR$VQp{NflZ{VnbFf%d&vq*in@OIZOIN8LWAXD1_vqB_1M7X)&R1 z+)^9om7(X}C!2+FFLC0*XC@g{Yl41ZVqC^pdU&YazMM_e5m;@wFnFV$eiUvkWGA{c zaJG0p`xy44c?1n$*&|A96(FmZw1K0OR31%6o^r=$2JCrocVj9(5a&uW+jFA}jg?aY zh&g1lz^aAH^t2>ec!YJx!_O3TSLX?l#lzwWj7=VQzcy*v~-FeK8LHpU-H>57q-Q$j?bfmM57uEDZsg+9SW z?e|%@ckmxZ%mR%dEvzROwtH)XH3g?IBYh2L16%m<;v#>tYhk2s$HJ}km}j#Fh=i~u z`aDvpWo80wB*U2gb4em3Cuk5raK0>F*!%V#;`0YFt=%ydT>g=XYE6cu)&#+mX(<>6 zSNRN;{{5SX%NgqNcsza~XVL@<1G|&no`XKV7J(w=wqKxS<@`Dn5F;vVO~mRegvr~= z1~ATi|C-l9l+InZDdVNhAo;{f(y`x3ZeM@x+(!A>j}gV^R!zZ}x~UyHswCFCd?C@8 z#~Y=U&L~uM5#5VkP2DaNAcJnyWU6$)#+U-h+|9Z9`NxCTeVy740P?`ejl7o*YN?k^14T!r@$}4Iv z#32oDkb($4TN?+l0Ld0x7~rDLd7X~-MiZRSmX#IZjpE8#01I5=25`Gz zE4M$-1_wUpZmo2{d<+9}mt@+cDz8D9QvS@0R_4bY>7CdbXU{e5i^LZob14#4V~mgH z1QI(;}7pi*8i{ZE)y(gyX zo>yZtmVzPhJZF>v30{wB_8KuCueEA$ItLYd1Wf zC)L=ibKBGVTPRshZI11Z_SNj^F?G?rU0m$fubU*x{pW5VTbdNP8Iwz!)18ZSSS`_GS>bO7%PNN1#B0oE?m%rbJB|xGqC6mub;r zKGgE*NOAZ?NeRgQdj?u;?{$-J+_TSc&R~?d9?vCdWlR@WpXuA#SwdVqVaI{Q@>#t? zuRg~=6pvWts=<(m1g00z4&+XFcH;+705?XLv4$-rhNBw8-b(sTE_8h$4it8^O z4wk+-L;kP0=<<+usq4G%IA%4kAVb}2jbQR>9X9KvOS!vvjMsg>!Yf}DpF{I2y@f8!=Y=YM zi{6$DQuKD3^v>c2pDy9Ao_zuC%6R}jDvSj^L25|&-I&TZn1zWVxR zD}}cJrHt!yYmm-t;_#-;L}b*-nQ(h?BYXM6-ik6?^2Kz6rM;ukqpagcwFU;RMMSBAx|)tVI+aF1`RPK(4|F=>RGff<&~#!jZK)3d6ECHtRCcqXh7 zWw8XP^%YW`=;8b=_hGPdM2{{&@7SJ}h%=AegNLTl;j}v}f^=_%3SgyT(etGrzrGa0 zI?>HDT`?CFs=`-Kh-R>3udfEkVGwpIBT5#pyj=O7-f`=14+ARcLzUumes6GV*zyRm z3>=rOkZSUcKo3!GC=JT=vari>B$Hg~>g#{3*F-(HT^~bgMHCQ8FZxplOH=sx zu4H^@SiTwMb_D0|<$P1?a&qNi+a}()#_}@T3p%szieSxzE6K~(v9-Z58h;oZjN z_bMr+OsSJ0>M=LlERZyPYN_9C)MsX+tJ zN0iCfCW2t8B7+1O2tCxhmrT##@t~a!hQ)pI##kBD8FKPY>4m@z#IFzeFI>p9OM~3Q z@V?fvnxD(>(}@x<-*PCjUav*$BaRcfw|E9x;tLAYc_or1g6uNwJk6-n%7V^}!D4ef z@*Kb#tuCiAcFw8}KeDf=iZI#4R@2_y*vx%y%$(G>%fi0;rJ;&5Z#3g1a z?+ox5jQTgcj0pH9>)9U__{EHMWbU*sZp>wC z!*##-uiLIidAjloJ~u3qrB+ew%Gytg@$FFG7XFUlSB3>eL}Q9)NmOtppF#MdO9E~1 zkOL8iRgl$Vn9+rRAWR$Ei67asWefB) z75--X2r3r05V=%bbmy?qs1T{)P7n}6x2EM zE@RY1VLi+ug3^`N=QRyO)?H*$Nn)ok%Qgtw5g?Q#a0pv1SAAYcWDNeR&`6JYbTl&y zRFJ)tsmz2~YenR+v|>ng2n>2lHFz852v>*)F;jzc(_!6kaPvHt%bud{q}GW z&9UwudWTX?NPrpW74Xss_QpyidB$M=w6+%IpV%TyFa#?fo`&_;zSKA03??vCHwL#P z#{4U8Gyw#C|HJuAf-#s4r{wx}a#_0L_Uz)K$`|Ts^Ij*TwytcnG@-7MF>&D1 ztU&eZM}V&4eZUBv2YadNm{*0|O<&54E|~|kw?g*2Xdpk*C~D`-b6J~8^n24!dvXpO zf{!dxj3sCmL{yjJ(tet+Uc{~PT@B=ndwbkM0a{~t_o~0w=b9YjIYkGf;16KFv zMM14PpVs-xcJ&0oC*D|%UvD)75UN9Pd%~7_NyoA} zmxPH~QQQdxX53!UlTlz@+1KmRur zm4Vs+XNsyquCbiMxOWiF+;B0q+cLaSiYeFuH$n#XeJbT+0^VYhHd6)|95hpJPdAul z7w62NH-VQedk!PTY%dEVZ(ZBWukq76vgH3g9JGz%M({{`4{J*LGOc=2C5jaXYmiTv zt@eQYRCkNwSEqmj$KlI%jr5@L%T!xF&mA-qn8O7WnqBt1;74_YXBrU2^Fs_E^?l ze%j&h30ul&b+9v7V7}Xe%yHY1S;&f+GMT*E$ZKw`W_cDtNXIld{LbY>ue~>MZVy$* z`v{YskO0bM^b01IqHi`Z-Hd-Xq1K>Y7_H!}G@YhTFnqG_x0wwlLE2r(B4JQm|E>pE z@jjCiRQDnr!pimhGR`aSF0fh6ih?0IZ0zWL`q{nK;^U*Q#EWG?n1av%zk-)V7XEjr zzgM(YM8Q68p2n$9L4t@L^6F*A0?nlGn^vWxDS}PvGrHrN?z20s!91N;#3RZu`ov7k_-;YmvAw!41LoB zVR~09dO4^Owr=4PAy|(tEyu~0ef#);qd65uEXU82feEyFfA=GT;;SG;Jtnvzm&qVN zcWByW=M|R|Vr?OX#k0cf_l{Is(P`O_7L zs3mRSVQFmK^?lu2$CmGq2O!T%Kd%;gN-4#lrV5U;X_|4q(o9_lZrU=^;JrP03q33j zX$@nZHn#aQ1lD#rM7T&9ueS1V8+gXn;(0}jB1~?1e8fMo;ck5hdy2DtMD`uRy{ui6 zyd=c1I@Hr3>T=S&K@az&vEy0H$NMITri4E225DUKrVId=brmURitA#aB6- z_Xq*tPImRW(nO*5yN{9GP{4?oqT7-KcitxVFFXKxL$7TcT>Q;4hoKfb%G#ZNMX;u% z`OS-wNYmlSiS4p$HB?xC(d1Qz;e^jhuRvMyBO8`fHitfex|fL;Z`bL8_FVL2d1e6X zqQWmqffnw$=L<8MLAajCz8+FiG7K#2hJ1%KcHab(>SSb)pQxhPrD1k$B_&pCjHR#}UNa9O$27qDYitkOQ01@}9rO znaD)h^K-XVti0=7z@t!aD>+%4gs!-8>aXmpivHdJ6PUH)s(74x&23fmRH zOUH$H=%p8%J16h(_z|*J*-}wJYSvecGA|j&YC>(h$IW{con!Ph{yFs}6S2++$GJdY z&gxpP?59K0Y0y|pvg@H$5bb?IapvEYPcCELPV4k7YSD{;uJ>LI$Y1Zc>AxjH0}7Dd z#MV7S(R15V0Lx6gSw>v*6@8|acX&NgvA6VQPniUpn1YX9O`_XP#T_k}fzNK_-g^}W z@i>D_tCE?(TcPzQ;%+B@qO&jz3;x2GEP1iTj!QXlZq&Fm3X4r` zH>I5Mm8UMJe&JgN>>P3tJF1PS5hzJzW821!?I4jY1j-ELe)-A`2zhyL zVaM6IE#zbTLW}9s`};qF>@TIm@KkFu_XLUYg^9!XiKS@av9Rg!B<*a)7vXr+#|eqc z4oTitbRsUCCK5L)RX^F%x7SF&e&W2JhNI;Q^+G{%nS80SKobj%L>YhsiMM8rA3{V8 z_a_AE^j)5eU^a$ZSnmxPlzP3?Ua~^3H+d(XGF`48-VhRT4=3uG#xt}~$e#L7v0)T+ zXDrVUDMx9&E^D=Uqa`;2>=@b^=I*pKDt06~!(lu;DEFe^PT5|idQGN3Vs9Hu36R>ehE!36X9IVPV0Gd`7gDs--y+e%ZEr9wWwPJDh|IY_8UW=X!TI zMYk7(#$2v`?`>eIkux@(M_+&DykV0fNl|xZ^T&-Uajk%QnTU5!& z5(wk?I&w_XDa?ePsgUW*XTfJdz_gn5gfK9P>&7GiGr6~jy4ch$xd`seqps1zW{+B= zb7g0*_=N41VBhH_5f}nV{Za8QKcQ=X%WaYEhkrdps=yjtCKR}J!jRQPZjj8|8<5fv z2x!)BkJjWB)ntia^zzGx361WYsS+j-qaY_2>7HW|eV|U-S7=tNN*s%n+xFw83o$WC zRty^8p`4@typ!f~d%gB1%xed0Uw&}RiZ1D{4dY|y%7Z^f-?_F}-V2b$E)9D+F|-!< zyz-GGD=HAVLtY;}uL}XD0+h?=9lOlAk2pgutNZX9I<{?jDGHZ9hlYk$a_etcI$>j5 z21`m_cm8xrM|FyYUCnAEIaEg4EroM|c8YZ#VOyI_wM{u1qYIQAb-CAunYo_Dxt_j! zEc-Gdvcngk8jU7o1S0{w5%^+BPBk5@{G{VVxMDVHq<^IKfU8`?klEAq%Tq5UGWYGj>84^Tlh<^3z)sNk@^jb?N#QC~EQb@t~q#9iP zV4l;WSJ>8G!IEChpBHbdH&vaVXucH6z z{VV~D{h?ykZkFE1s53Xh{Vkj|4>M7RPdVeifX5wwQ6?t5|`(4!YW6oZ7Skvk$iy9jJEXW&&i20LM83KQ3U-kz7OsXIzk(`9lZ@q zEh`(LA3CeH_ryPep%VaR8#wup{__wnuPz0-Z$N9+IrQpyz5O4@tr}*!ZkmWOp3+v} zo)@_>b8RP)MNaxjFr`T4plg=?8xV>#xkJK!#^10>)ZotF$i8s_4?BeJtBgMR4F

    BbjOwZ+S?Y8TjczLAJM~p-s?rW>zuncfJk_DzKb>{z4f*9q5m-f?>e?WE|StW zYxvrY8hZgz>Rbg+%jSCW-5M)VZ-oz$xFqd3M=|NCTn~lgo<^!ct;ot(vnX>>ZeRi~ zEZV!3ASi6uyj+1Z^H(_;W;^7r2N^BbM|HQbS69 z6nDw77x>Fc?m*62o#BgDJ@+1UGH(NiJ9QkFxE3Aktdc4D8 zAB=O;2y^<9x>r$RuXx6!i$*^Kn(3NcSC7RT;zHbD{X+Tz1>H4l?Z+-6w>1}qYw233 zw%u59pTHL|apj<)fMwiRqhQ4D|~n zphsYUGJ&t;`aqNw-VJHbo#Tz06okKvWQjm$~u0i{IRL_5A!Qg*4n^WuUg z>>EoY+^N`snLu*ArO$)||C>lrQfcnZt(5$dei zs^6)V$cw!Z}*d#Tj_&8=-W?H6A>_Ya8Px2iIkDiM4*(d>#ET|p0y=X78o zE3&*g*$r6I0&flrn3^-_j3$DI;9eB z=nXtte$C$_w*XzynQ@?~b3bCL{_>3$wl)p(#zE&?$u@IKZjW z_WbtfR!ecC&KI^YMOgsM%CPGK7MtJr{L0@+)xg<6Nf zd7SCHDHNs;_X1yJhjV_G#e?q$1$hf;zOSl(3NxB%N${*v1-IYYH|?6P5TCTg#SE|n z??iZvP|*~sDMNHOS_gh0JR~B1NF)dUvr6;;7`Da;N<1a+3=BSXjB#;tNsVpv z5PYi8uVtW(^wr%nDGV~N@;iDdFtXF8tI!cks?HRitz8YNDoraOABYae@x;~}*`iW- z=sadts>)>mPzrM2frqX>W>Dbe@)?v4(gf_p#J6i8?CgQm^|eLnuGd4)kNb z8siKd@LN1-5Id&yqGh6*ws6(zuI_e%t@_RL65r#4 zet{ooQQQN}|CSb^;hMR>8Zi2gs6nw|DBts!V=!M7i3tY zLOsq_;k$za86+%jwJl~>LmDif+^euLTpR|tZ_p}kDfz#EcTWc5oqEQm527UGxK2g{ zukRG>OAGGAL%YGH`!6R3TUJem=!dVK-H!4o|-hICwZ9$K$zB?5J zQ*zemit=72#D}S{>+QuPySXa7KKfug!BYu1!3Q)RJo8YYV=+T~>8V@w2(PRC<%5mm zL)-e$1sCwG55mzIkvIos+3LUou9}AJHXmozcEw?>6>u%e@aS^dmv+kfUfONm+4=t2 zoT>e~RBH3iYknSwwbj^&Q3aL5@nZk*gQ^Cxe^Dpyz|Y~`GjX0EM$>WgQQNjGum`g=;v zdsB?hZEG$Ep~8AS7xn;VY}j2VfRNAWm{}q?bmQ-#M#@7g5~t5`um0Ae_m3Dvx+*2Z}vz`dLTa|WrkBVuT~SncWBem~tK4u3;J{G-*LG%915 zHlB=X#Hcgk4yLifFDuQTTyY9~s#}2ygbza2o+*c9qgS*unIWXRd z%K64A9W&)+wpg~ctRkXsT#ox7iIzP*Q9HNeFln=u1!l5*Yb7L<`cR!cYJqvV_e)do zdj00zgY<}X%2`STB@9dnW`yt|Nv*G%+8OgmAdthBig2yYi^Rm=Y|Iu7KNbs$V z@#rovI%4TIj`WMWB^;;$!KL%jb$HQbm;gTA#7{_04T!eq-_>^I8`hkhGc;;7_3(X? zC^HP&p`TLf3hr6{E!P+A1s`DAvJAm%*n11MRWsF=E5DuVe}@bYf@}vA9q~oa2NRpM zL>e+SZ(Yw_o1KGidH9lS49Ss#MN)egnkD-LB6|k-E|KkF(~Xg@#9nAEP(3<2q{}{m z>QKWfJpHRWZ=(_RKl~0;&i674NN40a5Pa$R$O!32i7*Z(5q8v53Um~n9~+O*psKZ= zzN}YE0`45&&daN2Lk*1!7!&_QPx-iPk$%zb{|B>`uk5%tgS5_I*gYQ^Be}9}!3f=O zV~5l2RUKy$eTaB4OW!Fr?zuNJaXN+V#Jw0MvI331=KC@Jz|P_Fi1jf;19Tj!HP_E1 zFE9Bj|H1kRffbk?NlUB2Jr@$*|6xn6W3 zdm+gb!u_@A%`T$oHL(fg1!uR*#xg<4Poer=hp%uM@`*>e1)YP1*jI~>%uK*gYZpzR z-T)}3(@m3nFaupNRC%C6xc)oHn)r*m@Ws}!k>QbCq~jtjj>-Gv?Y&}F29t+Ep9USQ zm$I+8Jh4m&#G&v%B_Jc)0KRP+gHIBb-Qx#M8G`)wycWvM{bATM44-LOj3=864D!ms zBAcoy#50RVwsz`2@e~)+)6}O)8l>NN~KxkyMOuj zr#aS?p$7N9Dnn4?{`vFx9V&*sT%|AZfG?;^R3k5NPb`ceOcTElg(R*2*ufFkCB70; zIqNCoGg00m)xv<++mBw;k!?9Kb~Z3q^R8vya_BUOB z?igmn8d4m)!v~$JbjTmq2Jx3ceQDfBFWv|j10eg(mH-k4h|8CDp%5tnHTO z|DnV(yRRADRm*kc(AGr>*zS)-R6BexZ;cP?=^cXp(-QyqCW>Iw@`hQFUn=8SFRzkq z?@SV}PoeZJG>5rF!PYJj2rtWQAcsN|w?{N1u}r4QeU;WGzd125Qz?CDr$;fFPWM*L z_fW(^{c*ks=}J)+$HOg7-*}PfvGj~7-JBV>n${$y+zL4fzH-GOc9p!|OIpg71wPWP z|9(F!yjR9(B;nFy)OV!bcqduS9F??b)vapwd{>}{LkRX73K%D4pS5epsh6z?Dud<% zl(1Dd0it@WRq3B7dodjB>p*50_wHzPSauF9}mqi0lATC_}q)U4pOr$uj>6<8Jl zR3@v}PL9NJ2huh8+Eb&1>U@(kt;qYcK3GmGSu*asBnJr5XRVYAwl+1!_t7R+^$$PM zt%N&~#QfQQOkhoPE`luA0Vof~L-yrAhsyOFUE)%QDmTB-`7e6Y>ldE{8Z;k)Io z8|*bYX)h_S;iG20*70`WZ+OLp`8=f(7mkwfD=-}+*S z{=%`z-o&Zcp4uDzJYdzU*kq+&Q69Gi$L|IQZ3}w)f0gC}{AQ zZDMlLK~B9PA|k<*b9BI#$7;MIY5twr$giRc$KyHKS6ohQYEFY*4E~z z9IxApZ-D8U!~_k>puQyRM&KXs!baMN%Ju1sGq-5>pjr}wiBr@Bi?~goPm*k^)SOd4{(|-muM*l_yNetJX z&&a=rm66>U#EAD}$#AVq$26w7I+C!PfUVsM^z6Dj=_?Y zw?+!C)f^ZLfP4z5e&$z%$GV+EzHKA%bQm=y?6Az|AkU46^>D0D6Y_2PrF31V@N-Q- zL$ZeruBpOaO^Sf9Xym7(H{*sd==Bsmp#=q>SUs$G$N(oF8eBGyzXAftq zFW~9Gju;Bs;9u9zk*182-Fx+ya1sZgJjX}_pLVBo!!KxViNO{ZD4&mBSq&21O{BWR^Mi#)u)Z@Vm%1Pb5eaX!8 zw~!<3Unm4-Zdi`Tn8`gv;-`{zXQPnQX!9ovSe2>&;Glf4&U+w1ev~gp*7KGY_lhZ)Y zH!f#+TCW9L&*S279&66z^|wu%uQu;Z1ngGTyW|8u)3VI>d*YAiT2)o`u|I>wi(}oh z{wqE}qXkQj8&B1dPrYyBb><)9wsuCXeqsgXvGW=vm$RBMu<^iQF(Y?Y7Nw*8OdnQ_ zJ~j$GY?=cfx&6SH#pTXCs5dXNs&jsDe8j+@e_C^@#(Ig)jRd=ZYpPMD&dj@+Bjy}? zCt=i8F#O?_R<*t4VLrpt(`ZQ(9~O&*)$NwGY;Pt*owql)MM_&#Bl|)ubPOBBPYL_f{ao0PD zMi*O&--;FcD^ewpv=PW3G`y6i863=qq^^*rrKKs_E;b5feP!|uu%B-#0+h~YV_LH^ zgs*9AAqU@EN-xRFnuutiz3S}A+E49-_uKjmKS;o91M82Ls`5`#aS$WnJ*{?J*O9~6 zW-`(6Xno*nqe?~4s@)`?G~w;39)>2f#;2A*fuU!Mou>8{M&+5DfIUY6sfhiIKPtP8 zl>^35dn+@+9Wrn3``%{k`%b|Npjp}KTfHJ@dqb#JV(qpUhPvo(8OF5`^n8HW=7OB1 z#fRjBNB98<_o-$ZwoorNKbZ)mG0yHe4I@-b`$)l0EJFMlpuE0e7Jn`6q{RbU9Cl#9bcx z0$rlnRzO7x?xUVf7w3=nOD~zYn&sf(_ZTS>c?ppPOMU0SC%i`2t$}YbSEXc8(LLKS z0o=P5HAv4(_;%4qKQ>yWZu)UiMPFjD050J>q0SgZG|X9bKX_SH+x{DYL{nDz_|t*+ zK2eL8>bIpp*W{QcGo0ZDcbWz+-mEG9h8|Gjfo)i`(#Rzc4b8v*`Dv`JF4Mh^hB=Mr zDO2^GY-FflhgsOghD_6vba;yx&AV~tY}=d9T6}^lLa$3{P)_5A}}%hya3; z)B1#xqIi1+6C;Ocm+dozVe2dbUD5H|I>k6*F*ans5+AZG1$#KLS$gt$yGYY>O9Z9a zaV~TjCHmD*926gi3TF!T{82R(1Y49f& zuJLlmnr0rjdhfD~gQs@Ey#gM|;NDP}xkD%3?&(^>QQesb9GAV!BnL=<)f5;(?YQBG6S8Th8_DbY$-4z9)4;_yrLpUTiZ! z;OMP>9YRukEMO6ym$bzP7lZ5yl17RwKlvs~!HhI?xSgBAcUX#P(PGH@S7K7C6eLp; z=8+zlXE2L<|4{R(&b8a7n3B6>1h0mAc(ftBm zk6r8WvoEDP&De7iNeQ^8*6WMa8@9QJS*SZ$|JXTP?(ufs{dtVJJ+q-~o0dk?6QU#iLQyw_ z+W_bdeCoXk91IP51Ra=8mu^`_K>9ajccjY%ms9ABE}rN@rFFlxYwWQZfwA)nunpov zA&La`h}~kc;bw$@VR3tb=Rq@!+r#}FYRU!@lIdg{v!?X^-*+?ityIFemB4*sP7<4C zW{u=yRlN6!8C%zaelsi25LQQY4}!@nR!$XXL?E)CQJG{{q*>BX2YD+FD9sEdJ2&p;+B!6hf2Q5~U z)6%3U1PJw%q|Sm4FBxe6Y(^t}1=t@r2)VeAZf8Nz^I9Gr7^{ZywB@ZYkrX=|O3@(G3;tqt=G1$mNRpjG_q z1-NnGmROiD{;IveoYxi0Ou2E`LqQ zkH7Umuc=T{W;9s0EG4!rw!HR}UiMgM3)(Cg$5mW}?kC^Q9is{DS~ZQlu@uoKorKgx zvcn)WOx7{&zOHOmcEx>Lp4y7(gQ*Ss?roFrOlsUb!RZ};F<9GfPby<0Yfy%Q@b?WH z_Niy2sO=sb>>?}G5#y6HN;@LcWluqmvZByo?ogpd*nu;7%Ttem>te3ldl9%c9j>NS z7aq9`-ERIAr54vm`}&bDjG6SVN50X2b~<16vztqDp;qf*vp65$Thi`usX*65Ju+}D&pl1RgKW{iL< z_)M#1S>xmQP7F@KXOQJ2Sx`-J_R?e+C+SNoWk2{tqVOjHz9G9Z%Syd65DadXcYE92tR4O)b0kjC2Wm_upj z{7IW7>#0&6my^Yp4;pz74slId$3$V0H4=kjSWbh&+TyckxZ1PAO8_zQk)vpt-0x!Y ziW(6B4aqE5rqCK1`>mk!G7f8~c;0#t*w@L^`wRFLalo5c&1*j25+ajlMhL|EBQp8+ z*dK29fz^mV()8sUZuIeDuXiMj&Tju0s>*tAPjm7+GsHLMy(l_}v^8g}^2)WAZ?5Ki z!6-oMNsLU8w^0x4VVAnQ9{7Epm^B0BB6tVP;W{c#r*}|N?sQ~m3(Ew=hPeA~cUPzd36I40nWr|y zk(7-Lz^DeB%L*g4kL*Q2a+&jS(TAoRC9;T}U9=6`+t13jd_E(f5F03S&*$u>SLtt( zC1#Bf89sM%alWZIJp8p;<%5%u>T{9jW_K3v_HyCK)AFt1-@E=r`BpofT&}|n)b9CO z1yaf}tU)AkIie9g8&2W`&ZPS=-hY-448ECZGzSn9J^XB@yp!* zd`fp$zdS)BPVT(;G{gz{hO$B1=(U8|Q3N)2!pQ!Xj;= z^l&G&0SKr?pKbih`HAOQl1LhVx#i0eYcz#r|cv@f@m7t4O$8kKF1I?1k0 zqrnYBC)+vXXBvdMVx4-=ji5;c7k#1C78x6>H*nIsO)|RA&Zx(FV7d&R({5^@7~dxr z<3Z0Ic1WlL$<=4grkiPc+5769WDa}QFD^m&V5=w5A!jE8)y zDbZ-lj#E~63q^Yhtt4Cl_if5D{|n;EVQ1sr&he5~Uzw~>b7}?|3(WU0ynwf;4AVcf zK(wj)`U!YJrQ)|`1?I_jks&bY6)! zY*~v6(7Q*D|9EkCI$$NQ6oYUnOf4Wl9G9C#3tKikC^OwOK=wlCFJU?1Uw745zzlMY z4#amN0#5(0gcTMtPvU&cdNZ?I-pVZJ74g0;LiZ<}c}GU#%533+`D+ZNB!<<>16ty| z7RpUkYTY7rK(11!$173g>@e3KizhlsuSAVx7WM3uI*qlJK&%i4q z->=>AU1+}k<*&Dizq84azr>g-`?W!_F;_vXxnK0&J(5|3ZQ>Za7yD~kJzxXdPE4)K z{W0t>hRt5uUSeodym_+>z$w2XWA^?L&RUSQik^t>`c2Avo1Y?S6}6Z~XHZBAy5lvn zVB*hQGSAQ7*p_TdAJ6<2BVb7&kRS%z3EoHdNRe<*xR8j}gRuGa(-}f(5%|3duIx*& z0)LM)JmKEfr2PuYm%BjSZ?tjfVld6a%s+DW5=Y$)4hJ9*P{88R<=P4-L0sy-p_M3f z`;5h+G&yK>QkPagAnxJ{>K4$!n(o}UZ^PtMR{zVA=KXkLP7|LC^EN zKU{}j1vAyJPAj#R`FBq|*Ter(#?Vry2+(BS&TU#rcCeLZ*L)RJTddcAR14GrIf`P? zwuD`gu}6C>3q*cGPHKVtHZ5b+v1=+3P9T(YXsz9c5OA-0 z@qpZgAD&0bv+O{%V65P5-Bp6t{GbJa%-rrRmt~gV!=9(!loD>DWo!Q4YWL*W`iTfA-DUde+kY6;JY95&6k2xxtnKgUNCuCR3N__?Pl2+ zBLaO8s;O;;VbsTk-HgpPd5shh)#!?ofD`zd>S9szgMgLN!?neeDEe{oO-h^MhNbu^ z8DiR(w9ZPb7lrZ3?hFQ?7ek>{PG$?(9U*yVq%HnOW2<7A8xtKXEF+ z9f40@uOwc)CVu$YNF^l4p?0?OZU(IJd4Ckdm<&Rm*>CPEErd>uhb zURHpe(oB`pj%=}rA9y|d_i?c!z~MfT>{*4qsj(7^*!;HLz*)jN5jvvMJ~`*CWzbmI zD9~U2%6!`hQHU?ailDZt5H)+_a3LVcYOgaPrLy1Nj5a8UAu_z^RR^E>Cvs1rL%BCC z{C+j8n+b$hjYohxXoU#V_tc*()qbPep8lrNPWnY!>O{|DV|+8QSLb{`^Sox2?XGS0 z!1nCwdHc&y#T`Sp2r*G>^k(1G{!E$GNe)4Inx6S`;QPS^5wgN7mHbA$SNg zp+Al|G7ICbM4Y&H%yi?(IP(AMJ1+-=^;uYwtXc2as(nV4+wxP7LEao|BAava(@3_p z`fFz`bvuHio!GUNJUXJ6m(Ew`(nX|wFb#(wQS_T;Pbit^_NmaF*Q!}dED}Ef@+@Y0 zy0Yg-wg}*XfkKN1omKN0LSbS00b#Y!t*gY&vefJg=hAKy{qF>`|BG5#t`DriGFVhyM&5=gd4TCxj?R7d2DB~Fk- ztd)@_IfgoCAo|tb)Qj-k_2Gk#ZWo`uHJNnx3{pn$%J8;JeYM;pQ1$uoXnYE@iC&ITE4qs@-aB9VV}Dw?w&{;w1~_0Fg1%R}e2 zVSY!UG|(uz(qj7sb#rxMkT0a?U|zVx z918qIoiNL$0~7%&45HC$jaJT=RSLf3Jzv1rc?dZNa2n8N(X4)!FrZmw0r^^ZafE&Q zJ053~h6?Kh@lNnv>J1i*r^UpN5*ZX2Boft>PiXk()SH(rjw!`u99V|0 zpS$A3E$V0I64gh@|+ z#jz$K9t_b@ANg>^k3spINgEfHPiE@dR7GnNd-S@(yS!_9EsT?LQWY zWhi>d@7;QP*qLxNJ40gSsy)Q*bnB}3$iJC;Um&Ci@d(_7OTDD(i5NhI#>J^j=J!N zeCGGB25@*WnqQLOmWSuQ4|cYU!`kHgSDlX<)sR%meSF3nt`flRBUmlqP4e4IE>e{E^kRGj7MF?@Hiq9Opj7+5t-a=* zuUUwY);;~;_Xt)bTpr97t=5~T%n=DRazB*i5m6q8wqDfx|x-ph$c6!#I zk00r!?qt(>5dko*2u#qxHBE?}C2dkJ@T@vxOgDH6Feh94n{5hL#eb1wC1Wi@iL6lqlY zvirMo#a5>ppd29Z770gN5|+{LQQCFP=Ib_B7fv!Q8!}dSq$pnjI)-xI=HP%57)9wf z!YIn10!C5Jt|N{eu6V8WMg%U+vKfDP-nR$wH32s?X701L4}XX}W0q~wVf8FwfKUvR zr`LVA8()KNV+zSqb5#1^qT)rlk6Sq(uOQZWJk=aL3?gu{^kCw;l11Fv5S#*CI#(+x zySLjVH=FC7gm=Zg{aui8Z_9|k)OTiLdnyZjS)I^F!bO+3cF-SEn4MyMoelf>z@I!o zd$cDw;e1<||F%B3(ekwW0%@n5p$0rTdoj|Cd8zQs+Pnk(!b3Hv_tbPW)JZe&=ENDo zZ6mN979Pc)DiI!hH-2+ZSBweVV>iKpn-JCmyL;ySCb11z>g@YK3>=(t0LrroB0@09 zb)qNJdLa|x-g%Iow2~r%M@1`H1n$1@o^WBCI9G^2=Fj#p@8*JAom(Hjgj|0wdD(+- z+oG45tQw98grYxfKcmy()A=?mGPfjE3joaYcJ1X zy3f3V#C+->#?<;}_eatu+hOxGb)mO;o?V3GQbbjb1-H+5y2R#w>Lgnmay%yp}Acm`$hmHZFZXCR1-LD*LBkOl3o7C6mx2 zA+l!qX;h(e$j$DRnFn*$(JmKbG9US6wU&WOH~z|CZPM+xN2Y3j-Lk0oaXdCA+HD~s zbtY&q;8?w)6XEd6E!qh$FlV@Ns*+`>G6s5q)-PkssrQ88((tOnl}2JCt?kK) zIcy0uITz)0O`Sa-9&=+3G^4c$1tgv(s2n}R>8qzK>Cmy~)kDHw)n|CZZWbhyu_rys zFmcG6kpWpejj9$o#{8X5vcHul+&{vT!jtfnug-5Fw4$%Ibl6-T|R>V!$>tl}4Q)>oXi0DgwSFVCv0 zNdzN=;0v$qj$F4GD>6|EZMS-P_2@`jWkCKpP1hZ}`9VRMd6PFwf)d-yQUNduGJd2W zr0%@D?KQSrtm;4!ODm=FEZVegIl+!uDmM8kVBL@7U&Q@V6iC;$$-K_VZ8s1?THnNh=cC;!KCbYg9qY8S zhd!UZNq2AXHZ3%$76|a@w9L>yvc(E@fQSkJuLSVpFi$@1et}bQMRL{fL?{VCH1~NL zk)>c0ZkzJ=Z&8Cr4ZFH@4Gy=>A)_RzF8ZWi9|vYQ1q`}h4IL3Ot~Jje0xwgrU6?xk zh=2vUMo4~BVIof~F%Dx1M8_wV7ztfvcl(DWMBHCo`akL}-%TaxzN?JrPgGAUQeKsO z`^9uBG&}_HsoRbqHoZp;4YCj^zv@)O>7mZAx#=xxSplJzuMgWac@C!4-Oj(wmaMs4 zrh#U*L6a0g6JMUHx6V3y^V$D~CFZbMfO!#G|8E7j`%82J!chbcJ6S7{iIdoadXs3d&g|BS~Cy!8iES* zfBI~ys^$j%X)O=hnHbLswKvD+(3>7>SrBG`feMTVP;?ey->V&i<`NglSs*am2Ey=m zP|t2U=jir0Qsa3?zVZCn@2vW#fH_?ZHsUKRtTb7tF)%jXoUq41P*f6^$KjL_$PO`7 zJ6dW^LiI=rwpcW2kS*fo(+~n_SG}OR4-)OZzwrwW4(c$ZqJpJ+1vRv^PCkmZTeD(S z4}Tr2rqJcWLJ8nv$doAlMTC-s`=jln64PgU)FAV=%!>~SNpP4cJu9wcH@EwAtgmVH z;iu<~vcss5>8%FLR+VQ{9Aym6N=GZ+`IZ1Jgz&!cdGvAzPVo`vhThrC7>bJ~ zK*mwZ#J1y{-{h(332XHVI~_GX>Z@SipnnVtHpxF4ZZ9+Ue;mDP&Q=+HrP5#a*wsFM zi;_(@@g{QncM0dt(f+DE6_!|di^Wchn8<#9@rb0*D>Kcxp$6{c{nn(lF zUH)gqCBXDWNtaY!F^9PPB1ZWnPEJ6nW|423N_ zKfUubtsu8E%m5LPIGz8v|j{A-wTzmDeU5GO=i;L^a zg|rt81Ao<$y4&IXACMu>W4^`0VwG)+z=NCRVqAJ~g*zJNo`N1xqrtuRd4V~(ji~i8 z!Sz2!^|GUEXS+SOA3y!DPmL$Y{2YZ&^?<)LW`vsJGYh$C>GxY35?}eqZe1E{Zw#iO zk3WYOJgz@4Wf)%}9bKii%v(CQ`PMtRXCp7N;34974Rf{Za@^Fk=RZn%cj_zkx4IrE zSej>o?c9_OkgQ(I#;x?5<)qrc@kyT7iU4~;&YeF?SIAZYEEi~dOsCDdP3~y~s1F};KiMc`A96H{WWk zP_^Aza7*Vlh;T>PHS6*^uth$=vu18sg=Nn{TVMebIqpL1cw>2b_V^BGUWwh*h_ZS}vI zH`e~9*7_*>pmUrKKW4*1D${1mt#<%Jldch(LLz^<$>|MFV7#=V7Sw8vFT$KGCcl$l zKqyJ~WbT56Zt1&-_q_$+v|sFl^NOzv0Yex8U;B-`PdLuH9d}D?YodL#?&sno_L%Bo zWnucxgi{Cc($^RT@lIR_av4f`sqjooDqLb0Rl zj<@ALpg#L~fV1fLcs5JK2M^EZ4*?kIhBwIBezj-wW}ERf_B@VDz%XxvQBRBG$!AUf z;0ZL>T$C#5B|#qP5~N|y14X*?{;*bbTea|ei_D`e`*EO1t~IOByzuIKWD7QJ;rL|V z`F=5D5kT^b^k6&oyiEFn>!PC!e!5aSEME_yME60ZAEM@n#L|9AG;H=07Q$W)l!2Go4;?%old^p~s72ZHOTKG!H|rGE{KId$KP)EOJBC7 zO^)mTB9kz;>AWK;gZIqUJ_v)Hh#HGNH~T2L1(D+?BzNeIeqqAzVF@nU#{^dy=dZ^E zS5aB6#Zgw6FWq^-IX?3mD6aOraosaLxXkP1=6|G_sP_P+qyG|UIxSo)ccH&;H2)$I zyeKSJl_s&;q`{vHOOxAE@|>bf%rNTij+2a)$o)0&bg|J;cok58Z3DY6*Sl@7s{hC_ zzjMXdG%BU}{dFDd`-)p)!UK}cAO+9F4L%X>qKD3YKou?8vk@bsFHnC0#Bjp}TA#7e zLp5%wehq?$lZjH;r}KdX!C529PNcN{EEW&x{R)qBhW|)7R9M|JhvZ0XTF2KwiX{yPoato&6n}eFg zF^jkzcE({tw`Kp*1~ernH?;8CthyyK3LzoQ+w2@-!h{5g%VI{SOFX8g1g6TB=7-9r zN+K{L$P1g@6Qw1?g^Tv*sExXUX7DvvS#HYi)0d`j zz7L<1sr{{AqS4wxXlP*}qgvCiqa$;T#IVetg@v?1-npg$(G^b`iQNha|IzAGI$0?5 z9dgzIR`ZH<7th#mzwhW47hkW8e9fUMPsYr`;`A;q^;&)Lmnv@LC#r?!+9_^RgsYI|u>9qM2+zfksR~M;Cl=a^;c%TP z&7J!ZR+~}wL?SOE>ZY7wQxc>3S5NRGnw_6pr40D-l)U#d(fEgF40Ro!prdof_wHxE z$m_k2vlQ5hvP&uwY~D4ohL}P`J%6}SO7Z7 zk9||Jed(mV6WaZq*V*P7f?VSY__Rb5=y4IuxI!lDeafXc(QviX14|Vx*HaB^{7n@F zR6VAO=y%0zY&H;lKxY3pC)hmeo{bO|^S7C!DFaqXPXyX%W@c_7mij|KCVK1YJ)>j^pLSxuJJ z$ct1L9eRZ7omw#o)&u`g@b-3SObWaehPxbkx%I}wmxZjc(p^n7@`%BP0DJ|5eFJSr zk=xs)c4#yBWmIi+IyjSK_xecOY;@4PnBPA$5>iw|$hP-U*z<;}WhnuT^nKf8D)DK< z>*M8fu*HVs04X_*gJ38b{&m*zt%54%+Ho6K9;4oX2xJIoOP+GS)U8>2s|SL!n==Ic zCq={p(A?h1lrjOdmOTFuoROCTCKe>t(v@q%c*A)DI{%+|rugB#;G?HudY>Vc^q!yi zokhL*SWLAhuNN1@wT49pW<&PycLe#HhRYgSxNwZr-H@G-Rfdf#Tts+0ISL{llNeK< zAW38{dW`>nk>qel+H^b6@)j213QjMFcis&Q-jwfDh0_Y1Ysgx|NtiJ=9^nJHwjJ#_G3BJ2YO5%jTr!>A zaA_B_0Z#6_tb1RS1Oc;GMNY9BEQ{UYsJmaIVP+u2|EQug`j~51zFGxYoYC(mL)sLz znxHrnI4l+;w-q-1jtA-z?yV9+A~C_uNMgF?k7~^WUrlJcMU%(_g);6*mi?`#i`B+u z@g=$6P5t-r#(-c@+0ag-cXRadVuuPW=XO=3Rc%YY&WHch4J9>UrX6Z&a!R`RZF72L zCE=X_v3vuL54VIs#b+_qrEzRP|Hq^%_b?i|__Vd(rOorb{ih^SIC)W_%G#W&(HH!7 zCw3lf^|l|o2F!c0BXQD^Cgb&Ect#;fA6i$n-$OItOcLB*n65JcZWefRnU*!@$17m= zW&hjVUX&R9f|CI&0Yw(3&^LphMaNl8{z05|h4xm5SAH~(yIo(Rf(3Z;{3fHghlR86 zk^LAK4$7J}E55CRRkzLQ3I-xV2@48aQ;#PnOx;8!?_`~QhzlVmxacZCnx+efsK@>j zxg<~gQt$^8zvH)b?0EVD^Ea+Ue8MR)hB2omrlx$(?;4R+f5ITh>AIWiUajZL+`!6D zVxxw(}X!(kMZj=!Ge>R4mq2jX~cOO#a?X5A?`iaNl9{!rlkI}Nc4y47-DH3eZw zC0rb#6vy2iwjXPu_Nv0E4&%)~n$?fqi0AI6gZE+A8WMuHcvGE_b6>hW1htv885L;i zM7RQPt5wg}Mmu32!BLNb`eXW!L~7V1dK3kQ>X#&1)xAz7Qh>$gRI(zT}w zTinB@_G|lYFAI81WLjagVpM0HDTM?AWswPBW?w{3L#54(8y z+IEPBQ1y;T<NNE_{9Wmek6R(A21P@L$0R3=^CJ><$hVTgEW(7$*s=HJM4-6&aLIcfhYx)2^+ZqgGYf@m0a*$hbFwZTXJb_O&MYY zLfguT@&hxcJ8U)!Kj<^Vtzt_-$vVNQLr@P)@u9rE9tIFV#&lzKpRyB#jCXbta7e%f zcvogfU;;@au8oe64rn4(hWfNGrT<^j{0$nxvZNEaQ)6mi9E%9&6nt8bjX;V4PYJ{qlU%*_WS z#ubaL4WL_Zf^xIWV(wx6JT}mjZ~X4hkNXB|I=oktvO(<@;?rZCB^NedNl0L%HoUh* z8&CrsTctB;2+J*?B}s&B3?C=m9rUqW-lm@ONQ$z(-zIVwOq=+WD|?nCm0$QphA(K? z%6&m4L0hS4sI2g-T7aqE3=mxK*k?ap07qL}-z#wm-2eL} zEX1z8_EZcQjo=51kDuX1SSvknO{>Ih@ri^PzAk0! zYtS!*C1yy>8AMC+q#i{?QBMBo1v`s%*yyjLJHwc>NTdkGW@*Qc5s1W1Z0gp0_ZZ_LVV zZ8S~JT^ywdUg^_i92^dlPlF5U&{XtRx%)vSIHzFFnoS|-V+~>dzM}AY7b`=F^A4xb z#i-ZkrpWN7*O&5`=RrmY^07N`)ntT@5EoG8!Qw?^r#1>Etw7{&?Pop#@%3zIL3>>w zFuV6J>Nl`ANeb99U6c7j#*;QD&dFNClAUj)P?6WxPJPG?&m;V}5_N+9_MRND4} zckjGwHZ*`*WTi@^uTLwhcy=~tLDoUz=NUMl|bT_C7h_rNfch|ru2uO=` zcXu~KcZW1cH$%g~#IwQce_!|ezW4Kfd7e*xk(oVvuf5i99mjE=>xCwDk)(|^$#g=6 zthEHY%J&t<0#yNzXOs+cGCdkf&Gw9S{yLsH$8$)M-OnF@90J-|SVJ74q_dqKw8FF~ z<|d7O+*S}o`%ny3^^dC6um(hzya@_p2PXhkYlw28_>!kig~BZ+NpkAty-nh!CuavygU&p>(9 z;M93CuiR9L-CsIhjs(oORvj4Bt`XjqcF8xo8LbBdxW54bZa5I&_H+|UKpXnTCBXh& zNfL7l*-&8`BR_OuBl~BjZa2W=$H$@J@u{QpCRV#{WazyW*{!R*^(z|WnY@YDQ(obl zCEoNgAZ$v7A2_o8xR8m;5#(O@Ak^#NsZ^*;sGX2m%dFY-hmDkxV*cd~C9 zq-T)OR3R%KQXn(~j6$BFP0sJ<9 z^no;$c{zXtCunEV;PGiH`B8PJSxVrwud zT4K7DMtPL~HC_h8hSwnouBtRgPTFso%2fX>$Me#39k;ykHCMBAWP%B|)b$-p;W^3n z>Csh@PdNNBK?1PYSbc}Vig@-NFmAF)5!q$s^Jwp6`(N&tqM~@mPBfIR9?nsQk!SXt zk~tzz0V5Eoc$>VEKWByc7qBr?Al_+n==6*5l~z&A3MB4sJ}gGL!sJ&gZ=MB@^=lMr zE~|^Ev^S;Ok8rX70*PN+=#k(f{$l0GX?f_0&$g2}DH{h?e`OgV`rr|Mz+f4#_1&*h=RSb_DR`nXjk z$L{QFIQAasDMdlB7HPB5c?b6liATgUhCd5^BfAGP~gM)G%Lqi5bna3WpLuD||c zI%fVg9gVq$8_S~a+<95uc+J6%fxQwfZj)|>g@XdhH;7$Gx?VlnXd996rx+xZa`94QsFt=Bb462F$-Du% zx(+Ejxsd~Yd?(-Lk+tOIysCJ5qUOU8C8f|_UBxk1FlQ}NqZQv@$`P~gL|VVYrns=r zDxe*v1Wdm;pL;5Js258*cm_i=N{ARcU+()&#HwzA@*UA$s4`RIJb?_ z49RMSwpNyBZ*f&77tra2g5(r&q{mnyB15uV3^x*(STw9;(}1`YqqS zqhkR!+pA_TpB@(JPHVNZgtc`g-!RGJSIzbD7*f7vl8BT?Qoibi%mVwwTpI>L$V&qu z3ijah-aXgppA*-YjBQ5;p2wBIX(wl8^Jh{bB{_Z+H{T<#L(X6DUcumv-0R+&z$YSC z>F%@ado!e8bieC#e-ZK`^sm_IB3-%DtQ733`>{Pq-fHXUX4AZq8v#wg`E0oAr|UV_ zd-6jf{L(0!ruq9>gsvFpI_KeKChA5b71s*HMpH1h#5|Z2Nrts2TE^s+qFlaReqG}f5 z-c`+}`km4TzT9@ZI58tgS6X$!m`5d{ChxuI={X@ z-J9^U{5*4sAXs#F;Uk4RFPtv99?|qI&3GpyyL~TILAK11zLGU@*~D3~x!7Bu=@!;6 zNahg&p4d4E96iLCsW4Sx7PW0OBhGw$Oa%E;VL=SZ5o{M*XkYvg!7k%iVRS%KXt59^ zc_O9kb^3bPvpGc0YDIPeRnT?gR{v-hW9rH#NP43p)JLVlqk1{SazHBZ<2of-O0VCV z!-XbdQNp@JoY-}Y?+rF2?B#_}r=kw`!7iAMg4+F)I+GyZ6>KU9kKM2*qp`UXn0%Ie z$#C9vhA)IB@a?UPLl%bjef-(X^>9^|Wo3iv=&v6{2{?J^T%GSr zF1@5uRXV!QQ-s5vsH}jLhy?Dih7nNJ&SWuE8}vRYbhTE-r*=1(vyt8Tk&!anrtE~! zM@B zpk#5G#QoggPd9T#X&g-1{{Z}STWhcu{sCirDXH&QQD7eGQ0ch9t zdQkRK&)|tR)LI#QLhS*bj9aA_!m~Eo>6j^;SMw{eByIuU?P@r12rMMkr;BJX`xD^L58J}7xquMr-uJ$D(g zb-Paute{8bcom@f-&>U`q`nG!DComwrrk_?tfxE?V5LVQ;pIEVW*QeE8z#S6SNEzZ zJq;r!A{#9?GsTg*W)XDXWRv@4e^y%VTX$Q+&_DqO%DHpD(saRj>}Z4hVk!sDWz`?T z+Q>)!I&+tIrOu0C@oF9=e~i1>t)z*K%eN=ht7Wb7%s8ALsH#2m&yKhm2p8wntjBeVF!L645FNEBL}liUWS2ECI2JR%QmjZEtNPR zJ*0Hw{~+&%WH%rV+7f)fOG7pfC;n z@?CA{JUwcFm^D!}ixoQeZ29pYb5W>=N2;u69Hg-{PS6Xze0Vd@gsJ4$wftD>ii(_t zYMYt?GN3Qz)0b^d5~qW1rQ#G=T*20q8^y4v%2VQpZ$3k%CWOMB?RKwcMNc@2^zLXl zASQY+si zuC2aj=b^g6pG?nRHO-9wr-QLwC6+`ClEiuz?Cz@~#+cg4 z=(9clNs`Gk{ru7XvT!qgZMFq}IT^{2*nVy8Mb(xE?JzL z`A7C>yoi7?_m}R+7=&k-q(!SkJ4&uD2M@Z&e?R6TCgsSa%1h+ zr|hFJ{K~MV2x1$Mbi+%quA>gox1@qtVJpmpp+=tGt2|?u-svRjeS75)w{SD`>l6Pe z8=9adOKr9gd7F~VMj0dp%@1Kly$9i%&I3keXAF=E$Xe6%sG3uQ3B|xr9NkkOC_tak zegg*L18Lg+A<{WwU}b%6i=P?4tV~s-qph>Hqxj?5r}!cc3$<0+Vpm4^ez2y#pv0fryb*lqA^6DsG)Sa0gu3DJ^iaS6fl7kDq>m5m+*ecd(?B&P_;McLoX1zzH35@NpvK zdVbVt$4Y?$`ZN+QBiyuzj;1D>ZzlNBD%(XeMd{V0B~QtSH`2DIe1T~B`RTNn@!8}* zyEvqs_hvh1HWP!4;(;7qkaE#B;(RXvIku9nD`97so0&_isH|>&udnH4$&`h^&o{Xi z%F@06rJJK+Z&NS#moCkw#P@|vyFw9KZS^*m+B zr+J>9{Tp2m7fze8w-3OZx%ECkp=hv@i2EEHZX;x%kZ1Z8S^kw$QT+vOiQi+070Gug zs({A)W+Dh&B9T|dos^#J6&Gl38ntOSL|NmxXFl60aQKI0mnPO!DD zoyN=M1iu5}? zsZ^;O1aH3fRTde4*pFQBQiLd@>UWWsAH;2QhOX9C!ywJ25B)7hAFxHx-dwAlYVQlV zhw{T@`@{-27yrXgn&L^gIRTzk!&&x)4Znl^i6yOCJ6r;K*t#cu?^m4XZwH39$ z@Hq)4{EpL(Mx5N&zFHvyiR+*9Pp+y6B)SgDJrq`-TqY!Gk})pTL*KApA=C)O`g2^5>-1Y*xH}JJ zJfXH!A9rP8-$@K!c8I2AiAA#y^Nn0mW zJ#Qbl-NYm+Xg{x_^8De5nfeOD6;heGLveD1}4XQIRqG?a{PEu%K{cYmIQ5h2+Wh#XA-Iw<#fcD?QfzlWqx@ zn+g}~YptV&{8<=`r6_9f~PxsOc&kv`5!#iGqgstxIH#m4xBp~UO543v~e6B`vWGSz( zLlJ1aW^wjLZ7RV{=}<`CO*Oer^UvaUTH(8F2b9eMV+paTos4od6#o88FBRP!8YVJ z5Ez}X<*Z0u&5y|?ki_;;63-%GgzR4wGXhX-4xuCDwoLe&EI|4l$p?6v6^K*sSwT>v zYtU~t6S!kAJ9CEG-izvN_--Z~*Pd^wOXpy4HDPmUeJ<%P1HTt+pn^GQ4Qk$(MeZ$i zZOdg52>hioy9L~_jl5yB|#G?w;x(aN_1(+d)Gb+81z1L1z!bYVrw0HP{ zBR6lI+gg?7XDacZN&TB_M^!bdGzlZO6T@pp>S&+YJhn`s`BUuKOgC6#4+I+2U}X@m z6mvECu0PdCMo3Wm>SuG5Qhxdk^oeQbq=2Yv&g*_v%yGS(%SxjKppQCq8YIP>ASp7+ zHXSSWYqO*XnAet#M9d!Y$8%M>P~Dx1bJb_=o`?i%MJ_qKLNGHM`Z~QLN{()YY(9vf zPkHcD4BzDI{cF$WyO5JpL_cNNx`BpTEn5@e+ipdzUab&JYyEkL)h$>9R_%GUHiwn7 zz;>(j0O>WE&ESG4Pw%VS-=f$Zip=3Mvxw*pk9_L$?uk*P!t=hhNCq0=eVk6-kvEok zJe3 zrW)y|X6)PPx|>Z6H~#a7xj3$hV9A4~I3_F7)!!Ur_A)DD-Wt6@O*C&S{f(Me>&g{^ z5GJPHb8%&It5-`d)WVYO<&NbiL!0$;7{8!*36ij5yh{x6I*r~(2LIM{ZO5tnyyMkC zmHM&+YAG}9UA$(*XKPrUW&vGVR_BY@Z|#uS&4%lpU$tM>4E~9#;dU5p;0y(sYUA8-qxz*a(~f%BiFpJkFP(c0^Yoz!OcB?!cfEA|9wSAm1SM) zS=W&FbN;xa-x&x0E4|!a`pjR!^z4EBM=kw6rs*CthX?{OuTrirLJf&Z2HLu_sdojCSNn!# zG19`GgF(=u%=tIQE+erEf(3Kb9O3U?M&uOgZ7nb#y^nU#xrT9{%(&z@XqBX$@*drr zHzwx)&1}4ri#MYg<0E&wuFZb>w%mUgs~GoX(oKsnx1#rg%=RG@s{TY_J>Z_!e`zSZ+p@ z#N3!0oyJ85hCeM5V{faF{sev9w>&D~&&ZXtO4MYR1Su=gHar%6} zY_sd*YAFJx_CnBQOyz-9`lAA#M3QK;4D+{`T!38mTzOzA@FQ$08;-G2WXe~s zFWUEKyX8j=X6)r3{6ft9kLBE~*zDPWd{~?zI%R%ujdy-W zGR`qmW~zzEY?qHwy(;a`0xv!yt5dY~*UE~VguHxiVdccbNDmS1k||sa^t7+S zy2Pzt^?XJ0g`Z=Z0Rmxy9_MqmJ|)Pv{P@V7Hw0>5B@9i?%53n)rb}cn5YoBG;d|L5 z$_3(qRwU1j+k9BsCdmniIn+2aYZ&n}cKnSkDJvfOhy6Zee&w`U^U(j5*&s=O3N30j z64laZHO`|eLO93qaLTnm3t+T7q;8l9FMELAK zV3wI{U_zh@H9=FzdF%Vhu9*cK_Y zaO#snoT*nS?gi0j4wb`8f9Aw*=gbL=GcVrUT*=W8e#f}|yp&AO+so`&jv@&YhTR^7*f{F|dco^mn7w`o9SOndj4hvClSh%4A9Jy@Ez~a)HP8U=r&XZQ+hG`K-~iA))(qZP;{=5ABoX(dCKSPrT;}D znA+6Ir}q>G?W9Wf^F`Yp(8*i}o#il>rLH0$%0Jsjk|RUA68)81tVcWI{~H!M{O(d= zTNLClYpe*%lI!I;BGa@WD(7Fm!_o>1bHC2z(d1iC5o$#T>+~EgxUVF_#Sc((cpOb| z%y>ThDA~^N$xu@M2?8Cbi;ooh*BrMk<$gKs3B3ByoRAg&M>$(2wzDtE=&}iA04vNR zFiMgL#kb{LJ;rj%hFtRs+c0)%l*jp|$aF3>1In1h2IXv*3chh!eNRx0DWgM|Y`4I5 z`Pw+83|DGHZ|@*giID;culJs&P)tBcQ)hjkT6XQ(c%&r%y}0vb%ijcUN6(6ke_w8Y z=XcHspl>;^+dYKW^O}8rV*)?2T68Z&C;m(_2;SFQnBTwmi_XB)CS`=eYqru~Fd_QO z3bRpf*Q-D-=B$Cqz~Ix@eMHPR#wO7B<>?N>eq@4JmhxqEn3a*9C230+5T?s7?lIN= zZ%`AJeFHVod$vo5abQ!Z7+Nv=k*O0!Z!6aSA9OrlnF@>lOD&x>0JS&@yuGX* zFy1{%x>Txe&9bU6`^X({;whGsSTwNsYfZh&eM#s+b1BX}mi@q~_m-0Z@lvpr&YNBY z55wEc`8Pgg*-180-piJfrg+b(9Pn3EDGfFER@W z3KG?nC49YqkDImT^34!mr*y&s7ti)~jC4GCsWVLS>yNWB!$d9eLaTRptdt>Xukobr;QZTKw~(vAf4BroK*{54 z1+O4h{jZqqmhc(B;-->YfRHt3T+`e5p8$a;F6jP$;NtT5zu@BGv{7M#js3QhiQM^_ z=7yJ67x9!=vh@ zc2H6;dMtIvye;G546E*E1}zbuW^RdMunnVuB)0Gm-~qiZ8RJII1Y8&4b`O`@QBXgu zKdD{y?w_T;;1wBx!{Zn6TiRS8Vc&4d!cLub;xJm2vC#E_WAQF$q!3N=*Et4*?yF8I z^0Su-K8iz%lRZo(ld(jxT&8!zAYS}xdq(53Iwvb0^mJiNHVj&Vl;Bm#xMoXk(Sg*h zjeLhNk$@>N=8@6csc1Ni09ABq6Sy-<`j{ZIv@j~5&Da?V|NQlHST!)KPW+6 z$vq=I4Jb4~3t#urW01uVYgBCMz(~@ordRn#bZ>FB+Bw=(I~ry3(RMtpJEF6)r;hq!J^~?yYAdPnkCXY?w{iGfaB~tT zy7ai}DdJT;hncs?zwH;$x%F72Bgh+^?Yg#2bmQOD7e~zTg$Wrn$89k)GGRs&5cz)& z4E$h}l_i!sPkQX$r66 zS0a)@p6vtECCV5GB|%POG|@;=9?i1?$H@yohH7EMH#ACkzPy814)}p=VIn-3mi-;M zthH-9-5hNbs)EjYN0aMBvcMCJ*AMa}F9895g>;>?q#yWp{GA2N^pP82;UOfX z;yD5&pejUQBR|0x%2RO3%JzXiIyX_H!V6(!#$1Jb8`0Rhu(b zr`^Op0&~;s83Z@%{aalB45SN1csi~N>et`@VW45ofI%2V;38R%SL?IuH6FcpsO*)< z8e>e9(jV)etjn9j3R;r}ahyJizD|E6zzVe^X&1-aVcsjo>8Exlf6g-AELcCb$fPdnT^Bvx9(`dCa-j8t@3K;Bh{!X`e%I+YP za0?7llCPRSKJ64fHr@c0$1@2sZA=(5p=mrjnXxE2f${0A#fPn=SzVxE7Vi!8GM1;g z;+)Vl4NlJ_Je+=XTw(?1qD=-BH(Ig$3mXYgDFYv2b!5zeo=sYB-2VK31IP0~-8R+8rM%&@ z`LzqT*j={f6<>^G3Plm3;jkPP?T>V{hQ^)_8T=RCwWT>avbL4_0w`Cdd_) zKF1rfk>R~8aI(WAyr<#Cd^ZbHObPAnA)oZGz=yk~r_#-r_ zX~>7UOZ^WVsPw7U-&V_ zQxkeT{DPY%g@RdjEjloPm5@-dG_mr^w(do3fZcFN#wL{M&+NA*)8D5mnf_d?P=tw_ z!vT}IU|fV0{057bx0>>~fG!XUPNK!xTf~*lF-I_KuwmTGufU$s_!u_z#)~uLP3Rr0 z&lgZiuWn-3w8?Ac5Y+n80!wORthutIuR$`s7 zt#IQpecov}`{(JxU^>&%*7aS(i#;tLWQVDn$_a10Hw~5CE${dovtx9gio|_U`dGw- z?X#$^3Ad{Lb%F^W9UC>tXY0F=<&=^^ad`p)L7(VNqC-Pgo?%63)5NkW^w4ZP(kxJ)UJ{Fdr|bJ|v;3ZcFcG=JXSse(A#>Tg8@C z08p38jIjI9GILyhZ;3UXxnpWRa5;iq8)eUxWAa|*xSWiKZEmE>1#iCJxLi=~?<4y# z(Y7;LKu1T%JKOn*_WsQh<@Gz1w0GjJj~l$|rJ--l$@pFg-DwIwYO9pXlUgCGYk zawv?{;J`8M>TO@j3uNWT``BfOe#nXUXaebhXXwj8wlr5p6mn1N*@G9`SAr9lbT2470=mx=L&3|h4AJ04*O34K)=jMU$Ue>TR)#Bqda>Qo46O%TlwDs6o z94TPH`VUfXUccNdta{Cl1&yE|Acwpf+%rB`OTOD=nYs^Il%+^}d8H%0bd9FWg1sqj zP9AR|M~s3Bxr~xaUD5$Z&5CVZ5-~AxJ-=XkTwKz=Wn{#v`9!Uqy7Ow{5u)LIu~AQu zNOP?~eFFyNYG&RM~?&XYJlKlLGpw?;@X?Ax!ZMGvNLxQ3l z^gc>vuloyWqPyj68R&}&K%Okf%4hmYve*lc5owC7_sjk`Y@HD6r$jv0T>cwg&$S)| z_Ii3cJk3+Et&@x!?3(vA08gkj{~ZTLe+S1dE$TJZjgIlLox^5>gF|}NpAwuZ5%GrS z_FR_`kjX?PI`_-J#5P(cA}%$anOPYbYLe7mLL8q`CPLdDb7o@5g>Ta4MU2*-ax< z2=+mePyvn`&>{?{a7&wtC%>}JO8@&HVyWWo)h9#o4xc_qb_N4_dmwmVSy$stw$T^Q zqhA3fDHq-A{KiQp)WJbayMuZJ; zgT^72h`r4i;B>A-gdw_n?KOvr?nb|n-WpIjC&;I7M=yd;8Z>bNNvjBL7k0X zi0h*`J+j?yaaw>B)Ijk;=e8h?$6L8XTUw%Q5BKd3)e>fMBed7RMQlB{vm}-ORAe!P z&Mw)X3JhEvu&pfYu^$oGxjsl`!*`YX%#vYWI84iVdHHuMr>Ez4bigP$oAv3_gKz01 z-B-b5WfV7c1b}>GNM{QT1S*eN0~@FpFy>pGAZC)zuJpn~v62-*!$t!lvZaaR&xMZP z2$7JS{IQT7@c2lXeeklpS8Ni)Q01c3slm@6?3tjygUxfP_ZOj+pH3>)yXhKXT||Xv zGpWW72ZFNW%$E}O;+ z^xLlZi^lJXYv=C4@Asb_ZQy69?GLULCivMeebsT@tBSfT{1V-W;z~-c1F}=dp6mHO zEt5k1(^W~@Dju{W`Ykos=|ECvMObL|h;^%PjbIPe{av@crn7r@#%66r{Ad0rVtX{+ z&qX2Y zVm%P(vnhA(ExZ*EJ6Jyg`Mswq?DZ)|Y*uix-_N1|n8B%_0rghDP6^XKVmXrwxoGbM zS&QrVuaJYk*Tvg)`ts>O*rTWcvx|A5t!+4a1zsH`*KX@{D&r>k_8 z7gnw;FN?oGj&L={vLtXe^wTk`_a`2WvkW&EmV@rqu${H570$0y%OQoMhvVB01^_4P zP59zMaQ_h7xee+_XKx8PnaMp=A8dT^38Cej+<9upt_FkH_g%o-<{#;l3T`9+)&!HF z0k0KxyuWerouG5Sbf2dQBa0!fAr4{ot)Y(@edZHE?u`QB8hcx%Qu3qd{SpO@iF)$Y z8}vve_xqm2-BT8gs^aCrela0gW&0HYUw0V<)J2a#mh@Qobj=~R#?*CjSBEq-El>5s z;eYi7pl@k&-Ph4_-&Av*_;j^Vd}m1oHgDm`2RgfbDPQg+xdSJ&6S2#k`L1t*^|%3)#w;|ia*NjsW zrW19-f||l7?1EcMZbHLeD&A^ZUUuaAaCg4CZ9ZX-kWXf}PSt8nZlX)rT+V7%4Pq~F z4#}Cd1=dyWeP2<;xxDQ zFKvPhCx7*ox&P8vrU<#G(AB)07(OkNIbzH&0AW6dy1r?LB z#a54Y^O}b6Ie0)e7@nW8F^8$YJMpR+uM2-Byp(T_5BWzXTK_8(dHm7lirD|g_la_T z2ohbdKP#LPbge0ZWzu-6^4F#MbQLE_ra4(cx?i4jgE8wDf~FgVX$-floc{h7@7Kr` zll|IoDRP$BZXMDO%C7vvgUI*~DBkd}kfed<2*UjXP~vD!?V~-_-o}#b((T|NsuY!) zYa=&Kew_!HaRNp-B2c#gyEqv|RG@n~zv<7xh!i8u5)I-*MICkW9QkH9I$*>3DUEW3 zWYo-7*q*4lrNE*w@`Sa73FL=?;iTV*g+*&e{_PT>5vM&LfT2wyrO*_Nvm~pxR$Fx$ zfx~L;E({5#1jwr9LC*fk(ubJ`b6=D82o-fDG6T1-^55}dKjSy{g0^D9&MptK) zLfvb3MO-f@?;845m%Dbw5L^vK5WCzAsUHSCX+tL+*$NrL^sFVEJ@UO=z|EJe8FTDk zpJ4Rgu#Jyz|Lnl)G`Xzk6f?Ii<3NuaGZz;gp4KqVo)|YXGbF~#TPzkrnq$O0MC@WQ zb*lw=OV&@ZP56CyKgm(Kr7k+>iP^5RHTeA+*#Y+a3Wz}FmEQniHc<*#tT23+t$B!#2O4Ls?tPIqEMOR#C+=*lEg{2r}Kq~JDA%1%) zE*SpbnWFMOz%iBSW`vIZ&#Zzxj})6@SP;#Z^m9w)@09dsRobiHDMd(@a2@n1$X1%1 zj>M?N>{({rtXLn>|0n+Vd#;?VQ=D1+-gH$^C^?`0e-xu;gH74fm}f-yB?E&*s6|E7 z%E!J?$sORhHEHvcVSh(Mel@y>?nj85ht#FbjML+^^qbV}p;bXV$T$CzpCD&=_f0r| zVBr=@rLov{L}y$<_f4r6w%`sPX+KBlTWfm<#XQQnj)y9B=tKEiRN>^z5qv>Lx@4o| zO23q-k@+da%Lp*l0LyahaM(w9wb{hsr$?kzmajo28>iu`ct4irFVsY}jitHYyC2sT z{ULbf$?C7rI^Ll0Lku8*!IFQM!?;mSE~S4YrTnV7wL+P&pxYG|&CZ|vXh?8)us$Dht< zH5)fDPtK-(u$o)xsm!v9d%n!FY|Gz%%D+vDV1iAIlD@{C4{hkNqVPs8Dj3__kLB z*pE5VF_gI3qfRZAUYERM`Pj!4TChK$>8b1cFx#H=hRuN2B0dRiw~%C7@Y`q{wZ6&E ze2#hWfo(G^X-oAEae_{|9?J|%m6NU5hOmW2HFBHXCB1M38q?3`8K!vhGlT15&-f*2=@*Ck>Yyh%$uujx6Eu7j zk5K`q0nsI{*Y?@MIxPWatZ_gX-D#5_R8#h2ES-_z`pV6HvyNWad1JAs|AhNXWzJ7g z==^7?Es4$)+NQt1cjb_;>%lh)J|qlZY{`>L12rFoMWNX$Q6n^*nKMkyp7&naF}p|} zUnbF$XbR!ROPuuJ2%c-bmfO2QIhbK52|QYECjRY@^+Fs;3l9LBw)D}kgUJ+!(AGkD zbdk(zpSVza?Vga#U}3=}&B@imX8CpRfg{+Sdvj4Rz88G(BWLC3Y4!ZP{oOF2sEGVp ziW-sb@%*f7l4J4?r@u9GQ_udUNf~^2%Kl=nnryQ;9-MfIpZ&LM!Ur;I9EZoT3sJ;` z{GJD~@23K8J{_s=z9VzmF=z*F#tBB~6H5wHwqJdX z0GhQ>SqXgId~wXI(}|VQyb`m(uLd8MFMNxkh!G;d#39QxwPc6k$prm$)m7q(Y)xaB z(ZD!cG3!oUN|91FMTdf$gN;%k!+vtlXi#2{_uuxZR7VQK*9DPHX51QHmyvC$KC81A znMNdk%-TaXk(egBf(Al5ePhgB<%>iKVDC%(tpEHHXW*BpUNH))b7$MFc5zrQ_}EBh zK>5pg>&o!UhgK11+Kr?%BfMB-Gc>>4SX{(O)(N8hAH@)TvHqI8=j4h9wz+ z{v464ZF^mj>Fhbk8V)gwbeCC~?M8j*u2;n+VKVSk<5Bl2Du*wZpGEq93m$jd$r7(E z&gh-qmCb_na-Vn-(*{11u(_Jv=B6LtP5yK>4PWj0cU+fRr24dwT!NSPWx4*y3j1DP zCy5& z+x+@CjAmC;8@$PUy5lPFduSc*u^6`Zh+g;l;Z!F(J_vF+WRmbObA22dXbKxgv%ESb z_d2?p%ag>HPp*H#BrIKzlWOH|c{M1duI#-Xkd4|eTJty`7Pf{5jQ#BcbQ3E)V zTK3fN57yEz=j)upnL1xl=#un-EVT4Dso?9%09FxXUpK0%&VJ845OEic-*^u--}LU0 zMhQv#0MRfFeB4986)NSdA+bRzJA*0awUTwMpi`>v@q{#IDafSLFqz``9*R-;2Mei_ z(Zoyyni=*{RdAnM&T-EPB%Uf(C`B1u>uA2F@nA10L z41ykGuX+Ue=) z5VPm8%4~Q^g*^>?*DF(w?#9le!s zi?5PHjJ{`dPqlD8@*i-;&?R~KK}j}B5jh#f`lbq~S34RamxVXd_nDCB4UljdmPz{@ zdQp-n;k7)BV}&XY(!Pg38jJCA;VdG}8!fs+<&YG>JTL?z#hEYa(n*)fw1xfokp@j(zPZC|7Yab{o0t9X z6+)8R-MHsvT8+p}4{+sbT`_Hfk%?78q!X4y4Hv{$_r*@SxntzT-sCJHIb3SHk1zX$ z<;PB9jr(-#5oc6N+_$~e!?>wQ!NO%UZ=Ow-CYteLf3xH+ye%N z^^?n%lHJs*0U;XbjwDZ2UWD$lEa-g4LP~2hh%A8?`7zWOk&^^Cb~kcDvThx7w#?f_ zDtUw=h~gyK26advE2Of>6>Gu287@sn`pmQI)}vYqP2M%$kkXcpiQnN4zlSJL21>Am zK~B_IS--r-2Kq$RVy8DLW2scs{Ys6S~XsqhUz3H^JbU_=6V#V;SRXHQ+yG^p4LO zVc>brRACok7^{YT!}z?XB6`@5#fb6iYDhWg!XD|aVdH*rAPxN{Tb{mxC8kbly;m9` zL3OZEefNU>xM8*Ss`wx=Rb=H7pLh05XMyk__TuTJ?E0o`IiKQSlznHr1cD-4WtKY_ zr27J$(lyyFSzBPfM5_{n>An##uV{dH^Xo_!xCvjikr+#{f*zmv5s@$CuA2; zo%BCTc;+YbF#Of?1DNfdb4beMs;G z$XVNc>zaZ}8TD3w>ASGjTh389OqvZbF7A1$y!}PU73MKJ&ziXGQmHrEZ=j}ZP93v2 zlenZk6KkVG+@CnfPj_-X)37frMak`lgUop56ddbezZW>AbTInJdc6YAq|97}7s%X~ z>Hjv_8xja2qmh^dPHt^R;!nzYd&Fx>*Hs#PEfGo_oK3gy3;NAs0iXIV0~L!1yb4f( z1iTI``MoLo7;H7i9ET)=xV>`-k4TX9+BN2I_M5JPlfG#@ez5ztIkRgYA~7LrRhwWp zGo#l`A?&Yn{_!|P5Q$ao`;?}LU>2yKHm=C-5r-w~#IhqT+Dx>>*tx4v2=v3E)xpt} z!}bk*(7I@0+{OK@ZkLVA%rT4^UX({6d;RDHA)V|6J416yO++6Ja^fxO9z@4K&nv`% z2?){#cnPm&$!3Ed&0dtBNM(m4^yV+DUj~Ag697%DiD@-xPN)igd$U>X5%f`}#A_RC z1I?~L_k2=0V(P37!m0b5Re?CyHjG6?xDN8 zyQcTx|GMt`dG@}qy$<3X?pBR@-yK{a&ZI37TL=}U_Cgm~ z3Oe4>QKK%T6%4wtYd;jl$7T4AcSOjfUit(hQ8l*EnQM}}YIVzVoZyVwgH9y{9dnB$8++*jC|=<~Cetj9Lo^m#mPr#D``KgEPW75Rb}dR38R zr5+{2_0Hf@H*RAh?NR7yog~tb&zyfdZT)c&zgSL89HjUD#>xJ0M#e;WXMU${QuYpS zRMrQqu(5JS31_^zReG+FkAG={pOq;A8~@x|?k;LCat=S|zw&<~4&6mnk++V=x8X&h z&{|v;5c`#@SH!2SeRAU`$6Z`yRvbzi{p9Q~Ca$lWoE*zq2r)$}tcm8;9*W+018i)? z)i{OxE|TNnd4PWCLobBi`oCFqJS#YI(@O47v(%6@O$Pun+fEO~o8A;yIn;gzYFWC! zfi^l-tix^Ol{B>o?28KHGa7+Us)0jkYZ3F2!0E+kkL~@xZHC^vmp3fVlnXYmE^fTK zUx+4MUL?eo3p%?A$~7O(4W0#xi##!SGi!6baTXhP(g56LG$UWvHbL!f?f~6DAv?4^ z);qwXO^Zh2A``L7fSJKbfxh~+g_P}og%>xOdARH2n*thmw;Zbe6+hg(jvuZlje%@O z0TT$)edDCVTV5Z=qHKbLsvISF*tg{D#&fKK4S@eu`@AO3u4}XOrp3ushv81PxJS2i z5TtQ^|H;BxaWYYgbfMSGqMEtS*hK&Hj%-cS*EqO&a=u^eKH#Sm*Et=`9v7Pg-{z}N z19Q6$XSr+7nBqwJb!SINdbQ|}9H+qz1O1`+CN9FLeqon=U-D9jMWvMDJ{XHb?pd#1 zhq1Gh{xq-s*{32hvXgP3eZO)w1yCVDp*A$V5$q{(!A+ndj7{F*T`nM1KwtcBws|&- z@A^$T>4fFeViHiSz7QlbBjmKwZ6lMoAoc0J_A$$>bT9&mJJOFDy!NSVRfeq^;q;=An#GH9aol5>!6UBz9>KA3r{^g zTL?uWMMihQ)81n_zc1YkA_O+vIkvI6NlA+UOJ)67$9R7c)yXd=`(QlSsHE&ZbN>#1WQoOZrBCK}`u zjW73kOIFbo^7+rz9a@uVYtAi?Nr8T9oZx~c&L2v{x{~USyCWQ#pIB6w!5`lD;uW&< zK4eHhxlvuVNCtJ*#-UF3U!|us1}`1)i(!0_KTanu=lGoXtDcFnAzUe}6MZ`W;LJ)M zfSQX7IZX}T*(7kiw-HPu*{a7w#Z#Rl$f|!v;qS9Zw*je;9diy}7zJ>~;Ld@*4=%E?o zs_V`5xOx=d-GSe_pm6`0!4|6n^iK^N2#Sz@n(@9e{Lh8VOj+1!QQ?KF`%*z-@G+)2 z`Z$jFyDz~pQ!#HWECkFskw|SYfIF!miV6(rq#u5jNd~`%=;}uq85=v=Rhdt}dn{+% z)=460HFl@*qfG3JgaGHd%v4PMCoL^8FO(=wGs+!8QWk9H*y%FyB(eG7I`(m_5Bw`&;*5dV5G_sv&MHmYpv4A9eQ zj%KxDdgv93ZT(I?#2f4ToEE?kO+4E&tgxCIE2P<%_e+=$<3cXMS}5{-?FIb;aP1I8k-^-|Knw<($ZP!NnU~?C^9GW`U7l=;h9ov7H4PU~3{3vA-TdDy$Yik)0ygnO*7n zoU5cwKiGCD5$F@t@w`V`1R~uf#nI}17J88G3nIJCdo9^gYTJH8-9N?-Z5TGXf&&9P zreE!Wh^j-RBxgNW23g;ND$Z>-Lx*Kz=Ju1WT9>SVuHCO*{6GHQE@FBxYjf!Bp6{_R zriL2;jd7=(pnNE-zaBg==A_SO2C4d{0{}dE^2CBGTKalGc~ZQe;Y!k@vMb$2IZ-BIJG%2HG|dM+ zyxUau5hzW^?9N$ACls{XSi>ADdEr+VGP$7B`=N~9z(3WE0#2wUUgzj!wC-~u2=!km z(ey(YF~&h(Z$LB@DlOOfFdhRr+0$<;E%qfb64qkDJ}l=JZ!%>h)s|VhwSFhOnuJE0 z=`7yQ7W1W@IpY(s@ag4=_6I!1bzKBAXq%7M{G_c{#=z}7M^Kf^XqQmKV|#So!zB(4 zA-PCQ%?7zLF%e#7`^t2~J;@K>rnJ?G`8(|=dQS_jBVNrx)v)X$6;2qKflvl3g^-(? z%O`>G51#R=7akEMJ_@nGyIb)Id zRKACgC+Z1LeuoIxv)mv`F=PN^vgXhbSHV43x{GM~mBBn{minT#<=(e)mfDrFZ6N=t zzdn^OjJQ|{Me``Ark%*_Qj>)4{1y;dR294Z6de>yHE+)9Oy8I`yvkbn94c~YTFV)u z`t?PNQ`fyu4bhjZ^F1Y(O}z)T_@8#dvn9rPPcyz?@6F8F6cXu(VrGcF3VE1L% zyB4&PP2WOiwz>?JxC@(%0`QMpv_B?t3*vz%BTj3wpyB?U03RsH%4kJ)F0|C1nZ=q2LMKqiQ#lr zaAF6cEO6XAED*MH^-|J9gVO{W(I#wJgu1b4xxF}Ryub1@zX zPhTmWMusNtY9wsBf;Zt$VipkQ06hDfKOA=`7%PRq&)amr#*bI3hXUh8FRTvZXNeXi&O1kp> z{-5(;L4$XU6xdUh1&?|rqS)|iVEt4T2QlP6n`3r%U8dHlW-Ogwl)e6d_ozi>*AQ+O zL9BcwBnHFOk@(3cWCb{}sxalp1}}O((Z4}x!QsoxZQj$!IgQpY_vvVaIJSd0zyoWr z6=g*1j^IekZ)tfHp->`(1lJ#aMi8Z8gYg;WLJgDA0#AANkTCmCm* zT^Uy*{hI@6aG&H=InFc|oad|+05PM8+>>q@I89XHz{DYsW+Ya5B<4w%xF`G>1)I;R z0ETY2v~S%c*eg;41EsrI>a!ek%SbZ2D$JW$_*}_F!GdA$&Px(&-#+DYB3J9<48aqy~&>0U9k- zmA+b|)fL(+^O$KGridk5RemmQ`Vy6rle^kAbS3D&jatgBXzN16k@pebgpy8_^`O`T zhOmqgGm~%pqQ3q_P{SLaoN6ry-Ltr_>_(nJRRS74=FRLpEy7KI4MDCCbrSD9cIt*G zHX`l|Zz5HBCwyF+cNbQ9Ojzbu{`PdVrnLt1%2uH`g*zvY!v zUCg}@BoGsg7qNFi0xKDi6MBccyZ$t-RHyZFhBZ3=cr-;xdp)sl(oWn|H*AG;#G1j+ zns%R+TBSv3s5|5sD3%%54UG^yrZa=99^a#!2uKKZ+dJ1AG0_1(bSqx_6!S-#*3tl2 zOvt@EUBOzL(KUn-t>a-T;s6?NZLi;~bxCqSc@|3a(`r zEj*E7p++dQ=A)L+DB{D{CQqkNYhJ@%QaC#uTfOHU++2Anr4C(?X}MoN>#*rtH&o}W zu`})JLh_BSTMw_pVkI%@zaCuZcb!N`vfZMMA6xHA5nyEtSWU?NaDQsIW+j?xayZ+C z6BM}ygFdJ;qtcaA|Fl@_t8&R(TE>h!1}sEyqFFR;o41t7ww>}93uos}IBFLgS(1)R zpzR1VPm|O3*lvm0Jl&43tL)tQI~#8Poefc@zLH)v`7T=X-|sf#EYLtzn{G4@rjlRIw*M1&Dw5r zJ^yW`l=>cO|_155iEEX{S}shGCu#?-aSaTbyH9C)kkaL zX`h!D1K{;t$my4Gf(3l8t7p+K@c~awTH&JOK2Zk?-CevbU3g5uk$&m4cVkeRKUZXt zq%Tp4aCZ6CyxdulG(gjy-=(MYU{j=mc?461XgGIYqQj84r4n+u8xpK@GHW)6JfWnX zeS6YZN9<{LKp%jiFq&yGKYui)9ow)sL6%(x={++f@VNS>JppX<&Ej3nD_D#zN{#@d zDM5oeZ&Hq4BWoUg?~bDSXLiZM!eaq;el zWeqlZscpH_+<5}Pl!OY24`9{qLx8LT_ zs{_))uZ=h(^Ltrk)bhS|38rtntm-21@naUY#!|xBL{qq+cYNJ&0YV-jQiv^BmBSR~ zC-T9WIzVeDiYJ7-(~qgRAH0z1G>;n|dog_>tP~qVPNl?A0CIwTt2lZ%t!)DhLDNtJ zSB}ZVFsk-Uxho25i&izd1;JLE!LQeG;@VpAUB^|aALi~(&bD}^rY}~ZHd+TN5Cdr& zPb8<|=fJCB&U{RBml{t?KoeRmSqx^Ol8f23^Q$Q@HyWtSVGC;wilq58mQUu^5yb4z zMY#E1P7KXJQdsD8cI7DUwiQxXIAtR|k}PD=zE^YTed^>K_I7Opp}Mwqb$WVov!(SW z_~lFg4+d+e$R=rSwKd{T9e&gLYnPl>6$Zsm`s6S#e(sSx?c?wiCU+8i!BW4f&j|-_ zZ@w#(>@VT;cYR=}pe z=)DL~363M>*dhPf(u3J8M!S*=sVTYbpV4H#n(bD^%AZG{8D?)p_5j#1jET5KyAJOI zw*4~HX6#C=TTyU#%SR;DHt^(%EIPXT7*G&N83Kp_7mb_e%#06`F86YF=+vA}vNtnE z+{52jsQh;uPL93k0KKvLJj&Sn1{K`P>Bs}|+EG&eziRx{CfDwn9NpkHpyj^x%x-r z3ZrqAmfz6}F0$Q|G=`5tezRh=^$C3GkB&g@|Z&;!)gx4U-={A5YPn1Syc@*SL37 zPMp_;gbV>|Xo1GV>iBp!jm;j#cipY90tJjsU$Os*c@zBArvfLLJc{7T({ox0_PtE%(PFN`Z)43-P4qccW+ ztx4}DT@jZpZ$wzb(FBo7l@xJ}U}8>+0kc1K3T#d_79;(vTMu}Dvhl0->pn2Z;Y7tK z*n4wbwd(52{JKvsBM*tnZfK&Nx#ANrzm}Cak}4&+r&CK|8=l9LJ$*WLIw1KWttM5b zMMo#G*bE){9p>}p{&75ltK)C0Rei+3&M1!*cwR@gxqo^To(t_|^_Ki|+0>CUEO2^1 z$Y44-dxcBbuOhWmiq~YqH#!tVdGKV5^mE#2DQ%AlTIMpkQ7Y~OZAXF@;r2up@xbo- zX&dri3ijJvNxj>cPU+!7EF#tD5Fyv^W5Vv;%z{vDh#@`TWwp*ZWZbckl_rZpak37d zmtvo1e!3mqKlfTX)aBQ{WoJk8KZ5Yl7~!|M>VvqKosh<1VQwNP_mgu4?CL%_^0?s^ zg6Smsso(RD*zRK%S*KXPaW#INT1I<*Yc?Tw&V!j7y188V1YT?4Ba6c}3Apiwg_h5o z7Ae;Uus05T=RX_PYD1o5n_}QYH&iY*M#9BQj+i){mkJ zgtry@k##}4!Hn3Djm39#O#Q%Dj5UX!S|j5CjN3UxO|_GRpR3k&o-M|8RXvhkDqqa@ zdCgSny`i2A<@2`$#`kX$rFk4BG5BDwR*QSdpcm~fK61T)OgPQARF!Q3C&_?P8x=IJ zy?OLieBf1{RmWzI6Hnujc@HF$s_`8^KMD!{E*l%W6ZhlCLjc&1Nju=|nPX&foubWD zp^DFF_zbJip^K8!ZYlWFSc?Lzlj3rJawU7ecEn`?$WK-XD_t$QYCF+b+Kw; zw$384#jQg-hgVLr4lAa=vziMnj6NKGZT|p}Co$LK()fH1)3T0m29&(!n7R{rGG5iQ0pT4Cs*bIs%MlZw_dTMIGEnXdL?GL%kMj z5OSMcyN(B^XZHirCqUrkGA||?anbXHx~6QH&lU_JM>79Qq9JnO@(??^IY2V}z8icK z9f(e(JzcnoE>S3*l*pSHU8QjwA_RIs7A7L2)+T17z*^w_Ki22O8gsuSa!MBLTdfhC zt2~ls&|WX?tG5{tGB_jV(G`VD!vYIpzie>m@Gw0y&jkvC9PjKSI?hc4&TYN2fT|-P zZ;WuWcB8yk=4ipB@^1cRqgges_96>b_qn^$6@pfoCZ)S1KwL>+azPW4y6z1cXKvuM zY?w!7;({7co<_cK>vx6kiv@Mmmz9{a_?}+|Kc#e4TXrnb>y9NZc@8LTV;@ZmpD+Z) z24UPW`R*~36)+o>Qwa%0JsTv=JrfWI2hjn|H%a3VMAvuZvrW)2%0wL7wXI^GoD1d8 zH46o%diC*@ZH?Ml6?VzVNy`DtVBoVPEUGzO^WkA=qI4$qvWMOaAO5C2@hSLDSDuEw zlvlF!>L2SfVUoFDjW6}lGeq`Vr+t24S%#LKZm3XS!j82z*C;3zRgGDg#l5xBR00EE z+WIbgSDnip!iIt9t>#e-w--1{dUc&0F+<+>rQe%f52QqNE-X<&+a;goB_nS;;uJQh%fjOaBD)bq$De8h2L_Q$ISUNq0($poSTr+_$3YMd4xMD zCEhvVL4EaM!O0Bsle1_YyQTE#%r-7BcQJ`5ig#=9`29YLm^2R}61taggqxPGIFi%N z)ca`dzw?ktFb>eE9{>2i5x$+F*IRHao$H z&Z}rPXmnQ5#nLZHlEm-b9ax_@5&8qgFKdkZP88nn={i_xv5aq`RB^Jsmo#^kv-4j* zgwtV456YYwn=(QgcbW%>w|)0}it`k(a>kgzqtoa+#z;9@EJC7su-VdppC0Klab-8) z7?#Nhd416tEjF^}#bcTASu;8uk>`v$Em^aYUlXAMWuh3Y7L#5tDu?OvTd*{OPnY1f ztehJ@oiQVDG3sM8GH0FHm%9&fq8~kHQ+fy{$G30xAM4yCJ6weA=*D^4jys0QoyXrA z(a_^tiYKkl*;6K(zGNyLS^xY35BV0+=cjpfdb#Rs@I}9XEV59ZYs-E@Iyt!b%SvUa z#;LcOnSuk6f@9pq(XnsCMfmBZ#)JBPqt$0fUODb1BR{@h^xt1gMQeQY*NJBQRhF%klxeCr- z!E`hzE1*W%$MybD`ueV?+`yBDey!#?k6U)m%SM}B40y?)!+3l3GCWN=$%wlRII&~>;_x<8IfXHfgx~% z_X0Q>w9^~LUsd|e51z0BEYP7RmP({8FJ?%lR+OUaDsrBBkbZjziK-H%DT|3Orp`+^ zPb65sO(emP{~?OJ@l(1(p|Accjg=yy*D_nYJ5XA^`~X3~G@bPH1c8we^!ba9JFF>_4*KdCN+ccWy88|N7D!V1?n+!&FX5778 z3^=x~>yIJ7a|kKFvk&5s6AHDK?=(cKKWT0Urq6cSr{5UE;;RC^ZFBGgyu`n2cu{ju z^nj`%T4FNw)wZwkd8q@=QAK=7h8EE!Ebjcv|k8C^4J! zRG6!F9Yas)lA@gqEW$rK(N-ut*3WqT5mH;}U~r18pxD<@d=zA$yc1I4qWV5!{L-Sr zR99N+kos-(1c?L3-O?b65l$0kZo}JWyg9!xWYddWv5_8x9&guTwRIw5$71P4?*B}x z8gazX`W*>ogX*6BEIazjNzqfbS+!{$pB})ov9_XBtd|Pw2=L1EYYz6ITU~|bJ|6*R zql|=GUWblf6>MK97t~^IpMcvDx6cIlulvfCuLv@H%-hYO+cvHS4awAi?XtI7XXc|^UedD=76>>mwE?ejm0E57zZ(Ea%CE&Yv3j%?|+EUKFv zE5A`aP0nqK@=~q>1JrDf>973Bi8q|OiR*718YgVHthQL1SlaY$CLTUHLG2k*{#q}{ z4JAM`#i#fp=sx%*A!$$LBUk@u%g1a1`*V4vH^1dsk57cRZG+;4U;U)0TrFYeq8CWM zc0+JQEn7rtfjvg{=lxqzr|V#f(Txj*A7ZVchg+(}7#{|t#Cb%ipE22$wo>lw4>Cbr zkwDAFyGKW4WyRh>Nc;WH3-;Y^ErRpoxO2F`8=`wAM}{zGeLcptgOB@PM05`EU1BgS zU(az%aoG!zaC<=2A}U=%0AeyBb3e>)zGJ2X;&c>S#7R#fI#`*6gAy*QnxqzV?Qk0& z%bo15?HdG$G>Cv~2A&1;cDKOGil=oe(|WhANQ0-3*>@HrpMrlxl<@;QKB2~3kU5$X z(9k_z+$bo&0drWDS%W4|z_zX^YBdJnlY*TyyyCTCkvlgKyO5L4icF44iWOjQFAJ34 z!2=I;z%3|UmlVZ2jAFK0>^l&HogU}UdYE>4?2rSNu?f7(8J8nlGhK|i`3J6FPR>o= zN+so<{r?0IP6h|G?@2X*f!b#~Chx|p@NrIw8C5|${;$%X)-#r~kNz4w4;8e0;5LE$ zIG3k-sm0NqFx|_O@^BGJIqUn!$#8N=llwJrWI&?`LA?KH2d%h{Oi;7o*9%P9<^;1c z^zm2H&T%k{TrsIiVI<5^zSQ1@4mEt$m`(%`{o^h-6DPk@DE`}UQYCrzQ(X9VTd~qq z4ajt&rG9yWAzb4oH;UMusNv*fM2ug?<#Fnz3V34S?!{#nm$F?aYFATKt$D)13|`!uiM>h8Ea zS4Z>^blg%vmUn#6{v%RbA6nQCVdzp2+`uhfsi?6Zv0By`p{ZIOf*8!hN|l%LG9;-7 zG^Zy@%&xwvJ(IpYGSQ{0vhk1k0HB!D;7>jYypzL1bR6)-xvK)2V%^%ua_Up%j`)$( zLan7!-#LI-FvFYHZ&4-IcG?Rd6Rvs1Y69 znS6}_AsW7ONHAWM-AXsCFrzk{RMR>pdGagw;X%2gnb|tuuP%uvXQUu{A4a{e$@%`h zA`RMz!TGRZs(l^o_G`D)HyNW4!f)lfksS7UcT2MTF*5WT#~vzLMAj{8780OA8bqRBL$ZH`E(hGHNCw zj;pGgdHGOpFREek?R?~Hm~O8qY%T6oQ)LEPZHiQ&38aY61q8uCv;g%Vz~=>!pU1ox zp!3behxht`{YZBqj z9^{suPO7p;^wIi)bcFYbt6qnb&!XhbE?sF|| zM>c%vctDI(suy(u_n{xRmhmUth6DoOC6ul-$M3rZi~&kK(@yeV_hnswR2c%po#UOQ z!0Ed>m^!xU5&cS&r@tJHIwq4C^=4m=CJV17i0yv#lE}ZNBAmX~*KMZ0$_6Vn;4BIA zH<`X9Qe?`L)s+-=Aa^Ipz^@diuO*>fjG_g*(5gxI5SB9TOn9g~bWyFSR zV0LNUF=`gT2TWMWs6~Ht^BEW4M4&9yf8~g%F`d@pY_Q?3nfq48>RLGK$zxNtnzGrx za_~{r1KlU9oB>_y?q??bKi>+}GNuJh1mj?AMB z43I;xm_P74oz*bgzl{SA9TzV(y<6llXRfjUU zw)xao|E{QU&_ObPD)}imx9c;|N!^OJMJ7c@5UnLWy-HLXF+)A#dPK>OaA6);Umxm> zPU2hDaPxHe7PsX!38qvR3{Wt)V}Zzu&tC|xt}HAAMuop^-aD?;`^?c?UK)7tZM42!-@K`DMI&>Xk{{H@W1RG za&5NCy!$IjL_E1~=Wb4k9rngZP5|GbzQ!yTW50H{gFHw?EDZV%c|X00ZT>Nb*4JtH z#6#R7^(vIFv~VIF@#xQGN9JQY)dTCpVsc#mKtyB8|L8b&RucqE?s={B=rDSJqB z*WI1}xRO3cs2VC(LDmvoPp=MBK#spH%6*M7Ax4m}FH1IVBz4iyZ-CqZqYg5thfkXS zRmC;_kP-sNdCtpHG#2-XSSo~Ypul<->!HyaxBF?U2nnTwH(;<1PgD`Q%wX4S#Cj+x zp5E_>HGk=6e?T>UzwXv2PaCi6YW=obr;9Q}&Mc+f;n}0I<{Ea7n`%z5k#8|rbNvfp zjFi(InV@^diW{=EUG29lv(%x%o?Fy`H3Ha!FyJ$~Pa124F3zaYZ*SVy46K8zA!uS&+kQID(wp(yv8SR%e{urc-~ zGW@K_5h-rTcgA4%Mz2r#GV0?Qx~#IM$F=&6po3Ni1jps?yI7{Fv9tFw8w?R3VY}TI z_@z(o+3|)!98OZsAa^XB?OMEVjD#iraG1Sg*V`1XbZGPHz)MQSkdksS6T|YoJponI z6WxD>{KS9g=RY0_HhCqloJz@7rh@(Ak8*e&jK_V!=e|N0(Sp=+tD}2R4IwkwzPF|G zn*z3|ypfN@K^rVg2m3E&SR&AUo9{<4p+TsDEzkyZQ_lsj5rC z9}1=E52&j%Z3`FBO$@ z;{Ev(KSX&wnUnkp6how6d2*C0*^USVtXfW{jMW>t?yr$H3G7QGN2heRI}Ydq_iby_ zxqMq~8oU!+n)isJYWzqw*rNmyhAI6bql@O_u&(Y)xM@4m{fz8on0j2H3&zs3hQu2nM4#JN2i#+TRZ!SDI zdMJ7^@`y{oa#aK86g-6xX5XkQW zYQtNnd&V0P1U91I!YAX}2FD>Wv*k1-oV#Vgm2!_!Chsv1Fq|#*yaj_!U0}MRg`0AI1#K`CWz^d|97EA-PLmn*Xg*X_ zwe0w;ExnXbdG}%Ep@M-~9+H}%G2uwd4rpgCtn5xckw%d`^YGI_|K=#|VgcYbu7s6{ zVrcwidU?FB1fEt31cCt{ye;N(5DJwb!RMnb4A`U+z#nWTqVhM!;!DW!;j@9|RiqP! zcW_blO9PuC9BKe%IYFsSme`MqMi`Z|zvsnVe z)RECveX1T1P@uyYh=18W23>l)ElK#te>Ppo?SNm&)Cyf{`ThXQ)94GQJ^XM zSK7L&^dRDqS0J_3G&jZF|GOxs`Is61&BQkPO~!vK^Y)XH4JL^tW~qhFgfAJbwO1~w z{x&|;W|Pg4X_cBFtl}XR*I&)Q$9ApxNkwHa;h%M};X4vI+;v;qpSrwkXI-Zve1m8m z1sVG8k)=CW^`CUR1CG;qGxYZU`uDUixIqF)o!(sJiH$Fd`S#6*NN_*>j|`Q_=tng1 z-bp-A_$$t)YsAB`8^<~Ad8=H5o%-S}jPW$tohZ&;(sk03s5l%@;HVA$F2{Quy?Jq* z!g}Kz`+F4jK|ivya2evHsqA-W6}sxdsq%nfmZHa^T{?ZfKNZD+-P~)#$Nmb2?skg`g$>>8&pGgW|R33z>qo|N4ztON7z%sYjJc{QO)ByS06iAa67rEk+ z3$0HWBQx1fH?U0laO(6%W%;C*#Ib!OGy@pU(uebQCLO%0?LOnc3ZbTNAE=ltw{M31 zC(&N`3MiBV1qT1`NI??cx3kKU!jD+F_F}Bux!iSIzgC&9V+%J+*+;D>EL0a9{!X9z zLN9}ivohu6`J4_*FVph6|LaFwxORn=qcjESPAKA>{v^w@VieLwnjUnvJCVIY{-g@y z{y*9lykJoz&GzEIO$qwy!}7m?N1sLc+&yzNO$qA3{T}%yd`VWP9!@TKB`c+9n&6>+ z_EJ4O0SsTCB?d|CsGksH)-KHmzc-!t!v}N&G{KKsal*#kNta)lh{)2!!ZcBTkykpB;I~;7(yp(e%d) zkntb1wy~C9d+;c5Y?Qm`i8MElH3GgjweCl?+T4aa69*#B%u09V?g>|bJee&b*ev1=Gahk6!=YBmN+ z0=+5BR^&KDtRP2slTYodPh>=KDFF1ww=|@@Yw` zJvOzk{&Kw{d*)>76c-=xb|>vjrs&So{v-YC^}>W$)6^N>0i7p%oVm?i^x2L;@;{J2 zPhn&G{~^f#olV_~C4fx;j6)|+Cvn3Vb7sr||DGegEPo8qwk*UY$xfEH)W{15aO z->)OMZshHo?Ro6qKAp~n0&!u37QlXEU~%>Wdq3~zb5rD z$m?-ibXK>@hCM8^+<5giwUE_U!wLqa@BJkY!<-N*2mdQ1!6r;&xjj(7KJWT} z0+KNN7bKB-aScg?Eq!H0yq(k>dw#jJWtGv22IEBXj$4+Z?U*nw;2z|gs&e#_;HPrr zH1CuG8#+KWFZ^jzy|1B6$(%zDaA0QP`ngc3hT@@HFUbgyzx4UUv*>n#hCNYnL@tQa z8xP%@)dTna^cs*w9G9#+AZ9S!irVVwoA1d-Q2Jhs)}G8BSZGBmY`M?m4>SgMGgB45 zV1ouloOb(aE&|Qhc(o^Gk!0)PpCHejbpu1JF2$4 zE%M+c6af!bC(UM7&BHP;Dp1zOw>kfQycah=a^oO#dKX^8_n2sKiCHGHr>TkMFIy}Uhn)ZBJ0-kLwdPdAQ-^`nO;$XcOQ6y-*LZa(QRl>=%A z&V=+h_)dI97iNJ-W|?jLL^a0T=)<0wyB4fBWa_nt(c-k`?`x*QG56TUVkPa7^+lMH z?FA_3LPl!uXRc_RZ(0GSuTFOsG5$P#|4l#bmo=PFW|w(8si8?9H}(bA8VRGW012HH z?W1%?Q?(FDk&A_6(J?5u_i)&XLD%(Hli7ad46H#{k0&2M6V9vNTfyF)#d3-+e^l1= zOE3~|X^VvERDf(Z72?``Fm=y^*MYc3-en$YW!!1+4qF!sHv@-PQE|4I(DYp|)?5Ro z7Vlee*J-xna0T9|k9~y!F1y2l8|NqRWi)%!*|wczDXvkRm;iI2gY||3r^VrG803G( z8eH4PYJ*(pB!eQP>6Dy3#j1}@%=@pt8`9IQG5=aP2gpAjSc*x~?_rI3TPHP8U+;d^ zRZX&H`2}$!Hf6$>zx&ErWG0v8<-yw)%oez*8J8Pix+p>Mn|vOjpiYcWM3#;yN3r}3 z5+v+4)@4hxPBr?G2`pX*2|kP@5@8z%(8RNeq0l30yTST|MbOX>W^cX*WL>$_u)z}_ z@2`xBcQ_*;PsqX8F^t*sgKXWAHf5tpU5M&4uHP9zu&j7)s)bA~z zE5m?aENEh26>9I-;Xi_Kv^?u?3SiK#eO4eE9tq;gbA-)qL^0u z59q~*Ksu1sqadI+V4;Up09aK2iVhb)NKab&xFh4-V@t+>A^93oa7EEkr(lH3kBNLS z^0{*!-k#L0nt5#L<`=S#0=THHT|KC_?}f_m(3FFxP#aJBVf2oea2=i#2pKY|2l~V{ z>eo@q%&&(!o8QzP>houGNN>Dt3K({W{zKz)uuIqyRE|i=gqBc^EVBWmJPDcX8&W7* zEPsEVMLPKH@eO2S4{kE9mEnm~dji*PCJGB`Abp4gaH~&s? zTR3P|0^M$HZ+kcWM%a$Y|E!R4s`$>nzLV;}|DdbAdlOYn71TrGKlTg+)=B<;G0E|v zo;9xDJGXpB>Kmb*r3NEJ2^)%_s5!J59Qe!jKYV0I^G7Agoo_o$rQ5KKv=dV9%UWWW z{5zw4yvf1+Sr!HZ@_Ta#de|tBGSP%SzaVs|F>*jUTnJ2qd!|s^P}mt+ee)S4+z3&=t39Id-W>EphK` z`L)H1uA40$m=F94^RTl4ZYoE6QtEV!-9q6bOCNHJssjrNLp@f_-a|zIy%u5|h7;Vx|Q>+YHu$VV~lr!wVIJ2sIp68GVGtkgWq> zHsFeeDPV3cs~fw_1m8Y@hmN(}|MgIz?d*NEUAp}1RLJVA_VGeB)!s2BE;ZW=;bAvFP9@*N z3sE@1m6QJ zz6u*_(Z$L$VHJAq8D-(BKL9G7dE2;omdtmj{TvYfI-h{HpY*#5SMvKncEeML?5Ao8 z?bRPillSszIMrX@+-5J?!tMk|a3SBlI>Ce#*@($x8C`x%Sidm2by#ld&X7EeaJo6L zdIDb)0eB@Txt zc5b@D7cij6LaM7jzKbnt$VLr#T|I9Z;4NE}zKaVNB+#7Llk8ALV(@WMi6toh6|JE| z;)kAxaNdu;{%FSW#DH@R+~r|VjfAU z&i470Lu(Fau%`>bQrAM%r16g}pH#uwSFQ@z;XgZ1q5fAPV=Zicf%6Is7^V#oys)R( z(B8-gj(#|R0Jk>i6elXq`kL&+aZ$2?-nPaO5#MhmqnDr2_fozMw+9&|s;U{DJ5~Qv z5dV_VW^=sVo@mY>gAsZyv-UqtPyBR4^L@S+t-ym%m@|BLWhvT7knd6*o{VwJW#>G)!N8$!EbBBNN zx`vHu$P>EdziEa&D?R3!ib-oZSW0PD=&EKzH#8`}7M(Q&Ws2MtzzLu*)i|U3|NRx1DD6h3dku<0q z^H$1Qzmjcva|vbPX<_s%E4?XcgZ(Z6ZuR!R+X=*PW(`Avqkq&MP+|P6MQT-b6-qhs zRrz!w*x*fksyUBKTvDTm5W2sXLQqyUNVs)-e^;U%B?mnHZ8-WP<#F%|JO&)e?fGlU zT6Khv-c)WQ)ScqhGL|^O^TvD|%)a^e3ZKc=X5V;8v=+Y>=x|5Q~y^&ED&WELD zDMri5{siNYgEfOr^k~<}R0525m*Qw{Z=O<$Fv0+23jFOI(lKq=fU^nS*?R8j)_v|d z#JqbCKAh|E5!`Wm)+8P#i!~PJL8r>3mul&mp8^bf8@GQE_D|l)|RL65Q?F(@x41G2HcZD|c~(r@-^F6qDzF$WdqNcgQylZ~d-c5K%^)cwcFYYUBHq#}Vl)Uf zUtN@2Lp?*GnR@>(*4{I&sc&5uRS^|YkS3i-N2*8{NTh=Zh)5L-9qGLZBo=xLMXErQ zBE9z_kuDvi7X|4ZLk$T@&g8$=+WXw!J^OsQcYg4LNHQH`&N0SQ-sgqC_ozlQ=3VS0 zT15c@x@T`ZdKaEI4&TiE!9_|dt`#w5Dk(H%F}4%=>kGfnAl-UJuTPj$l;@)i;e2a^ z=Ob!rYNsL0RW-}!2|2JQPfYPE)`rhL`sSp}z(+sY@Ia+TIZ&x__dNnRIsQP3SMy<& zV3LeFkO|Ougn8yoy4!W{f?lv;%65EY(yPS;P!c&`9KI0mPF#=UVk}I!-QUMKTmL?e zZ}o&EsUB{_kK^Qn+Fu89?~^`$Iz|@2Np=l?Li}`!3_K7|CyvLwSv3;)SpefRJI6He zjyas}?|s)3p>v(dWV$$v>BRu69po2SpBQA`jq2VCt4F;%=NSNH0|yVen`p+Qb4T5=|F=FL zXTzwG@a*Fl$gs4CUkw4uw+f2|+96t2$EW}P7{3q0wMvOdmvlo6G+V<8X`kwpQ) zzx1@U8(k`3)bRG$6_wVv20JO=RA8v=yZv22t;Px^ZQt)pRV4{_dhBW>FW$f8tW6-M zz=ZSqAj=mV1O=;pjN6BVvP>9JeFpty>*j0}kTt-W(b@FXfUo$xz5x8T%yHw7Y`FPC zWKSlcmg?m;yA1^t#ZRDNb^MHfhBeekR>vm!P|ZL>A2<=mP-1havXHIjNW5Bw`@~WX z^`60e`e^Ji5DcL9iX)Tw@NKYJxuJV=TI}5_V^*&tU$@5HgvB8q;vLh(zy6UWYk_PvSN!^V7d6Ow_U{9Nbke>Nqk&1Wg;_LOgj!TlsaYYbpw! zpG&KQ&aa4p8WUCy&R%G&^{Lq&v@d#P6Gp`21HUdq8jka^G)*(uYXPGYFZ6E{iW4D^ zX%m`$cOUK#SShGOBKoXoeFJy~OOy^mIc<-n#g>boj0cxmP7*5L@ew!6qWsP$dhF>9 z#m*}C)}c|=5sxZZ$Csl20A(L93D@>0gR3ctv`3B zbr4=a9db*_r7Pg_hSBgd-3$(u17kE)sv=XT{0r;ZYRJp89>m#I{)JFZeuVLRfdOyu z-i6MOQ%*e9&Jq}ZJ1m6z)KP`(l2IN2auEzPhPd9$+)T1LHOU<+TVaX;rC~E&K6_6F zCWF9uIub%he;RTko%zuO!s9)4uU!|4-9Z-2dTfu38$Jy<&}}px*n-ZT6uVpg zjeIE{;ZMw51?*EJ@MOH;5UV8t;6;|^mjxR+?oiy%G6-UJ5A2mZP#mmz!#0=9lCQg9 z(21;7E$AQj3FL2}y$!uLKP>*AkE{l`6;xBqDug`h`9IkQ{}ha9sxHKeyZg&DxKoJ{ zaQB<#9!dX$`ZeBcD!iIw4&00e>KC$_c@cIzf!{44fSkQA`f;G`+lCvPHL)ha_n(4_ z&pyWwBh_I*m_jR~_0hI=Gml0bPRtRE1-XhWAatajvGulI$m~L#56k|XIzRuXs>PLD z;O@8n_pXR%xlw(jO(Aa>g zbKfU*0zbQR5^37@Zje^IC78B{=b-oiv%?g-UvXmi>B0F7?yoj1^~|`7ZfjcaI(pzL zy&foC(}kP{ZQ(fJJuLSmN{Ve|6)Csz_Txwd*)YW)To0R_O)QfP_`;=etO{-@pYM-R z3Zjn{qe8}?^S&{zj!%(MV_8rhq7<$qeBHSY)Vh=dwJs!Y4w}cM1FuU}x?u$Zt9UnD zznpV$O!xxt!T6t&45FA}$QJY?$SMDb+>r)&hQEnN3JFk-?rsU!6r>DO?tl9ph1~1T zAzxDCLS9%57PJToNl_wRRq(EVawWi}`gN#N*DU=lW?7|IEe&L3gAmyS1SuFot72on^tlpErC?2VwBmtg{Q?dCa zoCqUp_Q8%CIj1*2H5` zHv01cSz=Sn%Wm+{`^2CI-xsp;)QiLiFMyeE znb$QhKJ(3$=0=;9Z!Iks+Ie$&Xg*|zPcniJ71IqTT&INQRQPm58h6+JM1R6uzMg)> zJ!qe6Y7Si|+U*Z??SU>Mgw^=kpWfUmW~$Bb?)Eqy7pB-O5MK$5$8>)gPXE!QoG1HB!^Ita+@daY1Zs zJbGsOsAAZ!iC_9-=~R@bA0|Y^+y~tD`dEg=4(m9e5^s|wZ?AGZnaaJ*b|x;Xv$wJt z|AA4?@4*K#q(usA+|tHJnfS|-PFZli#DTC^=B3V;XvAc(t2ES{Xshs?kgl%yrI9G% zz%Dhnw3l}be>Id0Vkqq3!}le3MMq166q9oK6Gy% z?Z!V;Py6b^;pdJK3vLJO77zL|%rIA%iM8)O9?d;~iO1srm26Wh$lf;g8BraNNb+Gs zxU03BWWgUKHWRV@kh%@}2Pd`B!vOl31O z?}CyPTah@XW?|;xRJQxMM+_a9ejic0y;B02dG4~FH6)&>d=e!M_V%)*45BtdR*0`B zZ(AF*G=ALe8D8S+v*=II;cIM=8Wg(ZqFq9~wp#UDyc&bp_e^V-+SY#7de8@ZJ7p_k z>o~-i5j(bnd&5Y2|ChaGp;&2=n)KOV;n6qlG;gur>;d~^k!He?vBb{4Gf$a~k!QkH zAovR632$gHd889k{Qxj0+aK`y5iZOLdNVl^PMI1Vnu*&X1m&i@9)WRyr;- zN?-}|7rlLo^k|v5RMznQ(sNGX&8hb^{jl7}RK4`1ct=^V!Xj!BZ>Svk*_4);eGVA> zp5rbz#G-qfp_RB?*7{{b*eg6)KD97!SBV0Q%492S8=49dFDvw3t8m+U2>T(_o`s51 z5g~+q^Qr05F*>{C3!aP3`15p#LVJ#U+Na^In2fBnql<=OU@lf|1McYQ($qc}Njk&A z$2aE6*fVT)mo@9z$(SWvA@G-1Qp)gpxus4kNlzL{NsudJqsi*n9cbSSC{@aeytGHY zLu}ck+P_=&+|OXt04fbu2|wqpfQm2asquD)<8d@tv7?)}$ZFK>)li0zrM&|YZmu4k z=_mPzdoA99IojF2p5%v{gEm`I)|q_$OF**BvCa73R<99~@S%iG3y_8T|I|rAwjWuAZ{D!f^ht`oZsdxcLx9 zLCjiO+LD>aACWb3Dq-%aWqhY_BTH^rpigYGP))Q{MJXS~F+CJxVDzh}($F!i&Lr0L z9iCOq(6dB?5|*;V{muDG#1V%?VL03U9;2Y~%evu|wSU#_?hkSuBIv8^gJiK1kfEPu zAuxZA7=(I61JUFJ$w#nJfJuY+d}8SX`gH;#dty00;dQvhqZcY(7lO**%4Z6kt(G2< zEvus0A7>0T&u^@dfG7|*8=j3<4ZFOU31$KO+={U|X*0cR*^luQx;uEK<5@Brh){4$ zxpexc%s{;^Lf7xT+1W{2>tj*j_OPc14I z1SRXy*|nS)&!6`A>fx5;3M7JB{qp5cd{b{BZ>EbH)3frvLEce zQg02ltHv5^s(0o5NWD!hO4rG8_Kka`fu>PL2Nh+*m(@PRI*{SOXKZsFQl1exH1uqQaCsX@4ts*m$+nGz!G=w^qd^CmrBG+S zEpg(G?)fLuvoF*NN9A`V3d(KHRi8uqT~huWC`sIS^Gi5-Ve3>c;`IhpTkCxN-mn#L z)9-fk%G;TjU*3Vj=)ML8PWH9*T>K=*Tk$QP#^l-$-lB4D@NMzdH{$ii^_4Mm3_-`L zRg$!eW6yzCp*V5DVG%VOtHYZ4=rQFSHh5cFpq`;oEQg*|F~-RF-?doq{zbAryu z2DE<9mKMl|ik5`+`9jzATl#nzBcuwa$%mi4KDB)6(sNrWY^2X559AA$-J$nzM2Ih0 z-d9vUXhu{o^>h5>y|s=#p*NRcsF2uHF1PRIw9b*$kkejA7&AqosH8gT2O7=A7|?dx5YDsnrwaM+w#s&0Xf>k1R;+b$=PEI0}Gk zvE^UGmw>~PGS)Hg>#;=4f=LNw@E~P8wf#lBR474t1y$~2wBc*0Gs~6!K*FIXhOs{J z?q7b#7u|MR?yPnbk~H{-0b`;w(f2EFPf_lwd6t$xbf_r*f}V(GP3!C46ibr{;w<{(Z7MDZtKipcTv4O`NobgVy8q zwq1+3uhgvM_2?vwF5h%z@Q03lj&C!kf`v_=Y^z_L=bf?tUU>C3`MSDpiikBZVf-Nh zQx>inLwz7PH!>-M$zOK+BpJNxrF8I8?G&4FZLBF&YL49dP?#oXL=OtcfHq$5Yrym8_$* zGMZU*bQHBl@bxfnI}Ch;g=P8e!kGMHtDPrqda(RD?~0EdR^LS=e%QA`qc^Un9&Np* z{?#+xQi{mr)X#-4_>6{t}y8ild< zAiu+E*?@^$N2a%qP#ft8<6qvyIK8D!<0`+bBHAe+nPVx+OqbYZeZu%Oa?nz;kEhzH z#%R#slm0{Fk~JVCGDia3mXZ3=T3cJAl1s|PNz)PNz61m}C5TphJR4xS4`B8;X%%MD>`yNI#v&%ao zRt?*{kR3SUeRq6EU-t&;s9Y$ONgH&97?mCyf^m0W$w7%ykV4IG9@16(nQ?bgQs>uUylklKGNp;BN%+S3 zy@RM^tM)F0I#>vq^94eMf&4@>4#6ZC>GfNq9DBZX2;25oIr-4@{5&4UYfPWo*1qz+ zMUT|?rnHR;@3xaTK-Hmr_e3QSI++W!$JUeOI#;~Cytaa$@s6qUHr`He7?KlPzyFg$ zWC@NcU)!#F1YCdISk|LHd~1Yn!R?Xe>pxEWQ_-`+cyBe<%xjTgvhmT;(L#}FU-UqM z1qRu@VQ35dj;^wIT=m**LgmTePZYjfc57op{Hdk=zFOv?im4spY!_FyMz%{cUDEL3* z!(@w~rZ`*Axawn?wE;qOkj>n>hI`GvShPh@`Pxzq7vFS86JlX8b0W-rmLnSJcH&!* zzEs>z5ORbhfO77}f-cdZn)h6?ZgQi35IEW=QW6^++C8lw*&SjWA?Q?e(dJL+P!`GAV>~dMptVT zcI>C>S$cUJCvwfsu0l4RIyCs?JkOI2r1K3K&&jrOb{w+_X{FSPN!s3*YfQ{nqpsFye2v1{~o7$%Whr_d;=5# z&%1MAXt(3o3j#8*r~HKJvBA8 z{D;Tp)YImM*T!$1x+j0DPY=pxmA*+4_syI%OTaa|k$aKBj)Ht$csXpIW9O{d=x7N( z?RZ_wvDLH(v+}EaI_PKY99jTUP6*Z`OG&gWGeIpK`kSGs#;|JBt$8w1W~-}*XT{Tr z``_KyE;%l|R4r>}I;jLL*3LxDqT=kyaBdB|S8G zZQdhuAW|x&3Xd^nQIT;nJ|N?!KRrqLq_-KM`Ec8|Md{=>4Q;b2Eh{l1>2Td+L|31{ z)Tv{Ha~y$i5JQupxap}l$kk=e5_||YVq3rtZvH!3sD|zI)^N1r;2I;)CC^ypWzZKQ zXRVG|PuMkFnDfG5#PPysQv-fPo=lLi9>(?;*}Tb-04Fdvp@hA_I#!vEv<%jaI{J!T zx65`OK5moq3BefkW5m0|{Mgtbf2GpvBroBtHLZVy)<%qV&Q#vzZ`{!Klv=uiJiP_OW%uvHOFpey0u=vQAupAo2O zOOGArh#Uax^k!MQO$eBDp7U$;o;(JJTa*$6> zAI}QkMtM$74vpqU;&*JQXx3e{Y8^dp%8zmBrTKA2r|#;hsUxvTNwF+S?4{D=!oR_4 z2&_9exzmv~FWKPMrxB1p+Kb1Im1AKqWW~`>ve-3=L|-m4dgdP0xkf;^M_2Ft^4bJ^ z3|gq-jn2}GOH));hhc7ADh4J2u!e+hnlfncdi5l`1~miqYj3S< zh}+ECp9V#$hK*URCax+FVIhh=DJJb`y=Ehc)rL7>>JE|0rH#xudvpiv0|i@%AEIoNLHFv$aqZ>5+NzlY{~&my_mer{qyfF=!HG z;NCJR@|olr%gWjFhLdcb)Zx>J687!=M?*!&{ga&LS1xWL0uxELOrPprtQ(Gs_C7*EdX zz{Xd|eln&1d>7sS2DJI1$-}41WU`Ded;7Cj;5Ph=I_c7*gAu5j``Bu!x+DqErCO}& zdGLCmoZ#qBcmu|R)o%4Jr?2f%_A;q0SFhreu;&kH=dzHdQLT z42mcIIy*Oa?c0^|;_9{jKHtE(*>UY>_EvF;C^Lv^7IaC<-?2U$XwO%{#=j7hsdjtq zE&EC_C04I~U5AyGHS^NNQTuj}D0p~(2x=FTmsS}LtrJ{3JHw5NUytVE{; z%l{9Mow<#QTlG0QUqn`Pt2z@Kk@xl*?=Ekg$}$@?Lq7O#i|PoUBq>^26v?VDi{TOvw%2o z_A~QjZtFJH6H`domfgA3Ur~T8Z_e6)=Kp*A9o~TWE3!5%s$<}L8PWT_85s$d8ZPtG$>Y+i zyB3C&gYxMe|3bVZ_x7F>WipVHe{z9PP^5n=E3I4f2>AeH)y(t);Tpaz%TCa0BgarQqyyQB}mWC~&U zqWf$=$*P{NJ~2K2agepKqCV~T6J&oRx3$IrDwd3ZEy{MkTpR2ZSIi{@pzM$RKH6}7 z6!{d~I8gqaOE#1Gc_B=H>f@7y9jN1d(iBJqOKnX|(M^LY*E9+a{5e*=3JTj~0X8=1 zhZv=L=$PaOZyH7T?E?Tm?>u@Mq>&td<$M)V=W$DU1+Jl(yz<0GUBQX58cn4Q-`&-` zK(^4l$~-O9-viZb6ab7zAr0`0)Bii~Vgt(u3>cSfUvcMI+QhbSAY~HQ)7s{?=d%q) zB3cr8H$Cj>1HqtcAL4E8g&2+r$&@T1q-SMfq@;UdXJ>oa?TY2qxzlE*rX_Dowd=?J zyl4^5H$*qsg!S)AV&tlN*5l1wTqAb=a`c05#(;kqUIGznuRhr%+93N2e3(X&S0|NT zsI<|0+>VA%Rc@t(@Kfrl-R4!=rEbQmeZe>Q%**aj*9pGt*lSmAI%$px4sv}B&(r__ zFo;f(P_bR0m|R>Ci5Sr*5lQ{v)JNl_n9E3~V!q%hb-CyuGnAnJ&RIE;LMt)hb5Quv zA;@ztSMYPII-LE_Y`OiXw)7icP}k0iWjAH>Qyv@_zbd&dE6G7D=8xQxU2nekzVmfp z@R&{juFW%C65rm>96>MvtEs^)2ou0UEJL}G_?R`*sNFqUgyQ7SJ2*bY2TkG8N{nVK z-;Lbc_PYS8|6C~hBMtMQ_SQt+9&iNHaVB<)3`L69=T)0*86sMv-f`)-4CQ*VVT3wU zV*hnfVD~;BM>Q-Q4rJJ2f@aH(W#NrU%UN`_U0-%vF5eyK6F!nS0uUmMj9l~yN z>O+?&_y7)@g)Tq>S9i}$dldAe(T6%|`*lv)a!%QQ|L!;mur5A&B&rsyle@K}5e&Dw z4*ik2r@Z>;?KR@WF-<>~38~Amh6i?Y;Nnz8UftRdm)^og6lzOnC2BFMpu- z^WTIKDH6MROug5Q9=`EqpIBSmnAAy=54ex(t3!S)scC`nxDlP3^uC?8IMIA2y)By5y!0d6;+fv|uL^~3N&!E~% zMPxud%^80p6!(sUx^bs<-S0bA5;2I0RaAMlP=09_cZ+j*(y@WBmMUYWzX|bb{U1#F zNbGp^OW49mI*f4a-n2~8)6e;z|^ zi4oxSlyWNFM4oV#gC9i>pvR18q{1UOXDx&vj}>EGHHnhfjsK2ItHvOETea&)`>vUP zUH#lUKL?}SmlI7M5Y?&t>mW_;APe=}hof2IWarLL zHF(gcz7IFwNe1G6`e$6~ZXpm_T?JA^qIQDYp7y=oPSJ_X(OXl#W-=9bY|fKL3D&7| zzIUNb<3!BFr2JNBVLsOae%@p6sb3x%Y7E2-NUO#&3?FVYjlly!=}aWskglObS$~HW z^J|oB1B(OqcdAGxC!+%!Ab}E@CSsLYo)yz_L!`pndh`Tt)3LPynJJ7I(;26h9=J!d=i6P7efMry2hI%f1JeB#GO=(ZKbmQRa{Y6|(2i*6Qw0OpF@dA_09HuPqy`d?bd~1~vcD8})$B33Q;5N+! z1JO1o)0Z{*rHHz=XP=N&^7S{=(7LV0Ex`#<0f`RxOC1-6GiIWu-{juO&v_dJg?Dd$ z+!Mbq(4(AKyuX@8=4_OB%)_jm)k9_;Gy(|^%o1=psCTv3F4trgd|45SC#7H^#Tm)N zWy*xV+1p;$a$GZ2Gj1`L2+)>slRY@|Kc?2^G1ZQ2bih{)U*0YJ{KGcA#z7}cQs}ki zv4_Ky$?s1xpYSKoSPc|jBX8Vr1kpFnT(2%ggVsBpI^HYf3S8(yn?S`4bZM;|%b#x70UQ9JFD_Xuz6%>#AFQO3br40N zgSN<6bD6%9f7nWWp=I`bBo1Y;XWhNOyCH?MQcZ&9sjJ5#EBY=0n(nW@0;-_R$=3TC zcS#bs*kybSu0AonzSp|R2l1ct#M@{%4H4*|r2?#vOSVBzz$9;zzVh%g3nYQsEt;}{ z=F7kVJ=w2c?=dallP9)C4MwVYX`b)RRF5HM9CH}KNY<$etxw6gN?Pt=(Jfph< z{a_RB8Zwa>mecoCaKk&lJlHDVr_!Na&q;>H?``A~iC}4O>IfwOzt{ry?&P!nM`UGj z0G_e+SAU2l-_kJSoJVs+9Wb46XCy~u8T{Fq_R_OU85svA0!e@nX>pv@$#}fG!oA{I z#-h)1eF{w|IS#y}-mPr%DzR-PnyO~z{0c7PJx}d)ehmo0VI`@4m6(}vXEpLWxU8dO z5Y$dbZ*1?mr37Ai^u{cZd+>1TpfZ`)nS)4T{uw=y)A*|?#(92dqgX1T_RDw3DE)*~ zid$#qkFH+ZIyzEj8rZke?wj9kyALYOU%Igdxy*s<8V>*|9F46Yf4W{hY+77p+5!2T z-&~>BEkFNfXB!(Syq?b*BooLzV1Mh!hQ^#K&(jDXxqfHZsIGje;jfwWckc|5ItIps z(WqGZ)OarP`>bVFKQQh9zTqNq=b;Pu!#MP)g&}dyy~9k&o(@yQ%@%0}Hf=0U6*LxLW$!DgF}KjJfJbW>=2A9)r-y<@vLn3h0kgd6PTzf*ry9K)(~A zwUlG<&+EQ-?GEYK8&GDi6NFk2T|vg3{23$>46uLPm#R?o6PEiEd3KPw`aGS z5r=0fD!DogZO6MJ-yI&9JN}G##Rv$rYg4%E0eaWwN8-5>FMBS>=GxuLwV5!qS31)v zSn!W5S0~FuULz_8-^GP7qd3k~#_9j{$er{2v%|2c8Ns&r*)k=P*SZxcoJ^G`-$U=n zccPcqeze=Sc=qtA5(BtOMdI$uv}8_1EpYc-E(lANI(^9#{pOu7&nI`}Y!7x7>9KOa z{Jtj7?Ii5%DO5H>ZND`EK6HOhE+;v{27j4FrUX+f3lFjp9E?^uukxoF9-iAz(W$Lo zFQqq@w7sR%0*>XnDRcDeLV)z`8Vc3-1>LIbH#f?V5j3p|i=Z4_`o<-84W|ufj_nXM zoeF95eae+%rB~9*;c*J@=N(&Etw@e~mamHQ)A_sV2pwJhV?Pk^-DDJH_CmOV@*kN} zN84@{fl3&Dq8-zc=^a2W@tdC-voMm%X7$j%5>0BmBhuEUHZY&swXnb2R+b{EyGS$M zqqKKm=ieq9%}(>m+SGxAcE_e8TWV(I>NriHXaFN?52THmvsC&JX1iOZ!m^c6HVAL? zp}ZYUsT-*B#JMNm%zEJl+Mxp8fEGwVmHqpGrgz%`dxQ7?Czw^*{N~o6tj|Zt*VBk+ z6QOT|1vLx!)vJPEH2qdDtXa!DN__w^5Y(uG3#D8wD#|W;(zUIZ5DfHsqyC&+W|z=6 zOa8Nti&InIra;Kjl-Qtob{gG`S^UF0vw2Gh$)!mkX!h%?lunzCKl3(Jpvw!)i7;;p z88HMR<_c>{-%4_k86TWdDjd;MO@i5Di*r8|$Ylf-Z3&!syU{7)pb0iy`YQMF?Qka> zP-qO2f7M3vd7tcv1IqkjoA?2n2uCg^7vnLsvxZ#dpXD;}fL8BzFjWf&=y5ME4x3*^ zNes8Hwa#IImZy?k)(Lv*>L+o>Yd)U zTkp9AjjMvW$-n-TVUpe2d_h8|(m$KoF!VG?{u-X9*h4=hG+WJCcYoLF-ewWb&;7UJ zT|?esvcsHiG;>*ykk4&zQ?r%*txm;~POXw3RJWNDgiRvE3GgV%vC%?q0G`|?!wG-2 zrcjOC9vI(LIs!4o>hJu6aBhL!)yp`?^};_gqT)^J%gcnuxciZ{5^J!WauKwi}vH%2iajGsO!= znZ0YYb@;(Umv5m_&zalOzLnrMynh=9G2|z|6_fl^B-@iP+Du+3d0nj@*0(dGIb(R@ z*p-l!e4&a z)1rXkV?3>pmknc+ZytSAnaT=k`3_`P;oxpEB|x{dOcx95ZlUup04e>HZHVRfP&)U1 zsCAY9G1wxbJ5@vU*Q9^^QwZ~X9k zm)0lfulN{PK2(+(uR<8xAwKgK2bM>i2<7SrwJWowM`l9NsK@fbc=8p>Fu>6J-w=#0 z?fG>v=Y*I|9U{o02Qflm3U@o#m^3(I^oD#WchpJXO(`v&qz3s(Dfq#{b2{Ee%m?U6 zJ=X&EmrW~MqAy)oW)TlA>cDXNplJvRBT@B&(au7ZmDeG`Q0y+$ls?t+ zM{){b<7_9MFFfs6NNlXfv;FqB6ilnz?s;4 zPFda3nEkFv`D?Hs%&wAi*JrldF_51tf%5xgC@Odds&pQ#@&fu9h2vsI>2J>R(!m>E zYV3~D9nZyNcsW*<--G2!KeExb2HG4NQ`#n+Ego9WU3(~6og;Y`7Z*cq2YHim{j1C3 z`=dEg*k9jnyeEwoZeGz75Y8OYNFHKX1;Q;b{KiS}!^P%V26&Pe{Sk<4FVSh8&7Md|uy$6}()4?ms$Ns4Voi>l(5ICRChQD>K%>bEy*D@DDkZp}O!g!B}dUwdyo0w{taH+Lu>gA+2A8;`Xsn;rzK; z+Nvw8?_{2XrAzJ17ES#`cu%V+?}z~hTN`-QImsC!%}Tn1!-{F=d*y2wH*WJq(U;f` z-@opn28NWsYVQs1*ASgb7;1B4TgxE|FZZ-q?&SMc{_RScv6}jfycy~ARipUC>-E@s z9s`klpVHNDY1K33d9XYQavLPc)PooKa##QCIBKkZh4>kZy3z$`%ev9BneV>OWASv9 z$WRBn6WcLlVaZsF<^F$3Xp>QEci{owME+RicB9>~IzC@* zXgd0uHi_|FuijN>4*`t4&XB>n4m&=%rVrI?$(=oFMW}1U5EXOKC?@=)2_t;n(K#+^ zeurebOsj*3+v5!K+j4K&Og+vi*UWMGv5&BDK`7DTaqjYPdY@KGvoRR*iNx;7a=`EB zvB|5HLc7g~Dz7$&6FOcq{35nP_=c_^)IJ_aym_c6m z!v7q6ivNuM)425Y-f}%p=Ubw;7ZU?^`|~lGmE6A!ytn+Oj8rDDOO^i{Ry2%{1KO%2 zUAA5lX-d-N#QrP|()*8oS8{{4OTi_gUXDzF?RumW80Gsjkb8yJzn|Bj=sACkIt0hQ zW;1AIPTX!>{;eRc^DWMA%Ayq}8#Ps>vq&|&E_Y|B^%`@bE$_=nxz(nCNJ_n>UH2?3 zVgzimMZVOZSs&{Wme6j{6~*o|fsvU&gY){kyoP zeqZR%v!wH7ao=JFki{zfO8M)RdXqsURTfC)Wa^35FuZCJtDs3BPg%I<706JOZy8g# z4d|uX@=Cz6#@oWp@*f55k8t3>v^#}Gc`?A}s}1;kg8`qfYN=Pt|AaRuW5HB+ynYM( zq@?R<^KOAS%7ZQ?h{h*RSwE1my6P;6`VO|hKjvDgF!aejU|RHy+pZktY5NgtDRQYh zc#C3j=s+Trie0zH{66<`|U!ozASsX^oo8Mw!(sg}Ws+I1- z@Ov{JB}H``-(MJlp^l-uT}%VuhF?xNY09lK2611S1`hV**)!)`7mCUAL^Mw$5S+ zw@YPcKo#XMp1OmHRpCcuoDHpbQls0~oU|T|3M{+KUVHVn;c&(R756fr=AQ6KN7-^< zW!I0m=vQ7X-=n#V)i>Q(mAVl*K`i$e!^JMFyKa+zx>Dz3nfI8U2xx8Jwz?D#b7%G6 zaLs8rJ1`KhQ-2%m^nepLw4^IBE~50`mRuipVSdD8l>Xe)qy8PO9&0f`t~7-kLY^1n z_+7MC#~hHeMU-zpwbZ`U4X}KMbFplPfbdAhPHXqyI~GWW=jaXKDe3GP`O@ za0iiAR-VqNhfv}%W@(6Mu&cJGV}8?ICduQRn)DpT!p_n-Q)c2iwpr-h8}x4^eM zTep9l4$bNyMBCu_W1H{HK|i9hlNQ=HfWCt97Y{gs7NGE^C`W(5*E`i9C6E$;1-SP7 zk_0Ofki%QOn7E3zh#J)8Q_KfQ9o-sKJiXP%>EkUrHjflYKlyKqTWNnemY>snF$Wy9 z-+I4(=h~KUODPXhNeRmr-M=hw4L9^Nvu2*fSUSdcj{&gqB65#OA99D)SHD3wuSj1y zzH_(+>krly`8#ASwx@?PLY?cyn!=P=H(#1v#k!}4Y&Si?#70vZAd4Z3jhZZr@3+3&g3 zxWM@1wIPjU=6&jZ$)BpzQ!}>eC*ViD!2?2ZS5mWp5@$1rat)@d3YV|)o zZUapg+7I*$(HkX|;!<}#%$GT;?w-HbOT??3X+C4y#KeljA92bO>ywF^#N;br=6fnUy^fD{Z=oXx3ycO-0l=6RbS=@cIyI)MSCCoA zpnAeK>FM2K8Fu!z*D*Q|czL+f67`-7_Qo*JB{1c;cpD%Hp3)ECQizy`T!hlmh=P`gHpG{I5g+1J|r%LU0jZf%*@Rne~I%_ko6= z!f`a)yzFPUJzW|LU}p*!)!G!neJ8iggxQ&k_LT1$8GZ`FN2n_*smP@Yjw|7N|ua-xg%rJ$=`(cE8BubvUI(VB{)L)=IiUsV_4HZpXYpBjSIe zzwjkx@YbOC;2}V-XrTAhVa^Z2mCGEmME(1aQ>=m`f&5?w8$gh_P;4<8K94?hspXjUT2L;DZ~TGwdq-=}|OS?{?@XPC`@6VNTc z78XVm7U%xI>z2MxlYSEW!6~}C{eM&8)JBxNleMv56I+Y23)<)-gG)grug==^wK43d zVy#Ym#BtPTVCbJqpcV!~UEOv~Kd;dSPUjG}+Mf=!M~hw>Ag$fS}kbQiTXbvzLMR|F^-OcTc~u zYp8{0kJhOSq(Y#IXm03lW6DOjb2pVQwvLKb(Ktws+r^Re-ec=^h(+V%IXxIfI;;ge z;kPi*b*T?r8h$Nout8!{O^vt<=!l-0hPv?l*3-O#g77?~;F7hAFi$m5);=^w62Ech z5D-2As{~6AX2~4HhM9uf)9>F~#|;A}+%mpzWf$00FDm@N(0N@-9!{tm1uzU%dCv#H zAH5BvTo6c}$+3ALSifv>JrD-JYpp+7N0onzLd~LWnMjrjB32M+I}eV;$s11OrKR0 zP!yZY$uyG%EqdP z_mlH2ah5I1l5i~Ts>sXmgV$6=@Y3bhukH)0U*LEwFm_>ctb`y7U4Oxx3#wz< zSCrfH!E-=j)CPIL;NRu%hSTByrL?lnQzgZ%7Ll(rn-jfl7j95>*_CvbYm;PCcqqp7 z*qN=1!~h@e**dZdKt5op37+%pg1&+P8o4CjIeC6ix^I)?>&{3*p0D!ui_p-g!6&8F zvJ=@Dpj0Bp-4d_S;mX#ADRCsK%)^5QA-aluC>UYP-mky`aAh#!H9i9lHP`4j2b~JM zSDT1iQr^3$g*U|b=L@S-qlGdy5Z9~Y{R^ZefPcEg70_lk65A?X{T|9naK{{tE;AnFQ*Z%=7v8H5>0f=&#R!C&fP zbX9Ob1AcTW;PGTNacOq!^mpa0mL}HTj6W$tntr=6!)IMzur`R!*2~A-#!Jxsprvxd z-^owURqEqpcJ2~JDrGcyC`rTWs)1J4g0q3QQj#%0osj8NKf$ecqkp`iRhzUDl-nzO z(ev?9sy*OAMji?0V!Rx*-&l~?&BMI3^|gkz?H`~3tRZ!E~2(axNKD~Yez`mQ6c zVuYrBzudv<+<}wM>8(v^SHM`L2g!LifJL#7&WSXVxpxZ#O*uMI*lqu{kR>vHqMTl}c z-`E&uYU8LNsO1qJz5dn?XqUvWUa5X3zhn1q>swYkfOa{aEoE;YbUawYawKi_=zL&~ zC>Ba}3hr%heIV$~|RxtWI9%KzP zWS6Hu&QB^epe<93-gX5n2vojqJ%973S8w>_zX1N}aAqdruube#RBrk5*HX=|L=0G5 z;);=dz?5~U`0V#6%2+PX_NR6EzqIEt4)fl%wO^sLlr0D9Je+KPu@ZF(PnkxuZXO07 zLdADT)Pdx3RANte{pu%rC|c(d3AVM=wAJ3ahjOhl+6Q))D=pj24TNQjn069J)INh8bz;4(aZYP8p@UJEgmGin+(@`tSYh&$FNB-TjUiGjMX8NBq|B zyN4i0|juo)~&OM!TwesIJ~I-|HF|37~4O`FksxGk$FCLj(ZB zi>Y(Km|M~MYJDe_j-0JW9eQlEhxk~Zo#x36=i(=a5hp)tS&7!^1{=ulN zZ$?m|Tq`iH$J8(O^*%MjqDck~fdf%Xuhajv9m2SdW&W`pFy(GqzEy|>HKk*02k$pU zT)WE86yJ)Cbb>CoUBE+ZJnuLDTSKUlh_=dQlF>GjNLZ`CTKV?XOr^MB<6jB7n;UdMVMAK8=-#6M3$ z$@{&IW4_frehz7EbKAkPq%yy8cnJhP4$?a}3hy_IO%#cbzd( zXJMg356P<`0+&_IU=}`^7)Tvl?s-;hmtzx>y)NsQq%M-Y{}z)EAX5r>Tu$doj=KBc z+d-jXt4N$h*2Ef=ynPe*t205#Upj}CJph=B2=Ka|x!(^&}~# z!Kj=tBFu@#WTnoFpy|l_(F%rd4|6g6_Wf41I$)ywFW>G_`54=|*c)3LocFQiqScIR z&wfK88&fD=#!W?JAeCC~`Q?N9Q)aT0_B1s}Tg=CU#qp|nHOXb2-DpNXP`z>;ysF}i z<6XjPAbj4+!lS07$;B)5h80cMaYjRH43Y_Ox-L7oop{G^H@i=#29hO#8eg~uTAcwI zt}*05^TqZ-HYUSDa*bo{n^>%3+%OWT*3|o+l~$(5E~fZ-emhB2#zKEGkwkwIUt)l^ z<~>DQUZ%_Ux|byJnPSrI%lQ4Xr-v7fnTziYy1?&eF8BYTRFG85@%%a@F*5c1_z}*eC_5o!u-UQu$ZXTI|w111<{d) zcVfJV&VRiK&Rp#tmIds}J?EX;PVlS7Ybz=J>=1)qm`QkS4!yUlS{SxY!$kgM76p6^ z<@W6_LYF1=F@9x9BdHWA=Ctvn)hf^W=dxFJ&VSOJ??9f8qKs)gj161xR(Py#hPLs) zpuY7VP`~$Ipgw7p7t;)=Euo2Y$*b&k^bpu|xAsc^dDEX=Y8c!YWlY+e@s%xkx^;ao zYdqc~lu0RaVVp0I4i{hzImfyr-ZWaIQLRjvJve2BsA3QHp8>>=^_~%}+3CO}V3IzTd zSJUzuw)9U9^H(a-*ne&ohh9eb)s-KY<>nx@7tfw?z}`1-VY>FB^m}18Awl3y?+L;2 zz!Ehd2Wqew$G|zJg;e;{?qscZFcs;#^|C^gTzJeGRSrbjs#*oJm&5_PU;`(jqV;bd z7?2cWE&u_)^cmbi#ZQKfb_2t!#(d(6-_vB>CSN=%EQn;1-zv?rV7#*vjo_+| z%Z=|KGuO{SV-E5+%8}Q&l$h7&=c_8xYDsgw>85pe%LXgooa$TDY1}CXfL~8n5vb7G zYNumVK{v>Y+h|rY7L7^gUY|C11D)co^wq5oVLHQ&k~#lS^cE0hu0sc2hsId-(~(Gl zpUsmqBX%sSH!~l9S-*O0wJ9=k1LWNKk*8;k@IT{_ehSp>wPZo#wnl#f1x3(Fq3bgs z(mO@+<0e^7FdYWSk7ex#NAwXuOa^M9UC8BEF}f#zm|tVEr`iASV14uBvE%nD)PSD< zWKX|~i(x2P!YwU*7%GFSKq$;)RNbJV3$1&osmZpVHQ5lxpn#FaW;&%)D_+bNS2xL; zjG$##Xgou+_-Nl7q4UGZWbPfuTH%-J{fP~ltga8%gId`t840jZ{1eQyglm~|5mv#id?u1iWCogmWr zKx;Y$?T@bx8n{v}r!4TwG|2k3bCLm-{)=)9?{F}3id>MLf)3NsO%{pkhH;^#;n+!! z!=XPm^w{-NFb?kMfN16cbbqJ!MXz?sE%6?$E|g`HPWq0x*D`WL+Z0U50To1tpZj!e zV6H*Fo2k$Z&1ETH{6QN%JNSS|Qu=JZ_FkV$_kl>*Iz&Y@M~!|ZosTMhzGHg1m41-- zQGnm7fXYTD5ft@H?Q_hDsJiMO$@r`jPFD6yQN^(3?(Xi=-YqvV8s+W-7jM#NJ&&d( zhk#Lf9}w;Q)^$=JAy>^|-q>yc2>Wy`E0R@1{2KvCr*)xI8e>4vsVS-utP$aPITt0( z%r1CrnQA^Sh?;aB+UKhI_~V>)wcFiDsi)iS&hAMo{6G4*e_M9{K?_mw^93Q>> z&){orrEf9Ve4+GL*{|=b{N3)y`|vxfFy z9#H|2=9L?wiiW@iB*5-=;XjIi=1Y?XKp(7#LG-zDa(%QCA{`q28tpZxn|>{U1E<2e zkDbTXm~5XDLGcjp;qO3^P)wO=p7nrc{s?YoiyIZC@9y$Tob)(^5gf2l@{Lf5`aq)V ze4xZHa-4@)e%T#rJRyE2Pg$NmeCB{}xeomk`LWg&oxB<59%CZfwfKHjtAQlvr7#bT z1(MJAsrD|mKVGm^7B<$Z#t={TXBz%|?uJd&{K;euzZM=F5zPD}_dbw1@Ua^5Qi~fpQ|g@F3_@{hzA$kKqPonvr#oxL7*htw!*CGT zZyZ*+yvcDYeU`wIIpHa|1aBBLST!lzh3m_=k_CPjL!8}M9Z@o%M7+Yz2s**`P3<4r&ce(8D8%MLJ>-^(tR6r6<01+sx}-{1PZeX1Xb zRFe9tJ>{NgO_|wW39b5r)5CUAb62v-~Sp5pjN z9+>rvG20N>kds;d$TX<*MB^ao*WbT;02{`HhfX-rE(u&}qY0 z&Il8W5uILZMF;K=-urH#ILoZvcV+vhqp@GeeA~Ysp@q*cg!WgGi)gLnYUfzw#d?zH z+Rg5Q)nyD>ICH9e=<nipHF9E)=MAzBAHJ=b^b`=4FnuFs< z7B16nNw!0)su|`DcZ(NNAbiHfy{)Q7+!u6agMeB^qJk@QB=NXh^+K{ z{5)##k&Rn(hF2bG`&g6s#^B;$O3o>M2&RfEWdG%L53{pekzR@Rn|R+<<#n`HW}l9f zz*E!`9&&?-2=%jFdSNc^25`{Z!`QpK$stMF7O`N7OkKwAJvFC$ueg#WnL1RftSdC` z>b*fiav&+&7_3a_i{N~wmEO5M3U;}ZDnz=#2j}Hh9^4&d`NQdLp>L6jZ>CfrXC+~| zN4vNLKZgEX=^*+U;?jbBhj36J!?c=kf@GyT>c_B3x<`}BCu3AbNm;v@~R zxb%o|$4%+=tLW4HuS^t2IQo2d^2BL({nd&WT#eTEQjPXVD6x8U7Fz~!xsvMv`@x0& zz~4N}swB7``re;ICC76aWtDqEF;GlJ#A7;=nSMXp4m3DTM2W!m1!49;Dcm>XE!B+KVx{Y(=@A z`z`q(>PDv8YXGz!4P;ofpl929X$!pzlXhLXU#DR!6nG;$YuedcJMYm?D{g$~u@UE{ z5pJur@yNZ{!O3awl<7{${SouI=)g=ZyI!4NUh>c!M+x=(kM!`h#-|kzI&8)Z3PLr* z1><5Ye#d$EKf%{FwVqB)HP-qh$Y^9m7cLc+f3lW8%g-{nUSVOWA8~>CS6VXc8Exsh?6A##a1UfY7;GN z!-|bcxb5X~IDvbwb4mIp0DwuWx0+UTdaRJl{+AnvlALLr7dv}yym8mgGTI?dkr5~} z6uml_5ss*jCUCh@c_Vp5o(*|Wk%hNDndtSks^~EL_!NDbwdOuAX)gJg&tTx3trU8P zbAJ02=b=9dz1CyWhYzCcl+DSODy>FEBV|0<9+7?xJGCIVDSYvo&%khX;!5+Gdlv468V)8uy`wm4E%j+PQh zQE#Kk+~E;6e8I%ac8BG0FZp|dogA2~aT!y7f4F(Sd_w)b?ONlzYq205AN)t8DWeVy zB@0JOs`FCG@HOeN#JOT6hiGM!4IS*CFBAPzMe!GF@digd>V{!?ghd{1@4ZKKJANT0 z7#Jq+UwS2*BH`MP>isA(f-+>zEya#iV|4n@0vOuU=hKH>o-bv_asl3A#+O+Y*9nD=%PFa|GSku)%4Mh;aa zpA-S`KgSz&6!1eoNTE0s2SgK=^S44VpxP zWW_XSDZpu#KxkWC@AmkD1H^@~>|a*;0u3Q8bXT6B0q5pJPW)tQ_`B=Lz}_5B{jPPa z@}l{Kg%G{ey%NtepZ1~$25F72nB1R*C+g#RriwVuJ|nNR04DJP!CwqHTrFIWCtiVl z@9aGa$&Wub8+;{3-)Xj1w`%MPka%flP4(zv(=Zf$f8Oc`C#KyBFV=GcF+ThVQYc2& z)f*xT{Pvl5vd(2W!4fQLP=gV0(CJAQ$sXPATfNG=SLzUPmUw5C>??IOP-)2o`039} z$T{;*im5vxCOgH!=CRkwKxS=7;vyHz2Ij!W`5?a{^83hKkA*&UTJ=5oV5hIxcy=6_ zy_v75#MMh+?YEXk6ltd&Y!8}mlDsu=<6{^|SwB*+ z?vUDjV9gT{p>+gq4={43qdp}D2?vG z-_-WCPS_@MEf`24k-0C8lIK|X@MI6^#$|JWH!*uWHC6-^N|g=C`LtIulmEaslTJCW zZEFezn@t)3t3RP_FTz#R6=-4oxI1w}ydOx~2fQgtdi>ZePr;mKp%3l`s(H-Q-K@z< zu|8XvKL0z|m;<*?zZi%9=u# zS|g*<=Y*8n^V}^*GSJmyE&^l%wm`=ZL-COYO*Y|Wc;?cO2c`^qA9GaurI#^Drzz|2 ztqnUpIO8J6*WVX!IeCfLO}~;CAa5Apaac z8Gd6jSj~o4)*KWV^h`(6>Y?KZtrVjVuMgN@*!rTPc~5YJ9hL%%CN%p4L8uGqew^8Z z&i%Ng8cFG|h62!{oR}i4tS_Ryb*oT8Ys&u0fq7cEG^gPSKgY28GR}R23Vpq5a*xtN4p(YCNqQ0-X8VCr@<{ zTSq&cfEBHfOLmCP0hcz~>>!%pK0;{h@2R=Zy2NuyX#zn6zQJW0LjIasWjf!F5fc`- z7PD4vzD+8ja|pV|U-)M;{)H3wCiYWa{?^%0(Ey6e3#s+KE{rAQMY1BzF|U=rv1p`X z+01^rO~v5T!pY(~(L^Sts!6KLI6y_=z%a;}|sJLXs~o`feFsqR!)dVRBK_ z%VFz4&w@qqEA}*H86_A5J|5M7D0tO;yd0}{na5W;PydnD=IRCWmt@Hkfz{Q}FD2O?*|f7>Dwk?oM?f$7fH8d!ZU% z#5A9F&uRux0eC-rg!-ct8z_SH+gQR?L_`KQW`U{Es~--NTUV#=)U<%010YC`B^LM@ z@*SQx2mUY_ZiinCCfhw=lUzQ29q_90pcKwXwaRN>4ndIi{X2;M>l;4-B>Uf_vfrx4 zaxd5x%spe&yVF^y1zL& z4-)MF&kAK;sT17$`^{VDR$s`wl&2}U&l5!d2~#D7SA4bD|3RU^+et~nm0VQa$P zJv9dWeHxs1F=Mosq%uPf4U;$ZLphyU!oL$xvbOj>UY1ZFg@Q^g9tyL1gN}MCPWN7M*K-Wv|u9!<_H#+`w$m;Yr7KDgL zRb-LH&SHv~=#6<>*40`oxrCvi-R0c&S&d;9m&lAp-qEws@kT^s*NdU_WfXm_Mfqk^ z{}IZ(|29^W=@IwD?OHWK`;C@Ky|(;Pd&+m$8Rv!dq*-9-?bF7p{OCNyuQep%SXQHf zxfU@y9JmuH8^H@tb3v=nbgkSn9PhfZU9p-@6^ zrWAZNVq!pp-(De^a7=T=lMl8j{QH1(kDdwRKH=aXpsKJflPN&^k^5n>JtYNHn8Godluk$0HnFQ)2Fq78$EKfTZN|56K^d(r<)5AZ28kzH4j&{4G z(ruS-|AMg(B@@+N#-lfi6{KMI$}M#otRBd5eXrL0BvNB6Lf+~4N;g^k?znLt=Ji`N z%AmohU*2poH!)qk6vH%Ic!^H05@@Dq?&$9L+Bg@BhIWh!6?MP{>^H0A-P><2LIL1d zyR^vign)7soQ-7o!}ElTEPc>auA<_zGBSIHR~)mD|3qzGX9uJ0|14yj4;gqZ!o`2h zt*J*gd+djOH9L+qmKm=X#~TthL)67uUP)MT7#rQm;`Y1U^ZlXE>15{0I$4V>s@`?z z&c?z~MXNSe4ZQuB5p?9Ye=@Xfmz4MCr*OCRmcGTO8vMfiB@aH%L_y0LMf;bsmd2LE zXmd<#!K4?9(*Ivk0c(1T@%M81S~4*CSiQ}brnik12Qo=#4q|b{(R>yOLEvHHg|{zR z-oFD)X+Pw_Az;+E;GDba3M!jV-g@}<8LixxcJk#p1J=tIp>1z9sccEzUT!)473)%9 znkzxE3H-ufSns?=N31D(Y3w zD5fis(JQ&10l$7Nc%sFv$BIxA_;Q=cByBytTgsoKxGGnix2Yw6&z9HL(`s)LDmGlY zr&jhv!*L;&8Au^zI=XdiU@;<=*IcF};5O_1vN(Ketv$m^RUurkMlvJQJLU&;Cf1H4 z_^uuEKkCNoK!t|hql4YRE#&ozis-l1OtlWt|8Euj!O>j92;iQ0Ej|k+(_@B=?8G;I zDnq;0Rpn|WttJhn0{QmDTj*%0G-ax^Op9j{Dt)sG{O)gEvsI%%%{d9DXJUepmw-F( zr_KzS&uw`&F-!383zRrt#aZ*>VtEDNVX?q^kB84prfdewUTYIk!jTU9uUr5h>5=^~ zTW#kake+hQ1{QSWvrN32Bd_Jx`-%gv*0njePN-Tp^QrXCey1-@<1>b8tycEw6gWAp zV3A=IE$XkLHTe@Vs>+2?v?b8bP%~mn@vP9Abo2i6ya->g=&B~+dwbE{S9uXUS;kid zi(b}nZWI2!^tpyW+*JmX911vsVd}{CmGQWA648s_X}~Ck0dSOrt+wj|sEil26~mF$ z24+SJ`O!U!G&?N+t%2DPY_C+(d6p}G&?Hu8wcs5EUo(3wGAk)?8(Z+GH-6llesv_w zzb7=2?sDB2Uju(H>3q4>PtL^mx`9L=Q{#xScHZIs65i3yAf#_@)P8-pO$GBZSscM4 zuPxoj09w4($Hds-FL3`IMf@e1_V7DG%@3l{8{btD5y11?ieM{JH9`T-WYHz_v8E2U z7s*-`(<0Nl$*+`()U4fEKc*NK3GFi4rx=nG6X%SF$nCz)%XLf4%j;y-E;0F5N`lfn zX~3vn23PImn{~(w}l!u1Ky~dAK^Q0dvq}}a2XE!R4SaueVOJ{iPI3~UNU5= z4?lFR$V_7uKqb=BKRh}BK1RcLwrV)SE&14{n(ZHdM^f5Xwe)XDX7r zXz6H|Ov4b(=_1j~8dYlHBDEH|(?R3M*NbW;8pYE#rL*PTf9O0QmLu|t^@T+R^Aqao z_TMQf2^Bq(IM~<*?HhIN$ZET{e&|wjwth5kSg^AxGBEdC(9}w!*E9FX{v^^rCj4p| zTezRnr-daYE(_&r?EbVr3sB#v0&fR>2Z8RT*1;CX48mTSFoomgA3>gI)j#pf_c zhS@@R?mhpzG_nawveo^518~ak$&%qbY)*;4Wvr&6zY~j=C1z4S(d|#r`LMEv0RVp| zfYZ^N&m5?I`y8cHA}s7X9-7UHSB^o*)(`$<#;X(E_G?N=@`!MBu2DR9<-cMgyTC*l zJ8W9&J+3L6;_EOD0TV3o6zK@K5^v63oM3q$%D2&7{=IF~Vs?!RP}W z8u7%pb$!?nTM@>V;`@_B>rKor?q?KuTzYLuP0IroDp;w;xa(|@zdwO_0!S%3z~dNp!lt)iI5Y zYv#2XThJ_JEWzmAtc}$N&i&8QDaCgo8qAs!)9j5*lZqpH?s+v@k^18 zDRxirQ=S@?s3#<)30mlyD-Rxx*OXuK{j|N646%^m75o#bMfIH*jD!1KHdXu-&s5gK za;J<<_+(5S-9Ni$uxBYrbH-VeUcblfM%@`n{+vwp{qW45k=~Zkf{Gwpn58uMZk^fQ&Nz)ow&j$>Kk#PD39O- zeVFLJxM0-pNU&+ofx2)UWp{vj z?9fwx@t$+x`7Sxr4v_MSCV8$wG~+R?y+Q$fYoC*%H2;y*&nW>=?Dj*2p7t+L|0-l@ zduFgo^cK&?02Z3SE91K70&KqJ81Gy7feCz$UHZ)qCd>tRHXN){c(KUXdaj<4Lnz@m zw7C;4dpa&ddUYod%){lmKDS79+xx~9RIBg(_0AKUg3jeAKp)iig6G>oi#j0jg--Q zvMX+1txY|*2=19ja{-}Y>X3kwzpoYg1ryc_%;sL=!Y#3|yE{+#NF9VY73Auhdibp= zdY{NLqp4TA(1k;NC-=OzM-en1M(Hps*8Ip=Vz4HNN*ErE9dgAhC&;;Da?2ro@bw2p zOJh9-D_l`4)|&i``v)sns(%*#S3ej2qn~l(mzA$!|IyEHKXbIy@mAZ6%aTk~e4bSK zVZ3I;F62>QL6IGugW%B8;#!h7kyVEGV6(Ye%=L|*th6#}4IB2aU^*n#j#j(QyVRt* zGcqapf$;`*R>6Xt4$Gkz+m%yzgR!$m7R+Le`dx+60PMS~==iB+K-}{iZu`14PcKG`}#=&=BbxW*bcK~0Hn8a_rXVOkeB9~UPSmgTemvdroEj+D{@@bw>+IE}`VZgC`?PqyD1}>Yj6mHb6Ni)c0E8G4JwU z0s_3l-M@%_>m>0PfCP%qsI#a1_!>gD-$frlN6)nV=(SzZ9KR=4?K+oHa`Mv!{qXbF zp?ov3b9Bp*g+40>$=8Lq5i=blL;mz4HOlcvP4B3=NcBENaY_9Ti9t0MiN$fjooLbY1x>1ni|_)1bMd#=_b)$il4I*i{_-%! z7c;1u6kv)7a@(?)RhDeGQZLMUvQ4-ksZ3Xv$2o8(nG$xSl|GHpeGT4>8*;9;uP@Pp!TbM`J8C9#U5v7Kg`AKH8NW3TW>5dDQce^#=4XwVe*UJhoSlF7+m5 zO?*+$M9}Yroo313I+X4y>#ALAv+M8tlA?60@&7AO5)Fdc_m{&2;z#ljeJEAB=Hh%{9z#qd{}(Y~`KdV-Hw5?fCPMRLNR46F z_B@v=%;oIC*8saT{6(0%(s!>oz~gTn46LN ztVdpz5RL}ryYx|J#{w<%juoaXGCR}`#8wXd?frKRSh8+Yz3x&nl3#E7)uMCIyw@Gd z{=)jLz37+eePdWzxL4(C3(4;Fj}>2#vD#knt5k|~ZF$K%F@W-2@MLDj^Z(`!7Y18D zuwcJyygz#-0+rj@$&~LLu>b@w`sZ{4O3V~ZX7{s%Ob1mW%SE|%%S7@GGWtp4rU$Y_HtkI^`bGQsPG|Fc*=7?63^($fDfPN4rkPw z3JR)oI(^c{?L>la8*KdZOGE{r;*Z;b&pE*X`nG28J{-teaCX|Fj%@zl3RER_LKors;#nQb1}%?2PlW{s z?z}Vg^4qh&s_u}|69yg=YG*yfV3+s+uG7IHq{}&@Ld$@bOrzI;s`f#L+zG~!O0i~O z{Yg{t&EXHHo0x_g&Ck7!Dgy2P8w)z+%=-y~nXfm_ z?RB3+th;)rMQ=-2WhOto7Na<5v}_|SLaFPbed|vOa-ge7nT=&VeQAe@DH=-G91Up?sG41-g@y6LxzgB@IIn1R;!KgGq^rTMc>~ zg5mS)E}uCFla~v5_3Q=fCo5~jj#$fvV=H*YR7=v$tkPrlvC=mqWDTAVz4tcE( z-WKd!Q|CjK|glmVR|v9H9sRWDsx*>hG(ez2%EWk1~@kAoz#qt8j_XQNS- z1Hi-2s;Xd-@AnG^X#h^>zP+cX*tJHLn7+*95=r`qq9s8v^7(FaKk)8v{LC?Vd&x!5 zG6KN*?Jhqy9FRcrH*rv3aYz9fHy25a&XCK)c~<0EVK%_dc+!MN{O%{HN2?9sBhCZi z+74LWW6>G?>&LzGS9Q$7_IJrM(IVl&d5%-b_z!|H(npeGr?E~j7OHY(?Y(ro@xj6& z`T6mμ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 literal 0 HcmV?d00001 From 9967c7d6bbb0dd2a1f6d5f5ab826b24d49e95093 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Wed, 13 Nov 2013 09:03:58 +0000 Subject: [PATCH 199/771] break help image --- tutorials/help-break.png | Bin 0 -> 103209 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 tutorials/help-break.png diff --git a/tutorials/help-break.png b/tutorials/help-break.png new file mode 100644 index 0000000000000000000000000000000000000000..4a8d3cc14146e387756d490c3e7f4fed107f2266 GIT binary patch literal 103209 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