comparison lisp/progmodes/gdb-ui.el @ 68902:5de231ae5dc9

(gdb-use-separate-io-buffer) (gdb-display-separate-io-buffer, gdb-frame-separate-io-buffer) (gdb-separate-io-interrupt, gdb-separate-io-quit) (gdb-separate-io-stop, gdb-separate-io-eof): Rename from gdb-inferior-* to gdb-separate-*. (gdb-set-gud-minor-mode-existing-buffers-1): Improve doc string.
author Nick Roberts <nickrob@snap.net.nz>
date Tue, 14 Feb 2006 22:03:20 +0000
parents 47f77ab239fc
children 57fa3643220b
comparison
equal deleted inserted replaced
68901:95d4c7a9dca8 68902:5de231ae5dc9
183 (3 font-lock-type-face)) 183 (3 font-lock-type-face))
184 ) 184 )
185 "Font lock keywords used in `gdb-local-mode'.") 185 "Font lock keywords used in `gdb-local-mode'.")
186 186
187 ;; Variables for GDB 6.4+ 187 ;; Variables for GDB 6.4+
188
189 (defvar gdb-register-names nil "List of register names.") 188 (defvar gdb-register-names nil "List of register names.")
190 (defvar gdb-changed-registers nil 189 (defvar gdb-changed-registers nil
191 "List of changed register numbers (strings).") 190 "List of changed register numbers (strings).")
192 191
193 ;;;###autoload 192 ;;;###autoload
201 it starts with two windows: one displaying the GUD buffer and the 200 it starts with two windows: one displaying the GUD buffer and the
202 other with the source file with the main routine of the inferior. 201 other with the source file with the main routine of the inferior.
203 202
204 If `gdb-many-windows' is t, regardless of the value of 203 If `gdb-many-windows' is t, regardless of the value of
205 `gdb-show-main', the layout below will appear unless 204 `gdb-show-main', the layout below will appear unless
206 `gdb-use-inferior-io-buffer' is nil when the source buffer 205 `gdb-use-separate-io-buffer' is nil when the source buffer
207 occupies the full width of the frame. Keybindings are given in 206 occupies the full width of the frame. Keybindings are given in
208 relevant buffer. 207 relevant buffer.
209 208
210 Watch expressions appear in the speedbar/slowbar. 209 Watch expressions appear in the speedbar/slowbar.
211 210
279 Also display the main routine in the disassembly buffer if present." 278 Also display the main routine in the disassembly buffer if present."
280 :type 'boolean 279 :type 'boolean
281 :group 'gud 280 :group 'gud
282 :version "22.1") 281 :version "22.1")
283 282
284 (defcustom gdb-use-inferior-io-buffer nil 283 (defcustom gdb-use-separate-io-buffer nil
285 "Non-nil means display output from the inferior in a separate buffer." 284 "Non-nil means display output from the inferior in a separate buffer."
286 :type 'boolean 285 :type 'boolean
287 :group 'gud 286 :group 'gud
288 :version "22.1") 287 :version "22.1")
289 288
290 (defun gdb-use-inferior-io-buffer (arg) 289 (defun gdb-use-separate-io-buffer (arg)
291 "Toggle separate IO for inferior. 290 "Toggle separate IO for inferior.
292 With arg, use separate IO iff arg is positive." 291 With arg, use separate IO iff arg is positive."
293 (interactive "P") 292 (interactive "P")
294 (setq gdb-use-inferior-io-buffer 293 (setq gdb-use-separate-io-buffer
295 (if (null arg) 294 (if (null arg)
296 (not gdb-use-inferior-io-buffer) 295 (not gdb-use-separate-io-buffer)
297 (> (prefix-numeric-value arg) 0))) 296 (> (prefix-numeric-value arg) 0)))
298 (message (format "Separate inferior IO %sabled" 297 (message (format "Separate inferior IO %sabled"
299 (if gdb-use-inferior-io-buffer "en" "dis"))) 298 (if gdb-use-separate-io-buffer "en" "dis")))
300 (if (and gud-comint-buffer 299 (if (and gud-comint-buffer
301 (buffer-name gud-comint-buffer)) 300 (buffer-name gud-comint-buffer))
302 (condition-case nil 301 (condition-case nil
303 (if gdb-use-inferior-io-buffer 302 (if gdb-use-separate-io-buffer
304 (gdb-restore-windows) 303 (gdb-restore-windows)
305 (kill-buffer (gdb-inferior-io-name))) 304 (kill-buffer (gdb-inferior-io-name)))
306 (error nil)))) 305 (error nil))))
307 306
308 (defvar gdb-define-alist nil "Alist of #define directives for GUD tooltips.") 307 (defvar gdb-define-alist nil "Alist of #define directives for GUD tooltips.")
460 gdb-macro-info nil 459 gdb-macro-info nil
461 gdb-buffer-fringe-width (car (window-fringes))) 460 gdb-buffer-fringe-width (car (window-fringes)))
462 461
463 (setq gdb-buffer-type 'gdba) 462 (setq gdb-buffer-type 'gdba)
464 463
465 (if gdb-use-inferior-io-buffer (gdb-clear-inferior-io)) 464 (if gdb-use-separate-io-buffer (gdb-clear-inferior-io))
466 465
467 ;; Hack to see test for GDB 6.4+ (-stack-info-frame was implemented in 6.4) 466 ;; Hack to see test for GDB 6.4+ (-stack-info-frame was implemented in 6.4)
468 (setq gdb-version nil) 467 (setq gdb-version nil)
469 (gdb-enqueue-input (list "server interpreter mi -stack-info-frame\n" 468 (gdb-enqueue-input (list "server interpreter mi -stack-info-frame\n"
470 'gdb-get-version))) 469 'gdb-get-version)))
851 (defun gdb-inferior-io-name () 850 (defun gdb-inferior-io-name ()
852 (concat "*input/output of " 851 (concat "*input/output of "
853 (gdb-get-target-string) 852 (gdb-get-target-string)
854 "*")) 853 "*"))
855 854
856 (defun gdb-display-inferior-io-buffer () 855 (defun gdb-display-separate-io-buffer ()
857 "Display IO of inferior in a separate window." 856 "Display IO of inferior in a separate window."
858 (interactive) 857 (interactive)
859 (if gdb-use-inferior-io-buffer 858 (if gdb-use-inferior-io-buffer
860 (gdb-display-buffer 859 (gdb-display-buffer
861 (gdb-get-create-buffer 'gdb-inferior-io)))) 860 (gdb-get-create-buffer 'gdb-inferior-io))))
865 (unsplittable . t) 864 (unsplittable . t)
866 (tool-bar-lines . nil) 865 (tool-bar-lines . nil)
867 (menu-bar-lines . nil) 866 (menu-bar-lines . nil)
868 (minibuffer . nil))) 867 (minibuffer . nil)))
869 868
870 (defun gdb-frame-inferior-io-buffer () 869 (defun gdb-frame-separate-io-buffer ()
871 "Display IO of inferior in a new frame." 870 "Display IO of inferior in a new frame."
872 (interactive) 871 (interactive)
873 (if gdb-use-inferior-io-buffer 872 (if gdb-use-separate-io-buffer
874 (let ((special-display-regexps (append special-display-regexps '(".*"))) 873 (let ((special-display-regexps (append special-display-regexps '(".*")))
875 (special-display-frame-alist gdb-frame-parameters)) 874 (special-display-frame-alist gdb-frame-parameters))
876 (display-buffer (gdb-get-create-buffer 'gdb-inferior-io))))) 875 (display-buffer (gdb-get-create-buffer 'gdb-inferior-io)))))
877 876
878 (defvar gdb-inferior-io-mode-map 877 (defvar gdb-inferior-io-mode-map
879 (let ((map (make-sparse-keymap))) 878 (let ((map (make-sparse-keymap)))
880 (define-key map "\C-c\C-c" 'gdb-inferior-io-interrupt) 879 (define-key map "\C-c\C-c" 'gdb-separate-io-interrupt)
881 (define-key map "\C-c\C-z" 'gdb-inferior-io-stop) 880 (define-key map "\C-c\C-z" 'gdb-separate-io-stop)
882 (define-key map "\C-c\C-\\" 'gdb-inferior-io-quit) 881 (define-key map "\C-c\C-\\" 'gdb-separate-io-quit)
883 (define-key map "\C-c\C-d" 'gdb-inferior-io-eof) 882 (define-key map "\C-c\C-d" 'gdb-separate-io-eof)
884 (define-key map "\C-d" 'gdb-inferior-io-eof) 883 (define-key map "\C-d" 'gdb-separate-io-eof)
885 map)) 884 map))
886 885
887 (define-derived-mode gdb-inferior-io-mode comint-mode "Inferior I/O" 886 (define-derived-mode gdb-inferior-io-mode comint-mode "Inferior I/O"
888 "Major mode for gdb inferior-io." 887 "Major mode for gdb inferior-io."
889 :syntax-table nil :abbrev-table nil 888 :syntax-table nil :abbrev-table nil
900 (with-current-buffer (process-buffer proc) 899 (with-current-buffer (process-buffer proc)
901 (setq proc (get-buffer-process gud-comint-buffer)) 900 (setq proc (get-buffer-process gud-comint-buffer))
902 (process-send-string proc string) 901 (process-send-string proc string)
903 (process-send-string proc "\n"))) 902 (process-send-string proc "\n")))
904 903
905 (defun gdb-inferior-io-interrupt () 904 (defun gdb-separate-io-interrupt ()
906 "Interrupt the program being debugged." 905 "Interrupt the program being debugged."
907 (interactive) 906 (interactive)
908 (interrupt-process 907 (interrupt-process
909 (get-buffer-process gud-comint-buffer) comint-ptyp)) 908 (get-buffer-process gud-comint-buffer) comint-ptyp))
910 909
911 (defun gdb-inferior-io-quit () 910 (defun gdb-separate-io-quit ()
912 "Send quit signal to the program being debugged." 911 "Send quit signal to the program being debugged."
913 (interactive) 912 (interactive)
914 (quit-process 913 (quit-process
915 (get-buffer-process gud-comint-buffer) comint-ptyp)) 914 (get-buffer-process gud-comint-buffer) comint-ptyp))
916 915
917 (defun gdb-inferior-io-stop () 916 (defun gdb-separate-io-stop ()
918 "Stop the program being debugged." 917 "Stop the program being debugged."
919 (interactive) 918 (interactive)
920 (stop-process 919 (stop-process
921 (get-buffer-process gud-comint-buffer) comint-ptyp)) 920 (get-buffer-process gud-comint-buffer) comint-ptyp))
922 921
923 (defun gdb-inferior-io-eof () 922 (defun gdb-separate-io-eof ()
924 "Send end-of-file to the program being debugged." 923 "Send end-of-file to the program being debugged."
925 (interactive) 924 (interactive)
926 (process-send-eof 925 (process-send-eof
927 (get-buffer-process gud-comint-buffer))) 926 (get-buffer-process gud-comint-buffer)))
928 927
1114 (let ((sink gdb-output-sink)) 1113 (let ((sink gdb-output-sink))
1115 (cond 1114 (cond
1116 ((eq sink 'user) 1115 ((eq sink 'user)
1117 (progn 1116 (progn
1118 (setq gud-running t) 1117 (setq gud-running t)
1119 (if gdb-use-inferior-io-buffer 1118 (if gdb-use-separate-io-buffer
1120 (setq gdb-output-sink 'inferior)))) 1119 (setq gdb-output-sink 'inferior))))
1121 (t 1120 (t
1122 (gdb-resync) 1121 (gdb-resync)
1123 (error "Unexpected `starting' annotation"))))) 1122 (error "Unexpected `starting' annotation")))))
1124 1123
1125 (defun gdb-stopping (ignored) 1124 (defun gdb-stopping (ignored)
1126 "An annotation handler for `breakpoint' and other annotations. 1125 "An annotation handler for `breakpoint' and other annotations.
1127 They say that I/O for the subprocess is now GDB, not the program 1126 They say that I/O for the subprocess is now GDB, not the program
1128 being debugged." 1127 being debugged."
1129 (if gdb-use-inferior-io-buffer 1128 (if gdb-use-separate-io-buffer
1130 (let ((sink gdb-output-sink)) 1129 (let ((sink gdb-output-sink))
1131 (cond 1130 (cond
1132 ((eq sink 'inferior) 1131 ((eq sink 'inferior)
1133 (setq gdb-output-sink 'user)) 1132 (setq gdb-output-sink 'user))
1134 (t 1133 (t
2465 (define-key menu [memory] '("Memory" . gdb-display-memory-buffer)) 2464 (define-key menu [memory] '("Memory" . gdb-display-memory-buffer))
2466 (define-key menu [disassembly] 2465 (define-key menu [disassembly]
2467 '("Disassembly" . gdb-display-assembler-buffer)) 2466 '("Disassembly" . gdb-display-assembler-buffer))
2468 (define-key menu [registers] '("Registers" . gdb-display-registers-buffer)) 2467 (define-key menu [registers] '("Registers" . gdb-display-registers-buffer))
2469 (define-key menu [inferior] 2468 (define-key menu [inferior]
2470 '(menu-item "Inferior IO" gdb-display-inferior-io-buffer 2469 '(menu-item "Inferior IO" gdb-display-separate-io-buffer
2471 :enable gdb-use-inferior-io-buffer)) 2470 :enable gdb-use-separate-io-buffer))
2472 (define-key menu [locals] '("Locals" . gdb-display-locals-buffer)) 2471 (define-key menu [locals] '("Locals" . gdb-display-locals-buffer))
2473 (define-key menu [frames] '("Stack" . gdb-display-stack-buffer)) 2472 (define-key menu [frames] '("Stack" . gdb-display-stack-buffer))
2474 (define-key menu [breakpoints] 2473 (define-key menu [breakpoints]
2475 '("Breakpoints" . gdb-display-breakpoints-buffer))) 2474 '("Breakpoints" . gdb-display-breakpoints-buffer)))
2476 2475
2482 (define-key menu [threads] '("Threads" . gdb-frame-threads-buffer)) 2481 (define-key menu [threads] '("Threads" . gdb-frame-threads-buffer))
2483 (define-key menu [memory] '("Memory" . gdb-frame-memory-buffer)) 2482 (define-key menu [memory] '("Memory" . gdb-frame-memory-buffer))
2484 (define-key menu [disassembly] '("Disassembiy" . gdb-frame-assembler-buffer)) 2483 (define-key menu [disassembly] '("Disassembiy" . gdb-frame-assembler-buffer))
2485 (define-key menu [registers] '("Registers" . gdb-frame-registers-buffer)) 2484 (define-key menu [registers] '("Registers" . gdb-frame-registers-buffer))
2486 (define-key menu [inferior] 2485 (define-key menu [inferior]
2487 '(menu-item "Inferior IO" gdb-frame-inferior-io-buffer 2486 '(menu-item "Inferior IO" gdb-frame-separate-io-buffer
2488 :enable gdb-use-inferior-io-buffer)) 2487 :enable gdb-use-separate-io-buffer))
2489 (define-key menu [locals] '("Locals" . gdb-frame-locals-buffer)) 2488 (define-key menu [locals] '("Locals" . gdb-frame-locals-buffer))
2490 (define-key menu [frames] '("Stack" . gdb-frame-stack-buffer)) 2489 (define-key menu [frames] '("Stack" . gdb-frame-stack-buffer))
2491 (define-key menu [breakpoints] 2490 (define-key menu [breakpoints]
2492 '("Breakpoints" . gdb-frame-breakpoints-buffer))) 2491 '("Breakpoints" . gdb-frame-breakpoints-buffer)))
2493 2492
2494 (let ((menu (make-sparse-keymap "GDB-UI/MI"))) 2493 (let ((menu (make-sparse-keymap "GDB-UI/MI")))
2495 (define-key gud-menu-map [ui] 2494 (define-key gud-menu-map [ui]
2496 `(menu-item (if (eq gud-minor-mode 'gdba) "GDB-UI" "GDB-MI") 2495 `(menu-item (if (eq gud-minor-mode 'gdba) "GDB-UI" "GDB-MI")
2497 ,menu :visible (memq gud-minor-mode '(gdbmi gdba)))) 2496 ,menu :visible (memq gud-minor-mode '(gdbmi gdba))))
2498 (define-key menu [gdb-use-inferior-io] 2497 (define-key menu [gdb-use-separate-io]
2499 '(menu-item "Separate inferior IO" gdb-use-inferior-io-buffer 2498 '(menu-item "Separate inferior IO" gdb-use-separate-io-buffer
2500 :visible (eq gud-minor-mode 'gdba) 2499 :visible (eq gud-minor-mode 'gdba)
2501 :help "Toggle separate IO for inferior." 2500 :help "Toggle separate IO for inferior."
2502 :button (:toggle . gdb-use-inferior-io-buffer))) 2501 :button (:toggle . gdb-use-separate-io-buffer)))
2503 (define-key menu [gdb-many-windows] 2502 (define-key menu [gdb-many-windows]
2504 '(menu-item "Display Other Windows" gdb-many-windows 2503 '(menu-item "Display Other Windows" gdb-many-windows
2505 :help "Toggle display of locals, stack and breakpoint information" 2504 :help "Toggle display of locals, stack and breakpoint information"
2506 :button (:toggle . gdb-many-windows))) 2505 :button (:toggle . gdb-many-windows)))
2507 (define-key menu [gdb-restore-windows] 2506 (define-key menu [gdb-restore-windows]
2543 (other-window 1) 2542 (other-window 1)
2544 (switch-to-buffer 2543 (switch-to-buffer
2545 (if gud-last-last-frame 2544 (if gud-last-last-frame
2546 (gud-find-file (car gud-last-last-frame)) 2545 (gud-find-file (car gud-last-last-frame))
2547 (gud-find-file gdb-main-file))) 2546 (gud-find-file gdb-main-file)))
2548 (when gdb-use-inferior-io-buffer 2547 (when gdb-use-separate-io-buffer
2549 (split-window-horizontally) 2548 (split-window-horizontally)
2550 (other-window 1) 2549 (other-window 1)
2551 (gdb-set-window-buffer 2550 (gdb-set-window-buffer
2552 (gdb-get-create-buffer 'gdb-inferior-io))) 2551 (gdb-get-create-buffer 'gdb-inferior-io)))
2553 (other-window 1) 2552 (other-window 1)
2955 (setq gdb-frame-address (match-string 1)))) 2954 (setq gdb-frame-address (match-string 1))))
2956 (goto-char (point-min)) 2955 (goto-char (point-min))
2957 (if (re-search-forward " source language \\(\\S-*\\)\." nil t) 2956 (if (re-search-forward " source language \\(\\S-*\\)\." nil t)
2958 (setq gdb-current-language (match-string 1))) 2957 (setq gdb-current-language (match-string 1)))
2959 (gdb-invalidate-assembler)) 2958 (gdb-invalidate-assembler))
2959
2960 2960
2961
2962 ;; For debugging Emacs only (assumes that usual stack buffer already exists).
2963 (defun gdb-xbacktrace ()
2964 "Generate a full lisp level backtrace with arguments."
2965 (interactive)
2966 (let ((frames nil)
2967 (frame-number gdb-frame-number))
2968 (with-current-buffer (gdb-get-buffer 'gdb-stack-buffer)
2969 (save-excursion
2970 (goto-char (point-min))
2971 (while (search-forward "in Ffuncall " nil t)
2972 (goto-char (line-beginning-position))
2973 (looking-at "^#\\([0-9]+\\)")
2974 (push (match-string-no-properties 1) frames)
2975 (forward-line 1))))
2976 (dolist (frame frames)
2977 (gdb-enqueue-input (list (concat "server frame " frame "\n")
2978 'ignore))
2979 ; can't use separate buffer because Emacs gets confused by starting
2980 ; annotation from debug1_print (with output-sink eq 'emacs)
2981 ; (gdb-enqueue-input (list "server ppargs\n" 'gdb-get-arguments))
2982 (gud-basic-call "server ppargs"))
2983 (gdb-enqueue-input (list (concat "server frame " frame-number "\n")
2984 'ignore))))
2985
2986 ;; Code specific to GDB 6.4 2961 ;; Code specific to GDB 6.4
2987 (defconst gdb-source-file-regexp-1 "fullname=\"\\(.*?\\)\"") 2962 (defconst gdb-source-file-regexp-1 "fullname=\"\\(.*?\\)\"")
2988 2963
2989 (defun gdb-set-gud-minor-mode-existing-buffers-1 () 2964 (defun gdb-set-gud-minor-mode-existing-buffers-1 ()
2990 "Create list of source files for current GDB session." 2965 "Create list of source files for current GDB session.
2966 If buffers already exist for any of these files, gud-minor-mode
2967 is set in them."
2991 (goto-char (point-min)) 2968 (goto-char (point-min))
2992 (while (re-search-forward gdb-source-file-regexp-1 nil t) 2969 (while (re-search-forward gdb-source-file-regexp-1 nil t)
2993 (push (match-string 1) gdb-source-file-list)) 2970 (push (match-string 1) gdb-source-file-list))
2994 (dolist (buffer (buffer-list)) 2971 (dolist (buffer (buffer-list))
2995 (with-current-buffer buffer 2972 (with-current-buffer buffer