summaryrefslogtreecommitdiff
path: root/lisp/progmodes/gdb-ui.el
diff options
context:
space:
mode:
authorKaroly Lorentey <lorentey@elte.hu>2005-09-04 03:48:17 +0000
committerKaroly Lorentey <lorentey@elte.hu>2005-09-04 03:48:17 +0000
commitfbf349734468d48b421c3d03074bb66dfcf3115b (patch)
tree0a7d1ee844b6c591a5a499d23e35931945106e5a /lisp/progmodes/gdb-ui.el
parentf0caabd962b662cccbea472995d86af718cc8d0b (diff)
parent4b5fa40e1f1ba3cafde672863a0331311d1c2695 (diff)
downloademacs-fbf349734468d48b421c3d03074bb66dfcf3115b.tar.gz
emacs-fbf349734468d48b421c3d03074bb66dfcf3115b.tar.bz2
emacs-fbf349734468d48b421c3d03074bb66dfcf3115b.zip
Merged in changes from CVS trunk. Plus added lisp/term tweaks.
Patches applied: * lorentey@elte.hu--2004/emacs--cvs-trunk--0--base-0 tag of miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-474 * lorentey@elte.hu--2004/emacs--cvs-trunk--0--patch-1 Add CVS metadata files. * lorentey@elte.hu--2004/emacs--cvs-trunk--0--patch-2 Update from CVS. git-archimport-id: lorentey@elte.hu--2004/emacs--multi-tty--0--patch-393
Diffstat (limited to 'lisp/progmodes/gdb-ui.el')
-rw-r--r--lisp/progmodes/gdb-ui.el120
1 files changed, 64 insertions, 56 deletions
diff --git a/lisp/progmodes/gdb-ui.el b/lisp/progmodes/gdb-ui.el
index 584b0ae8144..6c960c4c5d5 100644
--- a/lisp/progmodes/gdb-ui.el
+++ b/lisp/progmodes/gdb-ui.el
@@ -50,6 +50,19 @@
;; still under development and is part of a process to migrate Emacs from
;; annotations to GDB/MI.
;;
+;; Windows Platforms:
+;;
+;; If you are using Emacs and GDB on Windows you will need to flush the buffer
+;; explicitly in your program if you want timely display of I/O in Emacs.
+;; Alternatively you can make the output stream unbuffered, for example, by
+;; using a macro:
+;;
+;; #ifdef UNBUFFERED
+;; setvbuf (stdout, (char *) NULL, _IONBF, 0);
+;; #endif
+;;
+;; and compiling with -DUNBUFFERED while debugging.
+;;
;; Known Bugs:
;;
;; TODO:
@@ -66,7 +79,9 @@
(require 'gud)
-(defvar gdb-frame-address "main" "Initialisation for Assembler buffer.")
+(defvar tool-bar-map)
+
+(defvar gdb-frame-address "main" "Initialization for Assembler buffer.")
(defvar gdb-previous-frame-address nil)
(defvar gdb-memory-address "main")
(defvar gdb-previous-frame nil)
@@ -74,7 +89,7 @@
(defvar gdb-frame-number nil)
(defvar gdb-current-language nil)
(defvar gdb-var-list nil "List of variables in watch window.")
-(defvar gdb-var-changed nil "Non-nil means that gdb-var-list has changed.")
+(defvar gdb-var-changed nil "Non-nil means that `gdb-var-list' has changed.")
(defvar gdb-main-file nil "Source file from which program execution begins.")
(defvar gdb-buffer-type nil)
(defvar gdb-overlay-arrow-position nil)
@@ -105,7 +120,7 @@ Possible values are these symbols:
`user' -- gdb output should be copied to the GUD buffer
for the user to see.
- `inferior' -- gdb output should be copied to the inferior-io buffer
+ `inferior' -- gdb output should be copied to the inferior-io buffer.
`pre-emacs' -- output should be ignored util the post-prompt
annotation is received. Then the output-sink
@@ -117,7 +132,7 @@ Possible values are these symbols:
`post-emacs' -- ignore output until the prompt annotation is
received, then go to USER disposition.
-gdba (gdb-ui.el) uses all five values, gdbmi (gdb-mi.el) only two
+gdba (gdb-ui.el) uses all five values, gdbmi (gdb-mi.el) only two
\(`user' and `emacs').")
(defvar gdb-current-item nil
@@ -136,7 +151,7 @@ The directory containing FILE becomes the initial working directory
and source-file directory for your debugger.
If `gdb-many-windows' is nil (the default value) then gdb just
-pops up the GUD buffer unless `gdb-show-main' is t. In this case
+pops up the GUD buffer unless `gdb-show-main' is t. In this case
it starts with two windows: one displaying the GUD buffer and the
other with the source file with the main routine of the inferior.
@@ -188,6 +203,7 @@ detailed description of this mode.
(defvar gdb-debug-log nil)
+;;;###autoload
(defcustom gdb-enable-debug-log nil
"Non-nil means record the process input and output in `gdb-debug-log'."
:type 'boolean
@@ -203,7 +219,7 @@ detailed description of this mode.
(defcustom gdb-cpp-define-alist-program "gcc -E -dM -"
"Shell command for generating a list of defined macros in a source file.
This list is used to display the #define directive associated
-with an identifier as a tooltip. It works in a debug session with
+with an identifier as a tooltip. It works in a debug session with
GDB, when gud-tooltip-mode is t.
Set `gdb-cpp-define-alist-flags' for any include paths or
@@ -266,7 +282,7 @@ Also display the main routine in the disassembly buffer if present."
'gdb-tooltip-print))))))
(defun gdb-set-gud-minor-mode (buffer)
- "Set gud-minor-mode from find-file if appropriate."
+ "Set `gud-minor-mode' from find-file if appropriate."
(goto-char (point-min))
(unless (search-forward "No source file named " nil t)
(condition-case nil
@@ -490,15 +506,11 @@ Also display the main routine in the disassembly buffer if present."
(setq gdb-var-list (nreverse var-list))))))
(defun gdb-var-update ()
- (if (not (member 'gdb-var-update gdb-pending-triggers))
- (progn
- (gdb-enqueue-input
- (list
- (if (with-current-buffer gud-comint-buffer (eq gud-minor-mode 'gdba))
- "server interpreter mi \"-var-update *\"\n"
- "-var-update *\n")
- 'gdb-var-update-handler))
- (push 'gdb-var-update gdb-pending-triggers))))
+ (when (not (member 'gdb-var-update gdb-pending-triggers))
+ (gdb-enqueue-input
+ (list "server interpreter mi \"-var-update *\"\n"
+ 'gdb-var-update-handler))
+ (push 'gdb-var-update gdb-pending-triggers)))
(defconst gdb-var-update-regexp "name=\"\\(.*?\\)\"")
@@ -509,19 +521,15 @@ Also display the main routine in the disassembly buffer if present."
(let ((varnum (match-string 1)))
(gdb-enqueue-input
(list
- (if (with-current-buffer gud-comint-buffer
- (eq gud-minor-mode 'gdba))
- (concat "server interpreter mi \"-var-evaluate-expression "
- varnum "\"\n")
- (concat "-var-evaluate-expression " varnum "\n"))
- `(lambda () (gdb-var-evaluate-expression-handler
- ,varnum t)))))))
+ (concat "server interpreter mi \"-var-evaluate-expression "
+ varnum "\"\n")
+ `(lambda () (gdb-var-evaluate-expression-handler ,varnum t)))))))
(setq gdb-pending-triggers
(delq 'gdb-var-update gdb-pending-triggers))
(when (and (boundp 'speedbar-frame) (frame-live-p speedbar-frame))
- ;; dummy command to update speedbar at right time
+ ;; Dummy command to update speedbar at right time.
(gdb-enqueue-input (list "server pwd\n" 'gdb-speedbar-timer-fn))
- ;; keep gdb-pending-triggers non-nil till end
+ ;; Keep gdb-pending-triggers non-nil till end.
(push 'gdb-speedbar-timer gdb-pending-triggers)))
(defun gdb-speedbar-timer-fn ()
@@ -531,9 +539,10 @@ Also display the main routine in the disassembly buffer if present."
(speedbar-timer-fn)))
(defun gdb-var-delete ()
- "Delete watched expression from the speedbar."
+ "Delete watch expression at point from the speedbar."
(interactive)
- (if (with-current-buffer gud-comint-buffer (eq gud-minor-mode 'gdba))
+ (if (with-current-buffer
+ gud-comint-buffer (memq gud-minor-mode '(gdbmi gdba)))
(let ((text (speedbar-line-text)))
(string-match "\\(\\S-+\\)" text)
(let* ((expr (match-string 1 text))
@@ -582,7 +591,9 @@ INDENT is the current indentation depth."
(cond ((string-match "+" text) ;expand this node
(if (with-current-buffer gud-comint-buffer (eq gud-minor-mode 'gdba))
(gdb-var-list-children token)
- (gdbmi-var-list-children token)))
+ (progn
+ (gdbmi-var-update)
+ (gdbmi-var-list-children token))))
((string-match "-" text) ;contract this node
(dolist (var gdb-var-list)
(if (string-match (concat token "\\.") (nth 1 var))
@@ -695,6 +706,13 @@ The key should be one of the cars in `gdb-buffer-rules-assoc'."
(gdb-display-buffer
(gdb-get-create-buffer 'gdb-inferior-io))))
+(defconst gdb-frame-parameters
+ '((height . 14) (width . 80)
+ (unsplittable . t)
+ (tool-bar-lines . nil)
+ (menu-bar-lines . nil)
+ (minibuffer . nil)))
+
(defun gdb-frame-inferior-io-buffer ()
"Display IO of inferior in a new frame."
(interactive)
@@ -964,7 +982,7 @@ being debugged."
(defun gdb-exited (ignored)
"An annotation handler for `exited' and `signalled'.
They say that I/O for the subprocess is now GDB, not the program
-being debugged and that the program is no longer running. This
+being debugged and that the program is no longer running. This
function is used to change the focus of GUD tooltips to #define
directives."
(setq gdb-active-process nil)
@@ -1015,7 +1033,7 @@ happens to be appropriate."
(gdb-invalidate-threads)
(unless (eq system-type 'darwin) ;Breaks on Darwin's GDB-5.3.
;; FIXME: with GDB-6 on Darwin, this might very well work.
- ;; only needed/used with speedbar/watch expressions
+ ;; Only needed/used with speedbar/watch expressions.
(when (and (boundp 'speedbar-frame) (frame-live-p speedbar-frame))
(setq gdb-var-changed t) ; force update
(dolist (var gdb-var-list)
@@ -1035,9 +1053,9 @@ happens to be appropriate."
(if gdb-flush-pending-output
nil
(if gdb-enable-debug-log (push (cons 'recv string) gdb-debug-log))
- ;; Recall the left over gud-marker-acc from last time
+ ;; Recall the left over gud-marker-acc from last time.
(setq gud-marker-acc (concat gud-marker-acc string))
- ;; Start accumulating output for the GUD buffer
+ ;; Start accumulating output for the GUD buffer.
(let ((output ""))
;;
;; Process all the complete markers in this chunk.
@@ -1287,7 +1305,7 @@ static char *magick[] = {
:weight bold))
"Face for enabled breakpoint icon in fringe."
:group 'gud)
-;; compatibility alias for old name
+;; Compatibility alias for old name.
(put 'breakpoint-enabled-bitmap-face 'face-alias 'breakpoint-enabled)
(defface breakpoint-disabled
@@ -1298,13 +1316,11 @@ static char *magick[] = {
(((background light)) :foreground "grey40"))
"Face for disabled breakpoint icon in fringe."
:group 'gud)
-;; compatibility alias for old name
-(put 'breakpoint-disabled-bitmap-face 'face-alias 'breakpoint-disabled)
-;;-put breakpoint icons in relevant margins (even those set in the GUD buffer)
+;; Put breakpoint icons in relevant margins (even those set in the GUD buffer).
(defun gdb-info-breakpoints-custom ()
(let ((flag) (bptno))
- ;; remove all breakpoint-icons in source buffers but not assembler buffer
+ ;; Remove all breakpoint-icons in source buffers but not assembler buffer.
(dolist (buffer (buffer-list))
(with-current-buffer buffer
(if (and (eq gud-minor-mode 'gdba)
@@ -1334,13 +1350,14 @@ static char *magick[] = {
(setq file (cdr (assoc bptno gdb-location-alist))))
(if (and file
(not (string-equal file "File not found")))
- (with-current-buffer (find-file-noselect file)
+ (with-current-buffer
+ (find-file-noselect file 'nowarn)
(set (make-local-variable 'gud-minor-mode)
'gdba)
(set (make-local-variable 'tool-bar-map)
gud-tool-bar-map)
- ;; only want one breakpoint icon at each
- ;; location
+ ;; Only want one breakpoint icon at each
+ ;; location.
(save-excursion
(goto-line (string-to-number line))
(gdb-put-breakpoint-icon (eq flag ?y) bptno)))
@@ -1380,11 +1397,7 @@ static char *magick[] = {
(with-selected-window (posn-window posn)
(save-excursion
(goto-char (posn-point posn))
- (if
-; (or
- (posn-object posn)
-; (eq (car (fringe-bitmaps-at-pos (posn-point posn)))
-; 'breakpoint))
+ (if (posn-object posn)
(gdb-enqueue-input
(list
(let ((bptno (get-text-property
@@ -1406,13 +1419,6 @@ static char *magick[] = {
(gdb-display-buffer
(gdb-get-create-buffer 'gdb-breakpoints-buffer)))
-(defconst gdb-frame-parameters
- '((height . 14) (width . 80)
- (unsplittable . t)
- (tool-bar-lines . nil)
- (menu-bar-lines . nil)
- (minibuffer . nil)))
-
(defun gdb-frame-breakpoints-buffer ()
"Display status of user-settable breakpoints in a new frame."
(interactive)
@@ -1972,7 +1978,7 @@ corresponding to the mode line clicked."
'mouse-1
#'(lambda () (interactive)
(let ((gdb-memory-address
- ;; let GDB do the arithmetic
+ ;; Let GDB do the arithmetic.
(concat
gdb-memory-address " - "
(number-to-string
@@ -2186,6 +2192,7 @@ corresponding to the mode line clicked."
(define-key gud-menu-map [ui]
`(menu-item "GDB-UI" ,menu :visible (eq gud-minor-mode 'gdba)))
(define-key menu [gdb-use-inferior-io]
+ ;; See defadvice below.
(menu-bar-make-toggle toggle-gdb-use-inferior-io-buffer
gdb-use-inferior-io-buffer
"Separate inferior IO" "Use separate IO %s"
@@ -2198,6 +2205,7 @@ corresponding to the mode line clicked."
'(menu-item "Restore Window Layout" gdb-restore-windows
:help "Restore standard layout for debug session.")))
+;; This function is defined above through a macro.
(defadvice toggle-gdb-use-inferior-io-buffer (after gdb-kill-io-buffer activate)
(unless gdb-use-inferior-io-buffer
(kill-buffer (gdb-inferior-io-name))))
@@ -2220,7 +2228,7 @@ corresponding to the mode line clicked."
(set-window-dedicated-p (selected-window) t))
(defun gdb-setup-windows ()
- "Layout the window pattern for gdb-many-windows."
+ "Layout the window pattern for `gdb-many-windows'."
(gdb-display-locals-buffer)
(gdb-display-stack-buffer)
(delete-other-windows)
@@ -2374,7 +2382,7 @@ of the current session."
(defun gdb-put-string (putstring pos &optional dprop)
"Put string PUTSTRING in front of POS in the current buffer.
PUTSTRING is displayed by putting an overlay into the current buffer with a
-`before-string' STRING that has a `display' property whose value is
+`before-string' string that has a `display' property whose value is
PUTSTRING."
(let ((string (make-string 1 ?x))
(buffer (current-buffer)))
@@ -2479,7 +2487,7 @@ BUFFER nil or omitted means use the current buffer."
(def-gdb-auto-updated-buffer gdb-assembler-buffer
gdb-invalidate-assembler
- (concat gdb-server-prefix "disassemble "
+ (concat gdb-server-prefix "disassemble "
(if (member gdb-frame-address '(nil "main")) nil "0x")
gdb-frame-address "\n")
gdb-assembler-handler