if (!fname) {
fname = "main";
}
-
+
if (zend_hash_find(&PHPDBG_G(bp_symbols), fname, strlen(fname),
(void**)&break_list) == SUCCESS) {
printf("breakpoint reached!\n");
{
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;
} /* }}} */
}
#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) {
}
}
- 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(