1 /* 2 +----------------------------------------------------------------------+ 3 | PHP Version 5 | 4 +----------------------------------------------------------------------+ 5 | Copyright (c) 1997-2016 The PHP Group | 6 +----------------------------------------------------------------------+ 7 | This source file is subject to version 3.01 of the PHP license, | 8 | that is bundled with this package in the file LICENSE, and is | 9 | available through the world-wide-web at the following url: | 10 | http://www.php.net/license/3_01.txt | 11 | If you did not receive a copy of the PHP license and are unable to | 12 | obtain it through the world-wide-web, please send a note to | 13 | license@php.net so we can mail you a copy immediately. | 14 +----------------------------------------------------------------------+ 15 | Authors: Felipe Pena <felipe@php.net> | 16 | Authors: Joe Watkins <joe.watkins@live.co.uk> | 17 | Authors: Bob Weinand <bwoebi@php.net> | 18 +----------------------------------------------------------------------+ 19 */ 20 21 #ifndef PHPDBG_H 22 #define PHPDBG_H 23 24 #ifdef PHP_WIN32 25 # define PHPDBG_API __declspec(dllexport) 26 #elif defined(__GNUC__) && __GNUC__ >= 4 27 # define PHPDBG_API __attribute__ ((visibility("default"))) 28 #else 29 # define PHPDBG_API 30 #endif 31 32 #include "php.h" 33 #include "php_globals.h" 34 #include "php_variables.h" 35 #include "php_getopt.h" 36 #include "zend_builtin_functions.h" 37 #include "zend_extensions.h" 38 #include "zend_modules.h" 39 #include "zend_globals.h" 40 #include "zend_ini_scanner.h" 41 #include "zend_stream.h" 42 #ifndef _WIN32 43 # include "zend_signal.h" 44 #endif 45 #include "SAPI.h" 46 #include <fcntl.h> 47 #include <sys/types.h> 48 #if defined(_WIN32) && !defined(__MINGW32__) 49 # include <windows.h> 50 # include "config.w32.h" 51 # undef strcasecmp 52 # undef strncasecmp 53 # define strcasecmp _stricmp 54 # define strncasecmp _strnicmp 55 #else 56 # include "php_config.h" 57 #endif 58 #ifndef O_BINARY 59 # define O_BINARY 0 60 #endif 61 #include "php_main.h" 62 63 #ifdef ZTS 64 # include "TSRM.h" 65 #endif 66 67 #ifdef LIBREADLINE 68 # include <readline/readline.h> 69 # include <readline/history.h> 70 #endif 71 #ifdef HAVE_LIBEDIT 72 # include <editline/readline.h> 73 #endif 74 75 #include "phpdbg_lexer.h" 76 #include "phpdbg_cmd.h" 77 #include "phpdbg_utils.h" 78 #include "phpdbg_btree.h" 79 #include "phpdbg_watch.h" 80 81 int phpdbg_do_parse(phpdbg_param_t *stack, char *input TSRMLS_DC); 82 83 #ifdef ZTS 84 # define PHPDBG_G(v) TSRMG(phpdbg_globals_id, zend_phpdbg_globals *, v) 85 #else 86 # define PHPDBG_G(v) (phpdbg_globals.v) 87 #endif 88 89 #define PHPDBG_NEXT 2 90 #define PHPDBG_UNTIL 3 91 #define PHPDBG_FINISH 4 92 #define PHPDBG_LEAVE 5 93 94 /* 95 BEGIN: DO NOT CHANGE DO NOT CHANGE DO NOT CHANGE 96 */ 97 98 /* {{{ tables */ 99 #define PHPDBG_BREAK_FILE 0 100 #define PHPDBG_BREAK_SYM 1 101 #define PHPDBG_BREAK_OPLINE 2 102 #define PHPDBG_BREAK_METHOD 3 103 #define PHPDBG_BREAK_COND 4 104 #define PHPDBG_BREAK_OPCODE 5 105 #define PHPDBG_BREAK_FUNCTION_OPLINE 6 106 #define PHPDBG_BREAK_METHOD_OPLINE 7 107 #define PHPDBG_BREAK_FILE_OPLINE 8 108 #define PHPDBG_BREAK_MAP 9 109 #define PHPDBG_BREAK_TABLES 10 /* }}} */ 110 111 /* {{{ flags */ 112 #define PHPDBG_HAS_FILE_BP (1<<1) 113 #define PHPDBG_HAS_SYM_BP (1<<2) 114 #define PHPDBG_HAS_OPLINE_BP (1<<3) 115 #define PHPDBG_HAS_METHOD_BP (1<<4) 116 #define PHPDBG_HAS_COND_BP (1<<5) 117 #define PHPDBG_HAS_OPCODE_BP (1<<6) 118 #define PHPDBG_HAS_FUNCTION_OPLINE_BP (1<<7) 119 #define PHPDBG_HAS_METHOD_OPLINE_BP (1<<8) 120 #define PHPDBG_HAS_FILE_OPLINE_BP (1<<9) /* }}} */ 121 122 /* 123 END: DO NOT CHANGE DO NOT CHANGE DO NOT CHANGE 124 */ 125 126 #define PHPDBG_IN_COND_BP (1<<10) 127 #define PHPDBG_IN_EVAL (1<<11) 128 129 #define PHPDBG_IS_STEPPING (1<<12) 130 #define PHPDBG_STEP_OPCODE (1<<13) 131 #define PHPDBG_IS_QUIET (1<<14) 132 #define PHPDBG_IS_QUITTING (1<<15) 133 #define PHPDBG_IS_COLOURED (1<<16) 134 #define PHPDBG_IS_CLEANING (1<<17) 135 136 #define PHPDBG_IN_UNTIL (1<<18) 137 #define PHPDBG_IN_FINISH (1<<19) 138 #define PHPDBG_IN_LEAVE (1<<20) 139 140 #define PHPDBG_IS_REGISTERED (1<<21) 141 #define PHPDBG_IS_STEPONEVAL (1<<22) 142 #define PHPDBG_IS_INITIALIZING (1<<23) 143 #define PHPDBG_IS_SIGNALED (1<<24) 144 #define PHPDBG_IS_INTERACTIVE (1<<25) 145 #define PHPDBG_IS_BP_ENABLED (1<<26) 146 #define PHPDBG_IS_REMOTE (1<<27) 147 #define PHPDBG_IS_DISCONNECTED (1<<28) 148 149 #define PHPDBG_SHOW_REFCOUNTS (1<<29) 150 151 #define PHPDBG_SEEK_MASK (PHPDBG_IN_UNTIL|PHPDBG_IN_FINISH|PHPDBG_IN_LEAVE) 152 #define PHPDBG_BP_RESOLVE_MASK (PHPDBG_HAS_FUNCTION_OPLINE_BP|PHPDBG_HAS_METHOD_OPLINE_BP|PHPDBG_HAS_FILE_OPLINE_BP) 153 #define PHPDBG_BP_MASK (PHPDBG_HAS_FILE_BP|PHPDBG_HAS_SYM_BP|PHPDBG_HAS_METHOD_BP|PHPDBG_HAS_OPLINE_BP|PHPDBG_HAS_COND_BP|PHPDBG_HAS_OPCODE_BP|PHPDBG_HAS_FUNCTION_OPLINE_BP|PHPDBG_HAS_METHOD_OPLINE_BP|PHPDBG_HAS_FILE_OPLINE_BP) 154 155 #ifndef _WIN32 156 # define PHPDBG_DEFAULT_FLAGS (PHPDBG_IS_QUIET|PHPDBG_IS_COLOURED|PHPDBG_IS_BP_ENABLED) 157 #else 158 # define PHPDBG_DEFAULT_FLAGS (PHPDBG_IS_QUIET|PHPDBG_IS_BP_ENABLED) 159 #endif /* }}} */ 160 161 /* {{{ strings */ 162 #define PHPDBG_NAME "phpdbg" 163 #define PHPDBG_AUTHORS "Felipe Pena, Joe Watkins and Bob Weinand" /* Ordered by last name */ 164 #define PHPDBG_URL "http://phpdbg.com" 165 #define PHPDBG_ISSUES "http://github.com/krakjoe/phpdbg/issues" 166 #define PHPDBG_VERSION "0.4.0" 167 #define PHPDBG_INIT_FILENAME ".phpdbginit" 168 /* }}} */ 169 170 /* {{{ output descriptors */ 171 #define PHPDBG_STDIN 0 172 #define PHPDBG_STDOUT 1 173 #define PHPDBG_STDERR 2 174 #define PHPDBG_IO_FDS 3 /* }}} */ 175 176 177 /* {{{ structs */ 178 ZEND_BEGIN_MODULE_GLOBALS(phpdbg) 179 HashTable bp[PHPDBG_BREAK_TABLES]; /* break points */ 180 HashTable registered; /* registered */ 181 HashTable seek; /* seek oplines */ 182 phpdbg_frame_t frame; /* frame */ 183 zend_uint last_line; /* last executed line */ 184 185 phpdbg_lexer_data lexer; /* lexer data */ 186 phpdbg_param_t *parser_stack; /* param stack during lexer / parser phase */ 187 188 #ifndef _WIN32 189 struct sigaction old_sigsegv_signal; /* segv signal handler */ 190 #endif 191 phpdbg_btree watchpoint_tree; /* tree with watchpoints */ 192 phpdbg_btree watch_HashTables; /* tree with original dtors of watchpoints */ 193 HashTable watchpoints; /* watchpoints */ 194 zend_llist watchlist_mem; /* triggered watchpoints */ 195 zend_bool watchpoint_hit; /* a watchpoint was hit */ 196 void (*original_free_function)(void *); /* the original AG(mm_heap)->_free function */ 197 198 char *exec; /* file to execute */ 199 size_t exec_len; /* size of exec */ 200 zend_op_array *ops; /* op_array */ 201 zval *retval; /* return value */ 202 int bp_count; /* breakpoint count */ 203 int vmret; /* return from last opcode handler execution */ 204 205 FILE *oplog; /* opline log */ 206 FILE *io[PHPDBG_IO_FDS]; /* io */ 207 208 char *prompt[2]; /* prompt */ 209 const phpdbg_color_t *colors[PHPDBG_COLORS]; /* colors */ 210 char *buffer; /* buffer */ 211 212 zend_ulong flags; /* phpdbg flags */ 213 ZEND_END_MODULE_GLOBALS(phpdbg) /* }}} */ 214 215 /* the beginning (= the important part) of the _zend_mm_heap struct defined in Zend/zend_alloc.c 216 Needed for realizing watchpoints */ 217 struct _zend_mm_heap { 218 int use_zend_alloc; 219 void *(*_malloc)(size_t); 220 void (*_free)(void *); 221 void *(*_realloc)(void *, size_t); 222 size_t free_bitmap; 223 size_t large_free_bitmap; 224 size_t block_size; 225 size_t compact_size; 226 zend_mm_segment *segments_list; 227 zend_mm_storage *storage; 228 }; 229 230 #endif /* PHPDBG_H */ 231