Browse Source

Merge branch 'master' of https://github.com/krakjoe/phpdbg

pull/550/head
krakjoe 13 years ago
parent
commit
aba249e5c7
  1. 17
      phpdbg.c
  2. 45
      phpdbg_bp.c
  3. 3
      phpdbg_bp.h
  4. 41
      phpdbg_prompt.c
  5. 6
      phpdbg_prompt.h

17
phpdbg.c

@ -18,6 +18,7 @@
#include "phpdbg.h"
#include "phpdbg_prompt.h"
#include "phpdbg_bp.h"
ZEND_DECLARE_MODULE_GLOBALS(phpdbg);
@ -49,15 +50,20 @@ static PHP_MINIT_FUNCTION(phpdbg) /* {{{ */
return SUCCESS;
} /* }}} */
static void php_phpdbg_destroy_break(void *brake) /* {{{ */
static void php_phpdbg_destroy_bp_file(void *brake) /* {{{ */
{
zend_llist_destroy((zend_llist*)brake);
} /* }}} */
static void php_phpdbg_destroy_bp_symbol(void *brake) /* {{{ */
{
efree((char*)((phpdbg_breaksymbol_t*)brake)->symbol);
} /* }}} */
static PHP_RINIT_FUNCTION(phpdbg) /* {{{ */
{
zend_hash_init(&PHPDBG_G(bp_files), 8, NULL, php_phpdbg_destroy_break, 0);
zend_hash_init(&PHPDBG_G(bp_symbols), 8, NULL, php_phpdbg_destroy_break, 0);
zend_hash_init(&PHPDBG_G(bp_files), 8, NULL, php_phpdbg_destroy_bp_file, 0);
zend_hash_init(&PHPDBG_G(bp_symbols), 8, NULL, php_phpdbg_destroy_bp_symbol, 0);
return SUCCESS;
} /* }}} */
@ -173,7 +179,7 @@ static sapi_module_struct phpdbg_sapi_module = {
};
/* }}} */
const opt_struct phpdbg_options[] = { /* }}} */
const opt_struct OPTIONS[] = { /* {{{ */
{'c', 1, "ini path override"},
{'d', 1, "define ini entry on command line"},
{'-', 0, NULL}
@ -228,7 +234,7 @@ int main(int argc, char *argv[]) /* {{{ */
tsrm_ls = ts_resource(0);
#endif
while ((opt = php_getopt(argc, argv, phpdbg_options, &php_optarg, &php_optind, 0, 2)) != -1) {
while ((opt = php_getopt(argc, argv, OPTIONS, &php_optarg, &php_optind, 0, 2)) != -1) {
printf("OPT: %d\n", opt);
switch (opt) {
case 'c':
@ -290,7 +296,6 @@ int main(int argc, char *argv[]) /* {{{ */
memcpy(ini_entries, phpdbg_ini_hardcoded, sizeof(phpdbg_ini_hardcoded));
}
ini_entries_len += sizeof(phpdbg_ini_hardcoded) - 2;
printf("ini_entries: %d\n", ini_entries_len);
phpdbg->ini_entries = ini_entries;

45
phpdbg_bp.c

@ -32,13 +32,6 @@ static void phpdbg_llist_breakfile_dtor(void *data) /* {{{ */
efree((char*)bp->filename);
} /* }}} */
static void phpdbg_llist_breaksym_dtor(void *data) /* {{{ */
{
phpdbg_breaksymbol_t *bp = (phpdbg_breaksymbol_t*) data;
efree((char*)bp->symbol);
} /* }}} */
void phpdbg_set_breakpoint_file(const char *path, long line_num TSRMLS_DC) /* {{{ */
{
phpdbg_breakfile_t new_break;
@ -66,31 +59,21 @@ void phpdbg_set_breakpoint_file(const char *path, long line_num TSRMLS_DC) /* {{
zend_llist_add_element(break_files_ptr, &new_break);
} /* }}} */
void phpdbg_set_breakpoint_symbol(const char *name, long opline_num TSRMLS_DC) /* {{{ */
void phpdbg_set_breakpoint_symbol(const char *name TSRMLS_DC) /* {{{ */
{
phpdbg_breaksymbol_t new_break;
zend_llist *break_sym_ptr;
size_t name_len = strlen(name);
new_break.symbol = estrndup(name, name_len + 1);
new_break.opline_num = opline_num;
PHPDBG_G(has_sym_bp) = 1;
if (!zend_hash_exists(&PHPDBG_G(bp_symbols), name, name_len)) {
phpdbg_breaksymbol_t new_break;
if (zend_hash_find(&PHPDBG_G(bp_symbols),
new_break.symbol, name_len, (void**)&break_sym_ptr) == FAILURE) {
zend_llist break_syms;
PHPDBG_G(has_sym_bp) = 1;
zend_llist_init(&break_syms, sizeof(phpdbg_breaksymbol_t),
phpdbg_llist_breaksym_dtor, 0);
new_break.symbol = estrndup(name, name_len + 1);
new_break.id = PHPDBG_G(bp_count)++;
zend_hash_update(&PHPDBG_G(bp_symbols),
new_break.symbol, name_len, &break_syms, sizeof(zend_llist),
(void**)&break_sym_ptr);
zend_hash_update(&PHPDBG_G(bp_symbols), new_break.symbol,
name_len, &new_break, sizeof(phpdbg_breaksymbol_t), NULL);
}
new_break.id = PHPDBG_G(bp_count)++;
zend_llist_add_element(break_sym_ptr, &new_break);
} /* }}} */
int phpdbg_find_breakpoint_file(zend_op_array *op_array TSRMLS_DC) /* {{{ */
@ -119,7 +102,7 @@ int phpdbg_find_breakpoint_file(zend_op_array *op_array TSRMLS_DC) /* {{{ */
int phpdbg_find_breakpoint_symbol(zend_function *fbc TSRMLS_DC) /* {{{ */
{
const char *fname;
zend_llist *break_list;
phpdbg_breaksymbol_t *bp;
if (fbc->type != ZEND_USER_FUNCTION) {
return FAILURE;
@ -130,13 +113,13 @@ int phpdbg_find_breakpoint_symbol(zend_function *fbc TSRMLS_DC) /* {{{ */
if (!fname) {
fname = "main";
}
if (zend_hash_find(&PHPDBG_G(bp_symbols), fname, strlen(fname),
(void**)&break_list) == SUCCESS) {
printf("breakpoint reached!\n");
(void**)&bp) == SUCCESS) {
printf("Breakpoint #%d in %s() at %s\n", bp->id, bp->symbol,
zend_get_executed_filename(TSRMLS_C));
return SUCCESS;
}
return FAILURE;
}
/* }}} */
} /* }}} */

3
phpdbg_bp.h

@ -34,12 +34,11 @@ typedef struct _phpdbg_breakfile_t {
*/
typedef struct _phpdbg_breaksymbol_t {
const char *symbol;
long opline_num;
int id;
} phpdbg_breaksymbol_t;
void phpdbg_set_breakpoint_file(const char*, long TSRMLS_DC);
void phpdbg_set_breakpoint_symbol(const char*, long TSRMLS_DC);
void phpdbg_set_breakpoint_symbol(const char* TSRMLS_DC);
int phpdbg_find_breakpoint_file(zend_op_array* TSRMLS_DC);
int phpdbg_find_breakpoint_symbol(zend_function* TSRMLS_DC);

41
phpdbg_prompt.c

@ -72,7 +72,7 @@ static inline int phpdbg_compile(TSRMLS_D) /* {{{ */
} else {
printf("Cannot compile while in execution\n");
}
return FAILURE;
} /* }}} */
@ -138,7 +138,8 @@ static PHPDBG_COMMAND(eval) /* {{{ */
zval retval;
if (expr) {
if (zend_eval_stringl((char*)expr, expr_len-1, &retval, "eval()'d code" TSRMLS_CC) == SUCCESS) {
if (zend_eval_stringl((char*)expr, expr_len-1,
&retval, "eval()'d code" TSRMLS_CC) == SUCCESS) {
printf("Success: ");
zend_print_zval_r(&retval, 0 TSRMLS_CC);
printf("\n");
@ -228,14 +229,13 @@ static PHPDBG_COMMAND(break) /* {{{ */
phpdbg_set_breakpoint_file(resolved_name, line_num TSRMLS_CC);
} else {
char name[200];
const char *opnum_pos = zend_memrchr(expr, '#', expr_len);
long opline_num = opnum_pos ? strtol(opnum_pos+1, NULL, 0) : 0;
size_t name_len = opnum_pos ? opnum_pos - expr : strlen(expr);
size_t name_len = strlen(expr);
name_len = MIN(name_len, 200);
memcpy(name, expr, name_len);
name[name_len] = 0;
phpdbg_set_breakpoint_symbol(name, opline_num TSRMLS_CC);
phpdbg_set_breakpoint_symbol(name TSRMLS_CC);
}
return SUCCESS;
@ -399,27 +399,26 @@ zend_vm_enter:
if (PHPDBG_G(has_sym_bp) && execute_data->opline->opcode != ZEND_RETURN) {
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_find_breakpoint_symbol(previous->function_state.function TSRMLS_CC) == SUCCESS) {
while (phpdbg_interactive(0, NULL TSRMLS_CC) != PHPDBG_NEXT) {
continue;
}
}
}
}
}
if (previous && previous != execute_data && previous->opline) {
if (previous->opline->opcode == ZEND_DO_FCALL
|| previous->opline->opcode == ZEND_DO_FCALL_BY_NAME) {
if (phpdbg_find_breakpoint_symbol(
previous->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(
0, NULL TSRMLS_CC) != PHPDBG_NEXT) {
while (phpdbg_interactive(0, NULL TSRMLS_CC) != PHPDBG_NEXT) {
continue;
}
}

6
phpdbg_prompt.h

@ -27,6 +27,8 @@
#define PHPDBG_STRL(s) s, sizeof(s)-1
#define PHPDBG_NEXT 2
/**
* Command handler
*/
@ -52,9 +54,9 @@ int phpdbg_do_cmd(const phpdbg_command_t *command, char *cmd_line, size_t cmd_le
* Command Declarators
*/
#define PHPDBG_COMMAND_D(name, tip) \
{PHPDBG_STRL(#name), tip, sizeof(tip)-1, phpdbg_do_##name}
{PHPDBG_STRL(#name), tip, sizeof(tip)-1, phpdbg_do_##name}
#define PHPDBG_COMMAND(name) \
int phpdbg_do_##name(const char *expr, size_t expr_len TSRMLS_DC)
int phpdbg_do_##name(const char *expr, size_t expr_len TSRMLS_DC)
int phpdbg_interactive(int argc, char **argv TSRMLS_DC);
void phpdbg_execute_ex(zend_execute_data *execute_data TSRMLS_DC);

Loading…
Cancel
Save