From: Stefan Monnier Date: Fri, 28 Oct 2011 02:22:38 +0000 (-0400) Subject: * lisp/progmodes/gdb-mi.el: Warn the user when -i=mi is missing. X-Git-Tag: emacs-pretest-24.0.91~37^2^2~5 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=ee1f1da9672772ace63829ed6f83e56eba87f3c5;p=emacs.git * lisp/progmodes/gdb-mi.el: Warn the user when -i=mi is missing. (gdb--check-interpreter): New function. (gdb): Use it. --- diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 6aa1bddb9f3..98ebed0499d 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,9 @@ +2011-10-28 Stefan Monnier + + * 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 * 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 diff --git a/lisp/progmodes/gdb-mi.el b/lisp/progmodes/gdb-mi.el index 22db7b2e5f4..dde00d753ac 100644 --- a/lisp/progmodes/gdb-mi.el +++ b/lisp/progmodes/gdb-mi.el @@ -43,21 +43,10 @@ ;; 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