From 18283d22c0e7cacbd46b49b9a0f1a6fd382817c1 Mon Sep 17 00:00:00 2001 From: Akos Kiss Date: Wed, 21 Jun 2017 15:30:28 +0200 Subject: [PATCH] Make debugger port runtime configurable Convert debug server port from a compile-time constant to a context variable. This enables each engine instance (either running in the same process or in different processes) to listen for connections at different ports, i.e., multiple engines can be debugged at the same time on the same machine. JerryScript-DCO-1.0-Signed-off-by: Akos Kiss akiss@inf.u-szeged.hu --- jerry-core/CMakeLists.txt | 3 -- jerry-core/api/jerry-debugger.c | 28 +++++++++++++++++++ jerry-core/api/jerry.c | 18 +----------- jerry-core/debugger/debugger-ws.c | 11 +------- jerry-core/ecma/base/ecma-globals.h | 1 - jerry-core/include/jerryscript-core.h | 2 +- jerry-core/include/jerryscript-debugger.h | 3 ++ jerry-core/jcontext/jcontext.h | 1 + jerry-main/main-unix.c | 25 ++++++++++++++++- tests/debugger/do_backtrace.expected | 1 - tests/debugger/do_break.expected | 1 - tests/debugger/do_delete.expected | 1 - tests/debugger/do_delete_all.expected | 1 - tests/debugger/do_display.expected | 1 - tests/debugger/do_eval.expected | 1 - tests/debugger/do_eval_syntax.expected | 1 - tests/debugger/do_next.expected | 1 - .../debugger/do_pending_breakpoints.expected | 1 - tests/debugger/do_src.expected | 1 - tests/debugger/do_step.expected | 1 - tools/build.py | 3 -- 21 files changed, 59 insertions(+), 47 deletions(-) diff --git a/jerry-core/CMakeLists.txt b/jerry-core/CMakeLists.txt index 1670e80ff..8294148c2 100644 --- a/jerry-core/CMakeLists.txt +++ b/jerry-core/CMakeLists.txt @@ -19,7 +19,6 @@ project (${JERRY_CORE_NAME} C) # Optional features set(FEATURE_CPOINTER_32_BIT OFF CACHE BOOL "Enable 32 bit compressed pointers?") set(FEATURE_DEBUGGER OFF CACHE BOOL "Enable JerryScript debugger?") -set(FEATURE_DEBUGGER_PORT "5001" CACHE STRING "Set debugger port number (default: 5001)") set(FEATURE_ERROR_MESSAGES OFF CACHE BOOL "Enable error messages?") set(FEATURE_EXTERNAL_CONTEXT OFF CACHE BOOL "Enable external context?") set(FEATURE_JS_PARSER ON CACHE BOOL "Enable js-parser?") @@ -54,7 +53,6 @@ endif() # Status messages message(STATUS "FEATURE_CPOINTER_32_BIT " ${FEATURE_CPOINTER_32_BIT} ${FEATURE_CPOINTER_32_BIT_MESSAGE}) message(STATUS "FEATURE_DEBUGGER " ${FEATURE_DEBUGGER}) -message(STATUS "FEATURE_DEBUGGER_PORT " ${FEATURE_DEBUGGER_PORT}) message(STATUS "FEATURE_ERROR_MESSAGES " ${FEATURE_ERROR_MESSAGES}) message(STATUS "FEATURE_EXTERNAL_CONTEXT " ${FEATURE_EXTERNAL_CONTEXT}) message(STATUS "FEATURE_JS_PARSER " ${FEATURE_JS_PARSER}) @@ -192,7 +190,6 @@ if(FEATURE_DEBUGGER) endif() set(DEFINES_JERRY ${DEFINES_JERRY} JERRY_DEBUGGER) - set(DEFINES_JERRY ${DEFINES_JERRY} JERRY_DEBUGGER_PORT=${FEATURE_DEBUGGER_PORT}) endif() # Memory management stress-test mode diff --git a/jerry-core/api/jerry-debugger.c b/jerry-core/api/jerry-debugger.c index dfc92f288..0338c3c06 100644 --- a/jerry-core/api/jerry-debugger.c +++ b/jerry-core/api/jerry-debugger.c @@ -88,3 +88,31 @@ jerry_debugger_stop_at_breakpoint (bool enable_stop_at_breakpoint) /**< enable/d JERRY_UNUSED (enable_stop_at_breakpoint); #endif /* JERRY_DEBUGGER */ } /* jerry_debugger_stop_at_breakpoint */ + +/** + * Debugger server initialization. Must be called after jerry_init. + */ +void +jerry_debugger_init (uint16_t port) /**< server port number */ +{ +#ifdef JERRY_DEBUGGER + JERRY_CONTEXT (debugger_port) = port; + jerry_debugger_accept_connection (); +#else /* !JERRY_DEBUGGER */ + JERRY_UNUSED (port); +#endif /* JERRY_DEBUGGER */ +} /* jerry_debugger_init */ + +/** + * Debugger server shutdown. Must be called before jerry_cleanup. + */ +void +jerry_debugger_cleanup (void) +{ +#ifdef JERRY_DEBUGGER + if (JERRY_CONTEXT (debugger_flags) & JERRY_DEBUGGER_CONNECTED) + { + jerry_debugger_close_connection (); + } +#endif /* JERRY_DEBUGGER */ +} /* jerry_debugger_cleanup */ diff --git a/jerry-core/api/jerry.c b/jerry-core/api/jerry.c index 90d975e79..cccfc23cb 100644 --- a/jerry-core/api/jerry.c +++ b/jerry-core/api/jerry.c @@ -51,8 +51,7 @@ JERRY_STATIC_ASSERT ((int) ECMA_ERROR_COMMON == (int) JERRY_ERROR_COMMON JERRY_STATIC_ASSERT ((int) ECMA_INIT_EMPTY == (int) JERRY_INIT_EMPTY && (int) ECMA_INIT_SHOW_OPCODES == (int) JERRY_INIT_SHOW_OPCODES && (int) ECMA_INIT_SHOW_REGEXP_OPCODES == (int) JERRY_INIT_SHOW_REGEXP_OPCODES - && (int) ECMA_INIT_MEM_STATS == (int) JERRY_INIT_MEM_STATS - && (int) ECMA_INIT_DEBUGGER == (int) JERRY_INIT_DEBUGGER, + && (int) ECMA_INIT_MEM_STATS == (int) JERRY_INIT_MEM_STATS, ecma_init_flag_t_must_be_equal_to_jerry_init_flag_t); #ifndef JERRY_JS_PARSER @@ -157,13 +156,6 @@ jerry_init (jerry_init_flag_t flags) /**< combination of Jerry flags */ jmem_init (); ecma_init (); - -#ifdef JERRY_DEBUGGER - if (flags & JERRY_INIT_DEBUGGER) - { - jerry_debugger_accept_connection (); - } -#endif /* JERRY_DEBUGGER */ } /* jerry_init */ /** @@ -184,14 +176,6 @@ jerry_cleanup (void) } ecma_finalize (); - -#ifdef JERRY_DEBUGGER - if (JERRY_CONTEXT (debugger_flags) & JERRY_DEBUGGER_CONNECTED) - { - jerry_debugger_close_connection (); - } -#endif /* JERRY_DEBUGGER */ - jmem_finalize (); jerry_make_api_unavailable (); } /* jerry_cleanup */ diff --git a/jerry-core/debugger/debugger-ws.c b/jerry-core/debugger/debugger-ws.c index f9a2f3c64..3b2255f13 100644 --- a/jerry-core/debugger/debugger-ws.c +++ b/jerry-core/debugger/debugger-ws.c @@ -24,13 +24,6 @@ #include #include -/** - * Debugger socket communication port. - */ -#ifndef JERRY_DEBUGGER_PORT -#define JERRY_DEBUGGER_PORT 5001 -#endif - /** * Masking-key is available. */ @@ -314,10 +307,8 @@ jerry_debugger_accept_connection (void) struct sockaddr_in addr; socklen_t sin_size = sizeof (struct sockaddr_in); - JERRY_ASSERT (JERRY_CONTEXT (jerry_init_flags) & ECMA_INIT_DEBUGGER); - addr.sin_family = AF_INET; - addr.sin_port = htons (JERRY_DEBUGGER_PORT); + addr.sin_port = htons (JERRY_CONTEXT (debugger_port)); addr.sin_addr.s_addr = INADDR_ANY; if ((server_socket = socket (AF_INET, SOCK_STREAM, 0)) == -1) diff --git a/jerry-core/ecma/base/ecma-globals.h b/jerry-core/ecma/base/ecma-globals.h index 65bb0c29b..83ac92ec2 100644 --- a/jerry-core/ecma/base/ecma-globals.h +++ b/jerry-core/ecma/base/ecma-globals.h @@ -62,7 +62,6 @@ typedef enum ECMA_INIT_SHOW_OPCODES = (1u << 0), /**< dump byte-code to log after parse */ ECMA_INIT_SHOW_REGEXP_OPCODES = (1u << 1), /**< dump regexp byte-code to log after compilation */ ECMA_INIT_MEM_STATS = (1u << 2), /**< dump memory statistics */ - ECMA_INIT_DEBUGGER = (1u << 4), /**< enable all features required by debugging */ } ecma_init_flag_t; /** diff --git a/jerry-core/include/jerryscript-core.h b/jerry-core/include/jerryscript-core.h index 187a38c01..b70768a29 100644 --- a/jerry-core/include/jerryscript-core.h +++ b/jerry-core/include/jerryscript-core.h @@ -56,7 +56,7 @@ typedef enum JERRY_INIT_SHOW_REGEXP_OPCODES = (1u << 1), /**< dump regexp byte-code to log after compilation */ JERRY_INIT_MEM_STATS = (1u << 2), /**< dump memory statistics */ JERRY_INIT_MEM_STATS_SEPARATE = (1u << 3), /**< deprecated, an unused placeholder now */ - JERRY_INIT_DEBUGGER = (1u << 4), /**< enable all features required by debugging */ + JERRY_INIT_DEBUGGER = (1u << 4), /**< deprecated, an unused placeholder now */ } jerry_init_flag_t; /** diff --git a/jerry-core/include/jerryscript-debugger.h b/jerry-core/include/jerryscript-debugger.h index 4fb99b0ba..d1b0a3765 100644 --- a/jerry-core/include/jerryscript-debugger.h +++ b/jerry-core/include/jerryscript-debugger.h @@ -35,6 +35,9 @@ void jerry_debugger_stop (void); void jerry_debugger_continue (void); void jerry_debugger_stop_at_breakpoint (bool enable_stop_at_breakpoint); +void jerry_debugger_init (uint16_t port); +void jerry_debugger_cleanup (void); + /** * @} */ diff --git a/jerry-core/jcontext/jcontext.h b/jerry-core/jcontext/jcontext.h index 5cbdba8c6..82183978d 100644 --- a/jerry-core/jcontext/jcontext.h +++ b/jerry-core/jcontext/jcontext.h @@ -121,6 +121,7 @@ typedef struct uint8_t debugger_message_delay; /**< call receive message when reaches zero */ uint16_t debugger_receive_buffer_offset; /**< receive buffer offset */ int debugger_connection; /**< holds the file descriptor of the socket communication */ + uint16_t debugger_port; /**< debugger socket communication port */ #endif /* JERRY_DEBUGGER */ #ifdef JMEM_STATS diff --git a/jerry-main/main-unix.c b/jerry-main/main-unix.c index d8fb2bf02..408807f25 100644 --- a/jerry-main/main-unix.c +++ b/jerry-main/main-unix.c @@ -279,6 +279,7 @@ typedef enum OPT_SHOW_OP, OPT_SHOW_RE_OP, OPT_DEBUG_SERVER, + OPT_DEBUG_PORT, OPT_SAVE_SNAP_GLOBAL, OPT_SAVE_SNAP_EVAL, OPT_SAVE_LIT_LIST, @@ -308,6 +309,8 @@ static const cli_opt_t main_opts[] = .help = "dump regexp byte-code"), CLI_OPT_DEF (.id = OPT_DEBUG_SERVER, .longopt = "start-debug-server", .help = "start debug server and wait for a connecting client"), + CLI_OPT_DEF (.id = OPT_DEBUG_PORT, .longopt = "debug-port", .meta = "NUM", + .help = "debug server port (default: 5001)"), CLI_OPT_DEF (.id = OPT_SAVE_SNAP_GLOBAL, .longopt = "save-snapshot-for-global", .meta = "FILE", .help = "save binary snapshot of parsed JS input (for execution in global context)"), CLI_OPT_DEF (.id = OPT_SAVE_SNAP_EVAL, .longopt = "save-snapshot-for-eval", .meta = "FILE", @@ -399,6 +402,9 @@ main (int argc, bool is_save_literals_mode_in_c_format_or_list = false; const char *save_literals_file_name_p = NULL; + bool start_debug_server = false; + uint16_t debug_port = 5001; + bool is_repl_mode = false; bool no_prompt = false; @@ -453,7 +459,15 @@ main (int argc, { if (check_feature (JERRY_FEATURE_DEBUGGER, cli_state.arg)) { - flags |= JERRY_INIT_DEBUGGER; + start_debug_server = true; + } + break; + } + case OPT_DEBUG_PORT: + { + if (check_feature (JERRY_FEATURE_DEBUGGER, cli_state.arg)) + { + debug_port = (uint16_t) cli_consume_int (&cli_state); } break; } @@ -567,6 +581,10 @@ main (int argc, #endif /* JERRY_ENABLE_EXTERNAL_CONTEXT */ jerry_init (flags); + if (start_debug_server) + { + jerry_debugger_init (debug_port); + } register_js_function ("assert", jerryx_handler_assert); register_js_function ("gc", jerryx_handler_gc); @@ -769,6 +787,11 @@ main (int argc, } } jerry_release_value (ret_value); + + if (start_debug_server) + { + jerry_debugger_cleanup (); + } jerry_cleanup (); #ifdef JERRY_ENABLE_EXTERNAL_CONTEXT free (instance_p); diff --git a/tests/debugger/do_backtrace.expected b/tests/debugger/do_backtrace.expected index 8650c197b..d5810f322 100644 --- a/tests/debugger/do_backtrace.expected +++ b/tests/debugger/do_backtrace.expected @@ -28,4 +28,3 @@ Frame 1: tests/debugger/do_backtrace.js:25 (in foo() at line:21, col:1) Frame 2: tests/debugger/do_backtrace.js:33 (in test() at line:30, col:1) Frame 3: tests/debugger/do_backtrace.js:40 (jerry-debugger) c -Connection closed. diff --git a/tests/debugger/do_break.expected b/tests/debugger/do_break.expected index 140cebd3c..c78624599 100644 --- a/tests/debugger/do_break.expected +++ b/tests/debugger/do_break.expected @@ -24,4 +24,3 @@ Stopped at breakpoint:2 tests/debugger/do_break.js:36 (in test() at line:20, col (jerry-debugger) continue Stopped at breakpoint:3 tests/debugger/do_break.js:33 (in f() at line:31, col:3) (jerry-debugger) c -Connection closed. diff --git a/tests/debugger/do_delete.expected b/tests/debugger/do_delete.expected index 786b63fbd..261bcb6c2 100644 --- a/tests/debugger/do_delete.expected +++ b/tests/debugger/do_delete.expected @@ -19,4 +19,3 @@ Breakpoint 3 at tests/debugger/do_delete.js:18 (jerry-debugger) list 1: tests/debugger/do_delete.js:17 (jerry-debugger) c -Connection closed. diff --git a/tests/debugger/do_delete_all.expected b/tests/debugger/do_delete_all.expected index 85f595fdb..e958bdba9 100644 --- a/tests/debugger/do_delete_all.expected +++ b/tests/debugger/do_delete_all.expected @@ -14,4 +14,3 @@ Breakpoint 3 at tests/debugger/do_delete_all.js:21 (in delete_test() at line:20, (jerry-debugger) next Stopped at tests/debugger/do_delete_all.js:16 (jerry-debugger) c -Connection closed. diff --git a/tests/debugger/do_display.expected b/tests/debugger/do_display.expected index 2fb9d2de9..ac5a42944 100644 --- a/tests/debugger/do_display.expected +++ b/tests/debugger/do_display.expected @@ -50,4 +50,3 @@ Source: tests/debugger/do_display.js (jerry-debugger) c Stopped at breakpoint:4 tests/debugger/do_display.js:18 (in d() at line:18, col:1) (jerry-debugger) c -Connection closed. diff --git a/tests/debugger/do_eval.expected b/tests/debugger/do_eval.expected index ce91e84c7..496b7c859 100644 --- a/tests/debugger/do_eval.expected +++ b/tests/debugger/do_eval.expected @@ -25,4 +25,3 @@ Stopped at tests/debugger/do_eval.js:24 (jerry-debugger) e a 11.3 (jerry-debugger) c -Connection closed. diff --git a/tests/debugger/do_eval_syntax.expected b/tests/debugger/do_eval_syntax.expected index ed90be167..d944d68e9 100644 --- a/tests/debugger/do_eval_syntax.expected +++ b/tests/debugger/do_eval_syntax.expected @@ -5,4 +5,3 @@ Stopped at tests/debugger/do_eval_syntax.js:26 (jerry-debugger) eval loop Uncaught exception: Error (jerry-debugger) c -Connection closed. diff --git a/tests/debugger/do_next.expected b/tests/debugger/do_next.expected index 71c93d8c3..4a87f1120 100644 --- a/tests/debugger/do_next.expected +++ b/tests/debugger/do_next.expected @@ -5,4 +5,3 @@ Stopped at tests/debugger/do_next.js:17 (jerry-debugger) next Stopped at tests/debugger/do_next.js:18 (jerry-debugger) c -Connection closed. diff --git a/tests/debugger/do_pending_breakpoints.expected b/tests/debugger/do_pending_breakpoints.expected index a8688502a..76418ff1d 100644 --- a/tests/debugger/do_pending_breakpoints.expected +++ b/tests/debugger/do_pending_breakpoints.expected @@ -13,4 +13,3 @@ Stopped at tests/debugger/do_pending_breakpoints.js:19 (jerry-debugger) c Stopped at breakpoint:1 :1 (in f() at line:1, col:1) (jerry-debugger) c -Connection closed. diff --git a/tests/debugger/do_src.expected b/tests/debugger/do_src.expected index 7e7a417f5..a80f4ba47 100644 --- a/tests/debugger/do_src.expected +++ b/tests/debugger/do_src.expected @@ -16,4 +16,3 @@ Stopped at tests/debugger/do_src.js:21 Stopped at :2 (in f() at line:1, col:5) (jerry-debugger) src (jerry-debugger) c -Connection closed. diff --git a/tests/debugger/do_step.expected b/tests/debugger/do_step.expected index c7acf5759..2945d6346 100644 --- a/tests/debugger/do_step.expected +++ b/tests/debugger/do_step.expected @@ -23,4 +23,3 @@ Stopped at tests/debugger/do_step.js:29 (in f2() at line:26, col:1) Frame 0: tests/debugger/do_step.js:29 (in f2() at line:26, col:1) Frame 1: tests/debugger/do_step.js:33 (jerry-debugger) c -Connection closed. diff --git a/tools/build.py b/tools/build.py index 2338f1995..16a8de665 100755 --- a/tools/build.py +++ b/tools/build.py @@ -74,8 +74,6 @@ def get_arguments(): help='build minimal version of the jerry command line tool (%(choices)s; default: %(default)s)') parser.add_argument('--jerry-debugger', metavar='X', choices=['ON', 'OFF'], default='OFF', type=str.upper, help='enable the jerry debugger (%(choices)s; default: %(default)s)') - parser.add_argument('--jerry-debugger-port', metavar='N', action='store', type=int, default=5001, - help='add custom port number (default: %(default)s)') parser.add_argument('--jerry-ext', metavar='X', choices=['ON', 'OFF'], default='ON', type=str.upper, help='build jerry-ext (default: %(default)s)') parser.add_argument('--jerry-libc', metavar='X', choices=['ON', 'OFF'], default='ON', type=str.upper, @@ -162,7 +160,6 @@ def generate_build_options(arguments): build_options.append('-DFEATURE_PROFILE=%s' % arguments.profile) build_options.append('-DFEATURE_DEBUGGER=%s' % arguments.jerry_debugger) - build_options.append('-DFEATURE_DEBUGGER_PORT=%d' % arguments.jerry_debugger_port) build_options.append('-DFEATURE_EXTERNAL_CONTEXT=%s' % arguments.external_context) build_options.append('-DFEATURE_SNAPSHOT_EXEC=%s' % arguments.snapshot_exec) build_options.append('-DFEATURE_SNAPSHOT_SAVE=%s' % arguments.snapshot_save)