GNU bug report logs - #65612
gdb-mi non-stop mode can not set breakpoints when `gud-running' is t

Previous Next

Package: emacs;

Reported by: Diancheng Wang <diancheng_wang <at> 163.com>

Date: Wed, 30 Aug 2023 07:19:04 UTC

Severity: normal

Done: Eli Zaretskii <eliz <at> gnu.org>

Bug is archived. No further changes may be made.

To add a comment to this bug, you must first unarchive it, by sending
a message to control AT debbugs.gnu.org, with unarchive 65612 in the body.
You can then email your comments to 65612 AT debbugs.gnu.org in the normal way.

Toggle the display of automated, internal messages from the tracker.

View this report as an mbox folder, status mbox, maintainer mbox


Report forwarded to bug-gnu-emacs <at> gnu.org:
bug#65612; Package emacs. (Wed, 30 Aug 2023 07:19:04 GMT) Full text and rfc822 format available.

Acknowledgement sent to Diancheng Wang <diancheng_wang <at> 163.com>:
New bug report received and forwarded. Copy sent to bug-gnu-emacs <at> gnu.org. (Wed, 30 Aug 2023 07:19:05 GMT) Full text and rfc822 format available.

Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):

From: Diancheng Wang <diancheng_wang <at> 163.com>
To: bug-gnu-emacs <at> gnu.org
Subject: gdb-mi non-stop mode can not set breakpoints when `gud-running' is t
Date: Wed, 30 Aug 2023 10:15:01 +0800
[Message part 1 (text/plain, inline)]
Hi,

When gdb-mi is running in non-stop mode (both `gud-running' and
`gdb-non-stop' are t), it can not set breakpoints using `gud-break'
function. But at the same situation, we can set breakpoints using gdb
CLI commands in gdb interactive buffer.

Attached patch fixed this bug. The patch introduces a gud new variable:
`gud-async-running'.  The marco `gud-def' still sends command to gdb if
`gud-async-running' is t even `gud-running' is t.

[0001-gdb-mi.el-Enable-to-set-breakpoints-even-all-threads.patch (text/x-diff, inline)]
From 717ab9c933308a1222844c0b4cca5c4c93f7ff4a Mon Sep 17 00:00:00 2001
From: Diancheng Wang <diancheng <at> gmail.com>
Date: Wed, 9 Aug 2023 10:35:12 +0800
Subject: [PATCH] gdb-mi.el: Enable to set breakpoints even all threads of
 debugee are running.

---
 lisp/progmodes/gdb-mi.el | 17 ++++++++++-------
 lisp/progmodes/gud.el    | 22 ++++++++++++++--------
 2 files changed, 24 insertions(+), 15 deletions(-)

diff --git a/lisp/progmodes/gdb-mi.el b/lisp/progmodes/gdb-mi.el
index a1091de43e9..58629773974 100644
--- a/lisp/progmodes/gdb-mi.el
+++ b/lisp/progmodes/gdb-mi.el
@@ -928,7 +928,7 @@ gdb
           (setq-local comint-input-ring-file-name hfile))
       (comint-read-input-ring t)))
   (gud-def gud-tbreak "tbreak %f:%l" "\C-t"
-	   "Set temporary breakpoint at current line.")
+	   "Set temporary breakpoint at current line." t)
   (gud-def gud-jump
 	   (progn (gud-call "tbreak %f:%l" arg) (gud-call "jump %f:%l"))
 	   "\C-j" "Set execution address to current line.")
@@ -959,7 +959,7 @@ gdb
 	   "Finish executing current function.")
   (gud-def gud-run    "-exec-run"
            nil
-           "Run the program.")
+           "Run the program." t)
 
   (gud-def gud-break (if (not (string-match "Disassembly" mode-name))
 			 (gud-call "break %f:%l" arg)
@@ -967,7 +967,7 @@ gdb
 			 (beginning-of-line)
 			 (forward-char 2)
 			 (gud-call "break *%a" arg)))
-	   "\C-b" "Set breakpoint at current line or address.")
+	   "\C-b" "Set breakpoint at current line or address." t)
 
   (gud-def gud-remove (if (not (string-match "Disassembly" mode-name))
 			  (gud-call "clear %f:%l" arg)
@@ -975,7 +975,7 @@ gdb
 			  (beginning-of-line)
 			  (forward-char 2)
 			  (gud-call "clear *%a" arg)))
