Fix phpdbg output when outputting via php with active output handlers

This commit is contained in:
Bob Weinand 2014-10-25 18:48:43 +02:00
parent be5242e0fe
commit bbcee18b4b
4 changed files with 40 additions and 9 deletions

View File

@ -477,15 +477,7 @@ static void php_sapi_phpdbg_log_message(char *message TSRMLS_DC) /* {{{ */
case E_USER_ERROR:
case E_PARSE:
case E_RECOVERABLE_ERROR:
if (!(PHPDBG_G(flags) & PHPDBG_IN_EVAL)) {
phpdbg_list_file(
zend_get_executed_filename(TSRMLS_C),
3,
zend_get_executed_lineno(TSRMLS_C)-1,
zend_get_executed_lineno(TSRMLS_C)
TSRMLS_CC
);
}
phpdbg_list_file(zend_get_executed_filename(TSRMLS_C), 3, zend_get_executed_lineno(TSRMLS_C)-1, zend_get_executed_lineno(TSRMLS_C) TSRMLS_CC);
do {
switch (phpdbg_interactive(1 TSRMLS_CC)) {

View File

@ -25,6 +25,7 @@
#include "phpdbg_list.h"
ZEND_EXTERN_MODULE_GLOBALS(phpdbg);
ZEND_EXTERN_MODULE_GLOBALS(output);
void phpdbg_restore_frame(TSRMLS_D) /* {{{ */
{
@ -198,8 +199,12 @@ void phpdbg_dump_backtrace(size_t num TSRMLS_DC) /* {{{ */
int i = 0, limit = num;
int user_defined;
PHPDBG_OUTPUT_BACKUP();
if (limit < 0) {
phpdbg_error("backtrace", "type=\"minnum\"", "Invalid backtrace size %d", limit);
PHPDBG_OUTPUT_BACKUP_RESTORE();
return;
}
@ -242,4 +247,6 @@ void phpdbg_dump_backtrace(size_t num TSRMLS_DC) /* {{{ */
phpdbg_xml("</backtrace>");
zval_dtor(&zbacktrace);
PHPDBG_OUTPUT_BACKUP_RESTORE();
} /* }}} */

View File

@ -42,6 +42,7 @@
#include "phpdbg_eol.h"
ZEND_EXTERN_MODULE_GLOBALS(phpdbg);
ZEND_EXTERN_MODULE_GLOBALS(output);
#ifdef HAVE_LIBDL
#ifdef PHP_WIN32
@ -699,12 +700,16 @@ PHPDBG_COMMAND(ev) /* {{{ */
zend_class_entry *original_called_scope = EG(called_scope);
zend_vm_stack original_stack = EG(argument_stack);
PHPDBG_OUTPUT_BACKUP();
if (PHPDBG_G(flags) & PHPDBG_IN_SIGNAL_HANDLER) {
phpdbg_try_access {
phpdbg_parse_variable(param->str, param->len, &EG(symbol_table), 0, phpdbg_output_ev_variable, 0 TSRMLS_CC);
} phpdbg_catch_access {
phpdbg_error("signalsegv", "", "Could not fetch data, invalid data source");
} phpdbg_end_try_access();
PHPDBG_OUTPUT_BACKUP_RESTORE();
return SUCCESS;
}
@ -746,6 +751,8 @@ PHPDBG_COMMAND(ev) /* {{{ */
CG(unclean_shutdown) = 0;
PHPDBG_OUTPUT_BACKUP_RESTORE();
return SUCCESS;
} /* }}} */

View File

@ -112,4 +112,29 @@ PHPDBG_API int phpdbg_parse_variable_with_arg(char *input, size_t len, HashTable
PHPDBG_API void phpdbg_xml_var_dump(zval **zv TSRMLS_DC);
#ifdef ZTS
#define PHPDBG_OUTPUT_BACKUP_DEFINES() \
zend_output_globals *output_globals_ptr; \
zend_output_globals original_output_globals; \
output_globals_ptr = (zend_output_globals *) (*((void ***) tsrm_ls))[TSRM_UNSHUFFLE_RSRC_ID(output_globals_id)];
#else
#define PHPDBG_OUTPUT_BACKUP_DEFINES() \
zend_output_globals *output_globals_ptr; \
zend_output_globals original_output_globals; \
output_globals_ptr = &output_globals;
#endif
#define PHPDBG_OUTPUT_BACKUP_SWAP() \
original_output_globals = *output_globals_ptr; \
memset(output_globals_ptr, 0, sizeof(zend_output_globals)); \
php_output_activate(TSRMLS_C);
#define PHPDBG_OUTPUT_BACKUP() \
PHPDBG_OUTPUT_BACKUP_DEFINES() \
PHPDBG_OUTPUT_BACKUP_SWAP()
#define PHPDBG_OUTPUT_BACKUP_RESTORE() \
php_output_deactivate(TSRMLS_C); \
*output_globals_ptr = original_output_globals;
#endif /* PHPDBG_UTILS_H */