Commit: ffad3fa2119346e6735dda266f705fae68c1109c
Author: Felipe Pena <felipe...@gmail.com> Tue, 12 Nov 2013 10:58:19
-0200
Parents: 7f743e1fca1773a8e5deaac079386c9a8b731601
Branches: PHP-5.6
Link:
http://git.php.net/?p=php-src.git;a=commitdiff;h=ffad3fa2119346e6735dda266f705fae68c1109c
Log:
- Implemented "break N" where N is the line number on the current file
Changed paths:
M phpdbg_prompt.c
M phpdbg_utils.c
M phpdbg_utils.h
diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c
index a3eaacb..3040b80 100644
--- a/phpdbg_prompt.c
+++ b/phpdbg_prompt.c
@@ -37,7 +37,7 @@ static PHPDBG_COMMAND(exec) /* {{{ */
{
if (PHPDBG_G(exec)) {
printf(
- "%sUnsetting old execution context: %s%s\n",
+ "%sUnsetting old execution context: %s%s\n",
PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_G(exec),
PHPDBG_END_LINE(TSRMLS_C));
efree(PHPDBG_G(exec));
PHPDBG_G(exec) = NULL;
@@ -47,14 +47,14 @@ static PHPDBG_COMMAND(exec) /* {{{ */
printf(
"%sDestroying compiled opcodes%s\n",
PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C));
-
+
phpdbg_clean(0 TSRMLS_CC);
}
PHPDBG_G(exec) = estrndup(expr, PHPDBG_G(exec_len) = expr_len);
printf(
- "%sSet execution context: %s%s\n",
+ "%sSet execution context: %s%s\n",
PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_G(exec),
PHPDBG_END_LINE(TSRMLS_C));
return SUCCESS;
@@ -73,17 +73,17 @@ static inline int phpdbg_compile(TSRMLS_D) /* {{{ */
&fh, ZEND_INCLUDE TSRMLS_CC);
zend_destroy_file_handle(&fh TSRMLS_CC);
printf(
- "%sSuccess%s\n",
+ "%sSuccess%s\n",
PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C));
return SUCCESS;
} else {
printf(
- "%sCould not open file %s%s\n",
+ "%sCould not open file %s%s\n",
PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_G(exec),
PHPDBG_END_LINE(TSRMLS_C));
}
} else {
printf(
- "%sCannot compile while in execution%s\n",
+ "%sCannot compile while in execution%s\n",
PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C));
}
@@ -96,7 +96,7 @@ static PHPDBG_COMMAND(compile) /* {{{ */
if (!EG(in_execution)) {
if (PHPDBG_G(ops)) {
printf(
- "%sDestroying previously compiled opcodes%s\n",
+ "%sDestroying previously compiled opcodes%s\n",
PHPDBG_BOLD_LINE(TSRMLS_C),
PHPDBG_END_LINE(TSRMLS_C));
phpdbg_clean(0 TSRMLS_CC);
}
@@ -120,11 +120,11 @@ static PHPDBG_COMMAND(step) /* {{{ */
}
printf(
- "%sStepping %s%s\n",
- PHPDBG_BOLD_LINE(TSRMLS_C),
- (PHPDBG_G(flags) & PHPDBG_IS_STEPPING) ? "on" : "off",
+ "%sStepping %s%s\n",
+ PHPDBG_BOLD_LINE(TSRMLS_C),
+ (PHPDBG_G(flags) & PHPDBG_IS_STEPPING) ? "on" : "off",
PHPDBG_END_LINE(TSRMLS_C));
-
+
return SUCCESS;
} /* }}} */
@@ -230,7 +230,7 @@ static PHPDBG_COMMAND(print) /* {{{ */
if (expr_len > 0L) {
if (phpdbg_do_cmd(phpdbg_print_commands, (char*)expr, expr_len
TSRMLS_CC) == FAILURE) {
printf(
- "%sFailed to find print command: %s/%lu%s\n",
+ "%sFailed to find print command: %s/%lu%s\n",
PHPDBG_RED_LINE(TSRMLS_C), expr, expr_len,
PHPDBG_END_LINE(TSRMLS_C));
}
return SUCCESS;
@@ -382,22 +382,34 @@ static PHPDBG_COMMAND(break) /* {{{ */
}
}
} else {
- if (expr_len > 2 && expr[0] == '0' && expr[1] == 'x') {
- phpdbg_set_breakpoint_opline(expr TSRMLS_CC);
- } else {
- char name[200];
- size_t name_len = strlen(expr);
-
- if (name_len) {
- name_len = MIN(name_len, 200);
- memcpy(name, expr, name_len);
- name[name_len] = 0;
+ if (phpdbg_is_addr(expr)) {
+ phpdbg_set_breakpoint_opline(expr TSRMLS_CC);
+ } else if (phpdbg_is_numeric(expr)) {
+ const char *filename =
zend_get_executed_filename(TSRMLS_C);
+ long line_num = strtol(expr, NULL, 0);
+
+ if (!filename) {
+ printf("%sNo file context found%s\n",
+ PHPDBG_RED_LINE(TSRMLS_C),
PHPDBG_END_LINE(TSRMLS_C));
+ return FAILURE;
+ }
- phpdbg_set_breakpoint_symbol(name TSRMLS_CC);
- } else {
- printf("%sMalformed break command found%s\n",
PHPDBG_RED_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C));
- return FAILURE;
- }
+ phpdbg_set_breakpoint_file(filename, line_num
TSRMLS_CC);
+ } else {
+ char name[200];
+ size_t name_len = strlen(expr);
+
+ if (name_len) {
+ name_len = MIN(name_len, 200);
+ memcpy(name, expr, name_len);
+ name[name_len] = 0;
+
+ phpdbg_set_breakpoint_symbol(name TSRMLS_CC);
+ } else {
+ printf("%sMalformed break command found%s\n",
+ PHPDBG_RED_LINE(TSRMLS_C),
PHPDBG_END_LINE(TSRMLS_C));
+ return FAILURE;
+ }
}
}
@@ -469,13 +481,13 @@ static PHPDBG_COMMAND(clear) /* {{{ */
static PHPDBG_COMMAND(help) /* {{{ */
{
printf(
- "%sWelcome to phpdbg, the interactive PHP debugger, v%s%s\n",
+ "%sWelcome to phpdbg, the interactive PHP debugger, v%s%s\n",
PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_VERSION,
PHPDBG_END_LINE(TSRMLS_C));
if (expr_len > 0L) {
if (phpdbg_do_cmd(phpdbg_help_commands, (char*)expr, expr_len
TSRMLS_CC) == FAILURE) {
printf(
- "%sFailed to find help command: %s/%lu%s\n",
+ "%sFailed to find help command: %s/%lu%s\n",
PHPDBG_RED_LINE(TSRMLS_C), expr, expr_len,
PHPDBG_END_LINE(TSRMLS_C));
}
} else {
@@ -485,26 +497,26 @@ static PHPDBG_COMMAND(help) /* {{{ */
printf("To get help regarding a specific command type \"help
command\"\n");
printf(
- "%sCommands%s\n",
+ "%sCommands%s\n",
PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C));
-
+
while (prompt_command && prompt_command->name) {
printf("\t%s\t%s\n", prompt_command->name,
prompt_command->tip);
++prompt_command;
}
printf(
- "%sHelpers Loaded%s\n",
+ "%sHelpers Loaded%s\n",
PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_END_LINE(TSRMLS_C));
-
+
while (help_command && help_command->name) {
printf("\t%s\t%s\n", help_command->name,
help_command->tip);
++help_command;
}
}
-
+
printf(
- "%sPlease report bugs to <%s>%s\n",
+ "%sPlease report bugs to <%s>%s\n",
PHPDBG_BOLD_LINE(TSRMLS_C), PHPDBG_ISSUES,
PHPDBG_END_LINE(TSRMLS_C));
return SUCCESS;
@@ -545,13 +557,13 @@ static PHPDBG_COMMAND(list) /* {{{ */
zend_function* fbc;
const char *func_name = expr;
size_t func_name_len = expr_len;
-
+
/* search active scope if begins with period */
if (func_name[0] == '.') {
if (EG(scope)) {
func_name++;
func_name_len--;
-
+
func_table = &EG(scope)->function_table;
} else {
printf(
@@ -567,13 +579,13 @@ static PHPDBG_COMMAND(list) /* {{{ */
} else {
func_table = EG(function_table);
}
-
+
if (zend_hash_find(func_table, func_name, func_name_len,
(void**)&fbc) == SUCCESS) {
phpdbg_list_function(fbc TSRMLS_CC);
} else {
printf(
- "%sFunction %s not found%s\n",
+ "%sFunction %s not found%s\n",
PHPDBG_RED_LINE(TSRMLS_C), func_name,
PHPDBG_END_LINE(TSRMLS_C));
}
}
@@ -623,13 +635,13 @@ int phpdbg_do_cmd(const phpdbg_command_t *command, char
*cmd_line, size_t cmd_le
int phpdbg_interactive(TSRMLS_D) /* {{{ */
{
size_t cmd_len;
-
+
#ifndef HAVE_LIBREADLINE
char cmd[PHPDBG_MAX_CMD];
-
+
phpdbg_interactive_enter:
printf(PHPDBG_PROMPT_LINE(TSRMLS_C));
-
+
while (!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING) &&
fgets(cmd, PHPDBG_MAX_CMD, stdin) != NULL) {
cmd_len = strlen(cmd) - 1;
@@ -639,14 +651,14 @@ phpdbg_interactive_enter:
phpdbg_interactive_enter:
while (!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING)) {
cmd = readline(PHPDBG_PROMPT_LINE(TSRMLS_C));
-
+
cmd_len = strlen(cmd);
#endif
/* trim space from end of input */
while (isspace(cmd[cmd_len-1]))
cmd_len--;
-
+
/* ensure string is null terminated */
cmd[cmd_len] = '\0';
@@ -659,7 +671,7 @@ phpdbg_interactive_enter:
case FAILURE:
if (!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING)) {
printf(
- "%sFailed to execute %s !%s\n",
+ "%sFailed to execute %s !%s\n",
PHPDBG_RED_LINE(TSRMLS_C), cmd,
PHPDBG_END_LINE(TSRMLS_C));
}
break;
@@ -689,17 +701,17 @@ phpdbg_interactive_enter:
void phpdbg_print_opline(zend_execute_data *execute_data, zend_bool
ignore_flags TSRMLS_DC) /* {{{ */
{
/* force out a line while stepping so the user knows what is happening */
- if (ignore_flags ||
- (!(PHPDBG_G(flags) & PHPDBG_IS_QUIET) ||
+ if (ignore_flags ||
+ (!(PHPDBG_G(flags) & PHPDBG_IS_QUIET) ||
(PHPDBG_G(flags) & PHPDBG_IS_STEPPING))) {
-
+
zend_op *opline = execute_data->opline;
printf(
- "%sOPLINE: %p:%s%s\n",
+ "%sOPLINE: %p:%s%s\n",
PHPDBG_BOLD_LINE(TSRMLS_C),
- opline,
- phpdbg_decode_opcode(opline->opcode),
+ opline,
+ phpdbg_decode_opcode(opline->opcode),
PHPDBG_END_LINE(TSRMLS_C));
}
} /* }}} */
@@ -707,7 +719,7 @@ void phpdbg_print_opline(zend_execute_data *execute_data,
zend_bool ignore_flags
void phpdbg_clean(zend_bool full TSRMLS_DC) /* {{{ */
{
zend_objects_store_call_destructors(&EG(objects_store) TSRMLS_CC);
-
+
/* this is implicitly required */
if (PHPDBG_G(ops)) {
destroy_op_array(
diff --git a/phpdbg_utils.c b/phpdbg_utils.c
index e3408ed..9e39010 100644
--- a/phpdbg_utils.c
+++ b/phpdbg_utils.c
@@ -41,3 +41,8 @@ int phpdbg_is_empty(const char *str) /* {{{ */
}
return 1;
} /* }}} */
+
+int phpdbg_is_addr(const char *str) /* {{{ */
+{
+ return str[0] && str[1] && memcmp(str, "0x", 2) == 0;
+} /* }}} */
diff --git a/phpdbg_utils.h b/phpdbg_utils.h
index 3cb430f..464a0c7 100644
--- a/phpdbg_utils.h
+++ b/phpdbg_utils.h
@@ -22,5 +22,6 @@
int phpdbg_is_numeric(const char*);
int phpdbg_is_empty(const char*);
+int phpdbg_is_addr(const char*);
#endif /* PHPDBG_UTILS_H */
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php