From 90897171e47a57eba4b3ac13828f2544f5a6be03 Mon Sep 17 00:00:00 2001 From: Charlie-83 <11279546+Charlie-83@users.noreply.github.com> Date: Fri, 10 Jan 2025 19:35:44 +0000 Subject: [PATCH 1/3] Don't jump to source after commands that don't progress the program --- lua/nvimgdb/backend/gdb.lua | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/lua/nvimgdb/backend/gdb.lua b/lua/nvimgdb/backend/gdb.lua index 628a953..ddc2411 100644 --- a/lua/nvimgdb/backend/gdb.lua +++ b/lua/nvimgdb/backend/gdb.lua @@ -29,6 +29,9 @@ function C.create_parser(actions, proxy) local self = setmetatable({}, P) self:_init(actions) + P.prev_fname = nil + P.prev_line = nil + function P:query_paused() log.debug({"P:query_paused"}) coroutine.resume(coroutine.create(function() @@ -40,7 +43,11 @@ function C.create_parser(actions, proxy) if #location == 2 then local fname = location[1] local line = location[2] - self.actions:jump_to_source(fname, line) + if (fname ~= self.prev_fname or line ~= self.prev_line) then + self.prev_line = line + self.prev_fname = fname + self.actions:jump_to_source(fname, line) + end end end self.actions:query_breakpoints() From d45ec71734bacce133d4074e428a6dfd02a64db5 Mon Sep 17 00:00:00 2001 From: Charlie-83 <11279546+Charlie-83@users.noreply.github.com> Date: Thu, 16 Jan 2025 09:47:13 +0000 Subject: [PATCH 2/3] Reset prev_fname and prev_line after program is restarted --- lib/gdb_commands.py | 15 ++++++++++++++- lua/nvimgdb/backend/gdb.lua | 3 ++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/lib/gdb_commands.py b/lib/gdb_commands.py index f4cfee7..fcf69c2 100644 --- a/lib/gdb_commands.py +++ b/lib/gdb_commands.py @@ -29,14 +29,18 @@ def __init__(self): self.thrd = None self.fallback_to_parsing = False self.state = "stopped" + self.exited = False def handle_continue(event): self.state = "running" gdb.events.cont.connect(handle_continue) def handle_stop(event): self.state = "stopped" + def handle_exit(event): + self.state = "stopped" + self.exited = True gdb.events.stop.connect(handle_stop) - gdb.events.exited.connect(handle_stop) + gdb.events.exited.connect(handle_exit) def invoke(self, arg, from_tty): if not self.thrd: @@ -84,6 +88,9 @@ def _handle_command(self, command, sock, addr): elif request == "get-current-frame-location": self._send_response(self._get_current_frame_location(), req_id, sock, addr) + elif request == "has-exited": + self._send_response(self._get_exited(), + req_id, sock, addr) elif request == "handle-command": # pylint: disable=broad-except try: @@ -119,6 +126,12 @@ def _send_response(self, response, req_id, sock, addr): def _get_process_state(self): return self.state + def _get_exited(self): + if (self.exited): + self.exited = False + return True + return False + def _get_current_frame_location(self): try: frame = gdb.selected_frame() diff --git a/lua/nvimgdb/backend/gdb.lua b/lua/nvimgdb/backend/gdb.lua index ddc2411..5cf881b 100644 --- a/lua/nvimgdb/backend/gdb.lua +++ b/lua/nvimgdb/backend/gdb.lua @@ -43,7 +43,8 @@ function C.create_parser(actions, proxy) if #location == 2 then local fname = location[1] local line = location[2] - if (fname ~= self.prev_fname or line ~= self.prev_line) then + if (fname ~= self.prev_fname or line ~= self.prev_line) or + proxy:query('has-exited') then self.prev_line = line self.prev_fname = fname self.actions:jump_to_source(fname, line) From 710e294d798652a3b85b71a8b55dd051e114f8a8 Mon Sep 17 00:00:00 2001 From: Charlie-83 <11279546+Charlie-83@users.noreply.github.com> Date: Fri, 17 Jan 2025 09:49:28 +0000 Subject: [PATCH 3/3] Also jump when code was continued then stopped in the same place --- lib/gdb_commands.py | 15 ++++++++------- lua/nvimgdb/backend/gdb.lua | 2 +- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/lib/gdb_commands.py b/lib/gdb_commands.py index fcf69c2..26aa994 100644 --- a/lib/gdb_commands.py +++ b/lib/gdb_commands.py @@ -29,16 +29,17 @@ def __init__(self): self.thrd = None self.fallback_to_parsing = False self.state = "stopped" - self.exited = False + self.exited_or_ran = False def handle_continue(event): self.state = "running" + self.exited_or_ran = True gdb.events.cont.connect(handle_continue) def handle_stop(event): self.state = "stopped" def handle_exit(event): self.state = "stopped" - self.exited = True + self.exited_or_ran = True gdb.events.stop.connect(handle_stop) gdb.events.exited.connect(handle_exit) @@ -88,8 +89,8 @@ def _handle_command(self, command, sock, addr): elif request == "get-current-frame-location": self._send_response(self._get_current_frame_location(), req_id, sock, addr) - elif request == "has-exited": - self._send_response(self._get_exited(), + elif request == "has-exited-or-ran": + self._send_response(self._get_reset_exited_or_ran(), req_id, sock, addr) elif request == "handle-command": # pylint: disable=broad-except @@ -126,9 +127,9 @@ def _send_response(self, response, req_id, sock, addr): def _get_process_state(self): return self.state - def _get_exited(self): - if (self.exited): - self.exited = False + def _get_reset_exited_or_ran(self): + if (self.exited_or_ran): + self.exited_or_ran = False return True return False diff --git a/lua/nvimgdb/backend/gdb.lua b/lua/nvimgdb/backend/gdb.lua index 5cf881b..e4a771f 100644 --- a/lua/nvimgdb/backend/gdb.lua +++ b/lua/nvimgdb/backend/gdb.lua @@ -44,7 +44,7 @@ function C.create_parser(actions, proxy) local fname = location[1] local line = location[2] if (fname ~= self.prev_fname or line ~= self.prev_line) or - proxy:query('has-exited') then + proxy:query('has-exited-or-ran') then self.prev_line = line self.prev_fname = fname self.actions:jump_to_source(fname, line)