From ce18d37bb356a347b7910028a0f599aa2e526aa6 Mon Sep 17 00:00:00 2001 From: Recolic Keghart <root@recolic.net> Date: Wed, 1 Jan 2020 18:49:09 -0800 Subject: [PATCH] Debugger adapt doc --- nemu/include/monitor/watchpoint.h | 2 +- nemu/src/monitor/debug/expr_impl/lexer.l | 3 ++- nemu/src/monitor/debug/ui.cc | 3 ++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/nemu/include/monitor/watchpoint.h b/nemu/include/monitor/watchpoint.h index 7d4c0e5..a105199 100644 --- a/nemu/include/monitor/watchpoint.h +++ b/nemu/include/monitor/watchpoint.h @@ -17,7 +17,7 @@ struct WP { bool evalulate() { auto new_value = evaluate_expr(expr); std::swap(new_value, curr_value); - return new_value != curr_value; + return new_value != curr_value && curr_value != 0; } WP(std::string e, int id) : expr(e), id(id) { evalulate(); // initial expr value. diff --git a/nemu/src/monitor/debug/expr_impl/lexer.l b/nemu/src/monitor/debug/expr_impl/lexer.l index 851781d..108a9f3 100644 --- a/nemu/src/monitor/debug/expr_impl/lexer.l +++ b/nemu/src/monitor/debug/expr_impl/lexer.l @@ -13,7 +13,7 @@ %% [ \t\n] {} -0x[0-9a-f]+ {yylval.ival = (int)strtol(yytext, NULL, 16); return T_INT;} +0[xX][0-9a-f]+ {yylval.ival = (int)strtol(yytext, NULL, 16); return T_INT;} [0-9]+ {yylval.ival = atoi(yytext); return T_INT;} "==" {return T_EQUAL;} "!=" {return T_NEQUAL;} @@ -21,6 +21,7 @@ [-+*/()] {return yytext[0];} "%"[a-z]{3} {yylval.ival = ((uint32_t)yytext[2] << 8) + yytext[3]; return T_REG;} +"$"[a-z]{3} {yylval.ival = ((uint32_t)yytext[2] << 8) + yytext[3]; return T_REG;} . {throw std::runtime_error(std::string("lexer error around token: ") + yytext);} %% // Registers: eax='a'+'x', ebx='b'+'x', ... diff --git a/nemu/src/monitor/debug/ui.cc b/nemu/src/monitor/debug/ui.cc index 7315849..2332389 100644 --- a/nemu/src/monitor/debug/ui.cc +++ b/nemu/src/monitor/debug/ui.cc @@ -70,6 +70,7 @@ static struct { { "help", "Display informations about all supported commands", cmd_help }, { "c", "Continue the execution of the program", cmd_c }, { "n", "= GDB `n`", cmd_n }, + { "si", "= GDB `n`", cmd_n }, { "info", "= GDB `info`, supporting `info r` / `info w`", cmd_info }, { "x", "x <bytes> <startAddr or expr>, dump memory content.", cmd_x }, { "w", "w <expr>, add watchpoint for $expr", cmd_w }, @@ -201,7 +202,7 @@ static int cmd_w(char *_args) { if(_args == NULL) throw std::invalid_argument("w <expr>"); - watchpoints.emplace_front(std::string(_args), ++max_watchpoint_id); + watchpoints.emplace_front(std::string(_args), max_watchpoint_id++); auto iter = watchpoints.begin(); // not thread-safe. rlib::println("Add watchpoint:", *iter); return 0; -- GitLab