123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- #ifndef PHPDBG_WATCH_H
- #define PHPDBG_WATCH_H
- #include "TSRM.h"
- #include "phpdbg_cmd.h"
- #ifdef _WIN32
- # include "phpdbg_win.h"
- #endif
- #define PHPDBG_WATCH(name) PHPDBG_COMMAND(watch_##name)
- PHPDBG_WATCH(array);
- PHPDBG_WATCH(delete);
- PHPDBG_WATCH(recursive);
- static const phpdbg_command_t phpdbg_watch_commands[] = {
- PHPDBG_COMMAND_D_EX(array, "create watchpoint on an array", 'a', watch_array, NULL, "s"),
- PHPDBG_COMMAND_D_EX(delete, "delete watchpoint", 'd', watch_delete, NULL, "s"),
- PHPDBG_COMMAND_D_EX(recursive, "create recursive watchpoints", 'r', watch_recursive, NULL, "s"),
- PHPDBG_END_COMMAND
- };
- typedef enum {
- WATCH_ON_ZVAL,
- WATCH_ON_HASHTABLE,
- } phpdbg_watchtype;
- #define PHPDBG_WATCH_SIMPLE 0x0
- #define PHPDBG_WATCH_RECURSIVE 0x1
- typedef struct _phpdbg_watchpoint_t phpdbg_watchpoint_t;
- struct _phpdbg_watchpoint_t {
- phpdbg_watchpoint_t *parent;
- HashTable *parent_container;
- char *name_in_parent;
- size_t name_in_parent_len;
- char *str;
- size_t str_len;
- union {
- zval *zv;
- HashTable *ht;
- void *ptr;
- } addr;
- size_t size;
- phpdbg_watchtype type;
- char flags;
- };
- void phpdbg_setup_watchpoints(TSRMLS_D);
- #ifndef _WIN32
- int phpdbg_watchpoint_segfault_handler(siginfo_t *info, void *context TSRMLS_DC);
- #else
- int phpdbg_watchpoint_segfault_handler(void *addr TSRMLS_DC);
- #endif
- void phpdbg_create_addr_watchpoint(void *addr, size_t size, phpdbg_watchpoint_t *watch);
- void phpdbg_create_zval_watchpoint(zval *zv, phpdbg_watchpoint_t *watch);
- int phpdbg_delete_var_watchpoint(char *input, size_t len TSRMLS_DC);
- int phpdbg_create_var_watchpoint(char *input, size_t len TSRMLS_DC);
- int phpdbg_print_changed_zvals(TSRMLS_D);
- void phpdbg_list_watchpoints(TSRMLS_D);
- void phpdbg_watch_efree(void *ptr);
- static long phpdbg_pagesize;
- static zend_always_inline void *phpdbg_get_page_boundary(void *addr) {
- return (void *)((size_t)addr & ~(phpdbg_pagesize - 1));
- }
- static zend_always_inline size_t phpdbg_get_total_page_size(void *addr, size_t size) {
- return (size_t)phpdbg_get_page_boundary((void *)((size_t)addr + size - 1)) - (size_t)phpdbg_get_page_boundary(addr) + phpdbg_pagesize;
- }
- #endif
|