-	   "\C-d" "Remove breakpoint at current line or address.")
+	   "\C-d" "Remove breakpoint at current line or address." t)
 
   ;; -exec-until doesn't support --all yet
   (gud-def gud-until  (if (not (string-match "Disassembly" mode-name))
@@ -1044,6 +1044,7 @@ gdb
 
   (setq gdb-first-prompt t)
   (setq gud-running nil)
+  (setq gud-async-running nil)
 
   (gdb-update)
 
@@ -2671,9 +2672,11 @@ gdb-starting
   ;; Set `gdb-non-stop' when `gdb-last-command' is a CLI background
   ;; running command e.g. "run &", attach &" or a MI command
   ;; e.g. "-exec-run" or "-exec-attach".
-  (when (or (string-match "&\s*$" gdb-last-command)
-            (string-match "^-" gdb-last-command))
-    (gdb-try-check-target-async-support))
+  (if (or (string-match "&\s*$" gdb-last-command)
+          (string-match "^-" gdb-last-command))
+      (progn (gdb-try-check-target-async-support)
+             (setq gud-async-running t))
+    (setq gud-async-running nil))
 
   (gdb-force-mode-line-update
    (propertize gdb-inferior-status 'face font-lock-type-face))
diff --git a/lisp/progmodes/gud.el b/lisp/progmodes/gud.el
index 09860a4cbde..3cc63aab84f 100644
--- a/lisp/progmodes/gud.el
+++ b/lisp/progmodes/gud.el
@@ -128,6 +128,10 @@ gud-running
   "Non-nil if debugged program is running.
 Used to gray out relevant toolbar icons.")
 
+(defvar gud-async-running nil
+  "Non-nil if debugged program is running in async mode.
+Check it when `gud-running' is t")
+
 (defvar gud-target-name "--unknown--"
   "The apparent name of the program being debugged in a gud buffer.")
 
@@ -261,13 +265,13 @@ gud-menu-map
      :visible (memq gud-minor-mode
 		    '(gdbmi gdb guiler dbx xdb jdb pdb))]
     ["Set Breakpoint" gud-break
-     :enable (not gud-running)
+     :enable (or (not gud-running) gud-async-running)
      :visible (gud-tool-bar-item-visible-no-fringe)]
     ["Temporary Breakpoint" gud-tbreak
-     :enable (not gud-running)
+     :enable (or (not gud-running) gud-async-running)
      :visible (memq gud-minor-mode '(gdbmi gdb sdb xdb))]
     ["Remove Breakpoint" gud-remove
-     :enable (not gud-running)
+     :enable (or (not gud-running) gud-async-running)
      :visible (gud-tool-bar-item-visible-no-fringe)]
     ["Continue to selection" gud-until
      :enable (not gud-running)
@@ -283,7 +287,7 @@ gud-menu-map
      :visible (and (eq gud-minor-mode 'gdbmi)
                    (gdb-show-run-p))]
     ["Run" gud-run
-     :enable (not gud-running)
+     :enable (or (not gud-running) gud-async-running)
      :visible (or (memq gud-minor-mode '(gdb dbx jdb))
 		  (and (eq gud-minor-mode 'gdbmi)
 		       (or (not (gdb-show-run-p))
@@ -403,13 +407,15 @@ gud-find-file
 ;; Of course you may use `gud-def' with any other debugger command, including
 ;; user defined ones.
 
-;; A macro call like (gud-def FUNC CMD KEY DOC) expands to a form
+;; A macro call like (gud-def FUNC CMD KEY DOC ASYNC-OK) expands to a form
 ;; which defines FUNC to send the command CMD to the debugger, gives
 ;; it the docstring DOC, and binds that function to KEY in the GUD
-;; major mode.  The function is also bound in the global keymap with the
+;; major mode. The FUNC still sends CMD when both ASYNC-OK and
+;; `gud-async-running' are t even `gud-running' is t.
+;; The function is also bound in the global keymap with the
 ;; GUD prefix.
 
-(defmacro gud-def (func cmd key &optional doc)
+(defmacro gud-def (func cmd key &optional doc async-ok)
   "Define FUNC to be a command sending CMD and bound to KEY, with
 optional doc string DOC.  Certain %-escapes in the string arguments
 are interpreted specially if present.  These are:
@@ -434,7 +440,7 @@ gud-def
      (defalias ',func (lambda (arg)
        ,@(if doc (list doc))
        (interactive "p")
-       (if (not gud-running)
+       (if (or (not gud-running) (and ,async-ok gud-async-running))
 	 ,(if (stringp cmd)
 	      `(gud-call ,cmd arg)
 	    ;; Unused lexical warning if cmd does not use "arg".
-- 
2.27.0


Reply sent to Eli Zaretskii <eliz <at> gnu.org>:
You have taken responsibility. (Thu, 31 Aug 2023 10:14:02 GMT) Full text and rfc822 format available.

Notification sent to Diancheng Wang <diancheng_wang <at> 163.com>:
bug acknowledged by developer. (Thu, 31 Aug 2023 10:14:02 GMT) Full text and rfc822 format available.

Message #10 received at 65612-done <at> debbugs.gnu.org (full text, mbox):

From: Eli Zaretskii <eliz <at> gnu.org>
To: Diancheng Wang <diancheng_wang <at> 163.com>
Cc: 65612-done <at> debbugs.gnu.org
Subject: Re: bug#65612: gdb-mi non-stop mode can not set breakpoints when
 `gud-running' is t
Date: Thu, 31 Aug 2023 13:13:11 +0300
> From: Diancheng Wang <diancheng_wang <at> 163.com>
> Date: Wed, 30 Aug 2023 10:15:01 +0800
> 
> When gdb-mi is running in non-stop mode (both `gud-running' and
> `gdb-non-stop' are t), it can not set breakpoints using `gud-break'
> function. But at the same situation, we can set breakpoints using gdb
> CLI commands in gdb interactive buffer.
> 
> Attached patch fixed this bug. The patch introduces a gud new variable:
> `gud-async-running'.  The marco `gud-def' still sends command to gdb if
> `gud-async-running' is t even `gud-running' is t.

Thanks, installed on the master branch and closing the bug.




bug archived. Request was from Debbugs Internal Request <help-debbugs <at> gnu.org> to internal_control <at> debbugs.gnu.org. (Thu, 28 Sep 2023 11:24:06 GMT) Full text and rfc822 format available.

This bug report was last modified 1 year and 225 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.