mirror of
https://github.com/php/php-src.git
synced 2024-09-22 10:27:25 +00:00
Fix phpdbg output when outputting via php with active output handlers
This commit is contained in:
parent
be5242e0fe
commit
bbcee18b4b
10
phpdbg.c
10
phpdbg.c
@ -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)) {
|
||||
|
@ -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();
|
||||
} /* }}} */
|
||||
|
@ -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;
|
||||
} /* }}} */
|
||||
|
||||
|
@ -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 */
|
||||
|
Loading…
Reference in New Issue
Block a user