]> git.eshelyaron.com Git - emacs.git/commitdiff
* lisp/progmodes/gdb-mi.el: Warn the user when -i=mi is missing.
authorStefan Monnier <monnier@iro.umontreal.ca>
Fri, 28 Oct 2011 02:22:38 +0000 (22:22 -0400)
committerStefan Monnier <monnier@iro.umontreal.ca>
Fri, 28 Oct 2011 02:22:38 +0000 (22:22 -0400)
(gdb--check-interpreter): New function.
(gdb): Use it.

lisp/ChangeLog
lisp/progmodes/gdb-mi.el

index 6aa1bddb9f30fa610d0e27c6f3de0854025d7446..98ebed0499ddac20a2d4c477b8e5d2e87ecc1607 100644 (file)
@@ -1,3 +1,9 @@
+2011-10-28  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * progmodes/gdb-mi.el: Warn the user when -i=mi is missing.
+       (gdb--check-interpreter): New function.
+       (gdb): Use it.
+
 2011-10-27  Glenn Morris  <rgm@gnu.org>
 
        * emacs-lisp/cl-extra.el (most-positive-float, most-negative-float)
@@ -21,8 +27,8 @@
        * subr.el (change-major-mode-after-body-hook): New hook.
        (run-mode-hooks): Run it.
 
-       * emacs-lisp/easy-mmode.el (define-globalized-minor-mode): Use
-       change-major-mode-before-body-hook.
+       * emacs-lisp/easy-mmode.el (define-globalized-minor-mode):
+       Use change-major-mode-before-body-hook.
 
        * simple.el (fundamental-mode):
        * emacs-lisp/derived.el (define-derived-mode): Revert 2010-04-28
index 22db7b2e5f47becde54326fe19f21c6bd81757c1..dde00d753ac08f919b0d62ee0558baf2790cfda2 100644 (file)
 
 ;; M-x gdb will start the debugger.
 
-;; This file uses GDB/MI as the primary interface to GDB.  It is still under
-;; development and is part of a process to migrate Emacs from annotations (as
-;; used in gdb-ui.el) to GDB/MI.  It runs gdb with GDB/MI (-interp=mi) and
-;; access CLI using "-interpreter-exec console cli-command".  This code works
-;; without gdb-ui.el and uses MI tokens instead of queues. Eventually MI
-;; should be asynchronous.
-
-;; This mode will PARTLY WORK WITH RECENT GDB RELEASES (status in modeline
-;; doesn't update properly when execution commands are issued from GUD buffer)
-;; and WORKS BEST when GDB runs asynchronously: maint set linux-async on.
-;;
-;; You need development version of GDB 7.0 for the thread buffer to work.
-
-;; This file replaces gdb-ui.el and is for development with GDB.  Use the
-;; release branch of Emacs 22 for the latest version of gdb-ui.el.
+;; This file uses GDB/MI as the primary interface to GDB.  It runs gdb with
+;; GDB/MI (-interp=mi) and access CLI using "-interpreter-exec console
+;; cli-command".  This code works without gdb-ui.el and uses MI tokens instead
+;; of queues.  Eventually MI should be asynchronous.
 
 ;; Windows Platforms:
 
@@ -599,6 +588,22 @@ NOARG must be t when this macro is used outside `gud-def'"
     (concat (gdb-gud-context-command ,cmd1 ,noall) " " ,cmd2)
     ,(when (not noarg) 'arg)))
 
+(defun gdb--check-interpreter (proc string)
+  (unless (zerop (length string))
+    (let ((filter (process-get proc 'gud-normal-filter)))
+      (set-process-filter proc filter)
+      (unless (memq (aref string 0) '(?^ ?~ ?@ ?& ?* ?=))
+        ;; Apparently we're not running with -i=mi.
+        (let ((msg "Error: you did not specify -i=mi on GDB's command line!"))
+          (message msg)
+          (setq string (concat (propertize msg 'font-lock-face 'error)
+                               "\n" string)))
+        ;; Use the old gud-gbd filter, not because it works, but because it
+        ;; will properly display GDB's answers rather than hanging waiting for
+        ;; answers that aren't coming.
+        (set (make-local-variable 'gud-marker-filter) #'gud-gdb-marker-filter))
+      (funcall filter proc string))))
+
 ;;;###autoload
 (defun gdb (command-line)
   "Run gdb on program FILE in buffer *gud-FILE*.
@@ -665,6 +670,13 @@ detailed description of this mode.
      "Multiple debugging requires restarting in text command mode"))
   ;;
   (gud-common-init command-line nil 'gud-gdbmi-marker-filter)
+
+  ;; Setup a temporary process filter to warn when GDB was not started
+  ;; with -i=mi.
+  (let ((proc (get-buffer-process gud-comint-buffer)))
+    (process-put proc 'gud-normal-filter (process-filter proc))
+    (set-process-filter proc #'gdb--check-interpreter))
+
   (set (make-local-variable 'gud-minor-mode) 'gdbmi)
   (setq comint-input-sender 'gdb-send)
   (when (ring-empty-p comint-input-ring) ; cf shell-mode