emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master a180f700cbf: Enable gdb-mi to set breakpoints when threads of deb


From: Eli Zaretskii
Subject: master a180f700cbf: Enable gdb-mi to set breakpoints when threads of debuggee are running
Date: Thu, 31 Aug 2023 06:12:56 -0400 (EDT)

branch: master
commit a180f700cbf1f15a17f9d3d33338368a99a7665b
Author: Diancheng Wang <diancheng@gmail.com>
Commit: Eli Zaretskii <eliz@gnu.org>

    Enable gdb-mi to set breakpoints when threads of debuggee are running
    
    * lisp/progmodes/gdb-mi.el (gdb): Call 'gud-def' with 5th arg
    non-nil for those commands that can be invoked asynchronously.
    (gdb-starting): Set 'gud-async-running' non-nil for async commands.
    * lisp/progmodes/gud.el (gud-async-running): New defvar.
    (gud-menu-map): Enable some commands only if 'gud-async-running' is
    non-nil.
    (gud-def): Accept another optional argument ASYNC-OK.  (Bug#65612)
---
 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 @@ detailed description of this mode.
           (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 @@ detailed description of this mode.
           "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 @@ detailed description of this mode.
                         (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 @@ detailed description of this mode.
                          (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 @@ detailed description of this mode.
 
   (setq gdb-first-prompt t)
   (setq gud-running nil)
+  (setq gud-async-running nil)
 
   (gdb-update)
 
@@ -2671,9 +2672,11 @@ Sets `gdb-thread-number' to new id."
   ;; 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 @@ If SOFT is non-nil, returns nil if the symbol doesn't 
already exist."
   "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 @@ Used to gray out relevant toolbar icons.")
      :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 @@ Used to gray out relevant toolbar icons.")
      :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 @@ Uses `gud-<MINOR-MODE>-directories' to find the source 
files."
 ;; 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 @@ we're in the GUD buffer)."
      (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".



reply via email to

[Prev in Thread] Current Thread [Next in Thread]