From: krakjoe Date: Sun, 10 Nov 2013 18:56:19 +0000 (+0000) Subject: fix symbol breakpoints X-Git-Tag: php-5.6.0alpha1~110^2~517 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=663a13635ac00b139d4882daeea44214b04cb9ba;p=php fix symbol breakpoints --- diff --git a/phpdbg_bp.c b/phpdbg_bp.c index a45ab164f7..52f0a243fd 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 26811d0c39..370c15eba0 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 dee88d2534..a5fa359290 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(