comparison lisp/progmodes/gdb-ui.el @ 83473:428d132b4028

Merged from Patches applied: * emacs@sv.gnu.org/emacs--devo--0--patch-73 Merge from erc--emacs--0 * emacs@sv.gnu.org/emacs--devo--0--patch-74 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-75 Make ERC comply with the new copyright year guidelines. * emacs@sv.gnu.org/emacs--devo--0--patch-76 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-77 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-78 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-79 (rcirc-format-response-string): Fix small bugs * emacs@sv.gnu.org/emacs--devo--0--patch-80 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-81 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-82 Fix compiler error in erc-dcc.el. * emacs@sv.gnu.org/emacs--devo--0--patch-83 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-84 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-85 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-86 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-87 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-88 Merge from erc--emacs--0 * emacs@sv.gnu.org/emacs--devo--0--patch-89 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-90 Update from CVS git-archimport-id: lorentey@elte.hu--2004/emacs--multi-tty--0--patch-513
author Karoly Lorentey <lorentey@elte.hu>
date Thu, 16 Feb 2006 16:18:54 +0000
parents b98066f4aa10 57fa3643220b
children d08a7ef0cb8a
comparison
equal deleted inserted replaced
83472:b8bd59a73456 83473:428d132b4028
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)))
569 (dolist (var gdb-var-list) 568 (dolist (var gdb-var-list)
570 (if (string-equal expr (car var)) (throw 'already-watched nil))) 569 (if (string-equal expr (car var)) (throw 'already-watched nil)))
571 (set-text-properties 0 (length expr) nil expr) 570 (set-text-properties 0 (length expr) nil expr)
572 (gdb-enqueue-input 571 (gdb-enqueue-input
573 (list 572 (list
574 (if (eq gud-minor-mode 'gdba) 573 (if (eq (buffer-local-value 'gud-minor-mode gud-comint-buffer) 'gdba)
575 (concat "server interpreter mi \"-var-create - * " expr "\"\n") 574 (concat "server interpreter mi \"-var-create - * " expr "\"\n")
576 (concat"-var-create - * " expr "\n")) 575 (concat"-var-create - * " expr "\n"))
577 `(lambda () (gdb-var-create-handler ,expr)))))))) 576 `(lambda () (gdb-var-create-handler ,expr))))))))
578 577
579 (defconst gdb-var-create-regexp 578 (defconst gdb-var-create-regexp
592 (unless (string-equal 591 (unless (string-equal
593 speedbar-initial-expansion-list-name "GUD") 592 speedbar-initial-expansion-list-name "GUD")
594 (speedbar-change-initial-expansion-list "GUD")) 593 (speedbar-change-initial-expansion-list "GUD"))
595 (gdb-enqueue-input 594 (gdb-enqueue-input
596 (list 595 (list
597 (if (eq (buffer-local-value 'gud-minor-mode gud-comint-buffer) 596 (if (eq (buffer-local-value 'gud-minor-mode gud-comint-buffer) 'gdba)
598 'gdba)
599 (concat "server interpreter mi \"-var-evaluate-expression " 597 (concat "server interpreter mi \"-var-evaluate-expression "
600 (nth 1 var) "\"\n") 598 (nth 1 var) "\"\n")
601 (concat "-var-evaluate-expression " (nth 1 var) "\n")) 599 (concat "-var-evaluate-expression " (nth 1 var) "\n"))
602 `(lambda () (gdb-var-evaluate-expression-handler 600 `(lambda () (gdb-var-evaluate-expression-handler
603 ,(nth 1 var) nil)))) 601 ,(nth 1 var) nil))))
741 "Expand the node the user clicked on. 739 "Expand the node the user clicked on.
742 TEXT is the text of the button we clicked on, a + or - item. 740 TEXT is the text of the button we clicked on, a + or - item.
743 TOKEN is data related to this node. 741 TOKEN is data related to this node.
744 INDENT is the current indentation depth." 742 INDENT is the current indentation depth."
745 (cond ((string-match "+" text) ;expand this node 743 (cond ((string-match "+" text) ;expand this node
746 (if (eq (buffer-local-value 'gud-minor-mode gud-comint-buffer) 'gdba) 744 (if (and
747 (if (string-equal gdb-version "pre-6.4") 745 (eq (buffer-local-value 'gud-minor-mode gud-comint-buffer) 'gdba)
748 (gdb-var-list-children token) 746 (string-equal gdb-version "pre-6.4"))
749 (gdb-var-list-children-1 token)) 747 (gdb-var-list-children token)
750 (progn 748 (gdb-var-list-children-1 token)))
751 (gdbmi-var-update)
752 (gdbmi-var-list-children token))))
753 ((string-match "-" text) ;contract this node 749 ((string-match "-" text) ;contract this node
754 (dolist (var gdb-var-list) 750 (dolist (var gdb-var-list)
755 (if (string-match (concat token "\\.") (nth 1 var)) 751 (if (string-match (concat token "\\.") (nth 1 var))
756 (setq gdb-var-list (delq var gdb-var-list)))) 752 (setq gdb-var-list (delq var gdb-var-list))))
757 (setq gdb-var-changed t) 753 (setq gdb-var-changed t)
854 (defun gdb-inferior-io-name () 850 (defun gdb-inferior-io-name ()
855 (concat "*input/output of " 851 (concat "*input/output of "
856 (gdb-get-target-string) 852 (gdb-get-target-string)
857 "*")) 853 "*"))
858 854
859 (defun gdb-display-inferior-io-buffer () 855 (defun gdb-display-separate-io-buffer ()
860 "Display IO of inferior in a separate window." 856 "Display IO of inferior in a separate window."
861 (interactive) 857 (interactive)
862 (if gdb-use-inferior-io-buffer 858 (if gdb-use-separate-io-buffer
863 (gdb-display-buffer 859 (gdb-display-buffer
864 (gdb-get-create-buffer 'gdb-inferior-io)))) 860 (gdb-get-create-buffer 'gdb-inferior-io))))
865 861
866 (defconst gdb-frame-parameters 862 (defconst gdb-frame-parameters
867 '((height . 14) (width . 80) 863 '((height . 14) (width . 80)
868 (unsplittable . t) 864 (unsplittable . t)
869 (tool-bar-lines . nil) 865 (tool-bar-lines . nil)
870 (menu-bar-lines . nil) 866 (menu-bar-lines . nil)
871 (minibuffer . nil))) 867 (minibuffer . nil)))
872 868
873 (defun gdb-frame-inferior-io-buffer () 869 (defun gdb-frame-separate-io-buffer ()
874 "Display IO of inferior in a new frame." 870 "Display IO of inferior in a new frame."
875 (interactive) 871 (interactive)
876 (if gdb-use-inferior-io-buffer 872 (if gdb-use-separate-io-buffer
877 (let ((special-display-regexps (append special-display-regexps '(".*"))) 873 (let ((special-display-regexps (append special-display-regexps '(".*")))
878 (special-display-frame-alist gdb-frame-parameters)) 874 (special-display-frame-alist gdb-frame-parameters))
879 (display-buffer (gdb-get-create-buffer 'gdb-inferior-io))))) 875 (display-buffer (gdb-get-create-buffer 'gdb-inferior-io)))))
880 876
881 (defvar gdb-inferior-io-mode-map 877 (defvar gdb-inferior-io-mode-map
882 (let ((map (make-sparse-keymap))) 878 (let ((map (make-sparse-keymap)))
883 (define-key map "\C-c\C-c" 'gdb-inferior-io-interrupt) 879 (define-key map "\C-c\C-c" 'gdb-separate-io-interrupt)
884 (define-key map "\C-c\C-z" 'gdb-inferior-io-stop) 880 (define-key map "\C-c\C-z" 'gdb-separate-io-stop)
885 (define-key map "\C-c\C-\\" 'gdb-inferior-io-quit) 881 (define-key map "\C-c\C-\\" 'gdb-separate-io-quit)
886 (define-key map "\C-c\C-d" 'gdb-inferior-io-eof) 882 (define-key map "\C-c\C-d" 'gdb-separate-io-eof)
887 (define-key map "\C-d" 'gdb-inferior-io-eof) 883 (define-key map "\C-d" 'gdb-separate-io-eof)
888 map)) 884 map))
889 885
890 (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"
891 "Major mode for gdb inferior-io." 887 "Major mode for gdb inferior-io."
892 :syntax-table nil :abbrev-table nil 888 :syntax-table nil :abbrev-table nil
903 (with-current-buffer (process-buffer proc) 899 (with-current-buffer (process-buffer proc)
904 (setq proc (get-buffer-process gud-comint-buffer)) 900 (setq proc (get-buffer-process gud-comint-buffer))
905 (process-send-string proc string) 901 (process-send-string proc string)
906 (process-send-string proc "\n"))) 902 (process-send-string proc "\n")))
907 903
908 (defun gdb-inferior-io-interrupt () 904 (defun gdb-separate-io-interrupt ()
909 "Interrupt the program being debugged." 905 "Interrupt the program being debugged."
910 (interactive) 906 (interactive)
911 (interrupt-process 907 (interrupt-process
912 (get-buffer-process gud-comint-buffer) comint-ptyp)) 908 (get-buffer-process gud-comint-buffer) comint-ptyp))
913 909
914 (defun gdb-inferior-io-quit () 910 (defun gdb-separate-io-quit ()
915 "Send quit signal to the program being debugged." 911 "Send quit signal to the program being debugged."
916 (interactive) 912 (interactive)
917 (quit-process 913 (quit-process
918 (get-buffer-process gud-comint-buffer) comint-ptyp)) 914 (get-buffer-process gud-comint-buffer) comint-ptyp))
919 915
920 (defun gdb-inferior-io-stop () 916 (defun gdb-separate-io-stop ()
921 "Stop the program being debugged." 917 "Stop the program being debugged."
922 (interactive) 918 (interactive)
923 (stop-process 919 (stop-process
924 (get-buffer-process gud-comint-buffer) comint-ptyp)) 920 (get-buffer-process gud-comint-buffer) comint-ptyp))
925 921
926 (defun gdb-inferior-io-eof () 922 (defun gdb-separate-io-eof ()
927 "Send end-of-file to the program being debugged." 923 "Send end-of-file to the program being debugged."
928 (interactive) 924 (interactive)
929 (process-send-eof 925 (process-send-eof
930 (get-buffer-process gud-comint-buffer))) 926 (get-buffer-process gud-comint-buffer)))
931 927
1117 (let ((sink gdb-output-sink)) 1113 (let ((sink gdb-output-sink))
1118 (cond 1114 (cond
1119 ((eq sink 'user) 1115 ((eq sink 'user)
1120 (progn 1116 (progn
1121 (setq gud-running t) 1117 (setq gud-running t)
1122 (if gdb-use-inferior-io-buffer 1118 (if gdb-use-separate-io-buffer
1123 (setq gdb-output-sink 'inferior)))) 1119 (setq gdb-output-sink 'inferior))))
1124 (t 1120 (t
1125 (gdb-resync) 1121 (gdb-resync)
1126 (error "Unexpected `starting' annotation"))))) 1122 (error "Unexpected `starting' annotation")))))
1127 1123
1128 (defun gdb-stopping (ignored) 1124 (defun gdb-stopping (ignored)
1129 "An annotation handler for `breakpoint' and other annotations. 1125 "An annotation handler for `breakpoint' and other annotations.
1130 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
1131 being debugged." 1127 being debugged."
1132 (if gdb-use-inferior-io-buffer 1128 (if gdb-use-separate-io-buffer
1133 (let ((sink gdb-output-sink)) 1129 (let ((sink gdb-output-sink))
1134 (cond 1130 (cond
1135 ((eq sink 'inferior) 1131 ((eq sink 'inferior)
1136 (setq gdb-output-sink 'user)) 1132 (setq gdb-output-sink 'user))
1137 (t 1133 (t
1193 ;; so gdb-frame-address is updated. 1189 ;; so gdb-frame-address is updated.
1194 ;; (gdb-invalidate-assembler) 1190 ;; (gdb-invalidate-assembler)
1195 1191
1196 (if (string-equal gdb-version "pre-6.4") 1192 (if (string-equal gdb-version "pre-6.4")
1197 (gdb-invalidate-registers) 1193 (gdb-invalidate-registers)
1198 (if (gdb-get-buffer 'gdb-registers-buffer) (gdb-get-changed-registers)) 1194 (gdb-get-changed-registers)
1199 (gdb-invalidate-registers-1)) 1195 (gdb-invalidate-registers-1))
1200 1196
1201 (gdb-invalidate-memory) 1197 (gdb-invalidate-memory)
1202 (if (string-equal gdb-version "pre-6.4") 1198 (if (string-equal gdb-version "pre-6.4")
1203 (gdb-invalidate-locals) 1199 (gdb-invalidate-locals)
1496 (defun gdb-info-breakpoints-custom () 1492 (defun gdb-info-breakpoints-custom ()
1497 (let ((flag) (bptno)) 1493 (let ((flag) (bptno))
1498 ;; Remove all breakpoint-icons in source buffers but not assembler buffer. 1494 ;; Remove all breakpoint-icons in source buffers but not assembler buffer.
1499 (dolist (buffer (buffer-list)) 1495 (dolist (buffer (buffer-list))
1500 (with-current-buffer buffer 1496 (with-current-buffer buffer
1501 (if (and (eq gud-minor-mode 'gdba) 1497 (if (and (memq gud-minor-mode '(gdba gdbmi))
1502 (not (string-match "\\`\\*.+\\*\\'" (buffer-name)))) 1498 (not (string-match "\\`\\*.+\\*\\'" (buffer-name))))
1503 (gdb-remove-breakpoint-icons (point-min) (point-max))))) 1499 (gdb-remove-breakpoint-icons (point-min) (point-max)))))
1504 (with-current-buffer (gdb-get-buffer 'gdb-breakpoints-buffer) 1500 (with-current-buffer (gdb-get-buffer 'gdb-breakpoints-buffer)
1505 (save-excursion 1501 (save-excursion
1506 (goto-char (point-min)) 1502 (goto-char (point-min))
1631 (display-buffer (gdb-get-create-buffer 'gdb-breakpoints-buffer)))) 1627 (display-buffer (gdb-get-create-buffer 'gdb-breakpoints-buffer))))
1632 1628
1633 (defvar gdb-breakpoints-mode-map 1629 (defvar gdb-breakpoints-mode-map
1634 (let ((map (make-sparse-keymap)) 1630 (let ((map (make-sparse-keymap))
1635 (menu (make-sparse-keymap "Breakpoints"))) 1631 (menu (make-sparse-keymap "Breakpoints")))
1636 (define-key menu [quit] '("Quit" . kill-this-buffer)) 1632 (define-key menu [quit] '("Quit" . gdb-delete-frame-or-window))
1637 (define-key menu [goto] '("Goto" . gdb-goto-breakpoint)) 1633 (define-key menu [goto] '("Goto" . gdb-goto-breakpoint))
1638 (define-key menu [delete] '("Delete" . gdb-delete-breakpoint)) 1634 (define-key menu [delete] '("Delete" . gdb-delete-breakpoint))
1639 (define-key menu [toggle] '("Toggle" . gdb-toggle-breakpoint)) 1635 (define-key menu [toggle] '("Toggle" . gdb-toggle-breakpoint))
1640 (suppress-keymap map) 1636 (suppress-keymap map)
1641 (define-key map [menu-bar breakpoints] (cons "Breakpoints" menu)) 1637 (define-key map [menu-bar breakpoints] (cons "Breakpoints" menu))
1666 (run-mode-hooks 'gdb-breakpoints-mode-hook) 1662 (run-mode-hooks 'gdb-breakpoints-mode-hook)
1667 (if (eq (buffer-local-value 'gud-minor-mode gud-comint-buffer) 'gdba) 1663 (if (eq (buffer-local-value 'gud-minor-mode gud-comint-buffer) 'gdba)
1668 'gdb-invalidate-breakpoints 1664 'gdb-invalidate-breakpoints
1669 'gdbmi-invalidate-breakpoints)) 1665 'gdbmi-invalidate-breakpoints))
1670 1666
1667 (defconst gdb-breakpoint-regexp
1668 "\\([0-9]+\\).*?\\(?:point\\|catch\\s-+\\S-+\\)\\s-+\\S-+\\s-+\\(.\\)\\s-+")
1669
1671 (defun gdb-toggle-breakpoint () 1670 (defun gdb-toggle-breakpoint ()
1672 "Enable/disable breakpoint at current line." 1671 "Enable/disable breakpoint at current line."
1673 (interactive) 1672 (interactive)
1674 (save-excursion 1673 (save-excursion
1675 (beginning-of-line 1) 1674 (beginning-of-line 1)
1676 (if (if (eq (buffer-local-value 'gud-minor-mode gud-comint-buffer) 'gdba) 1675 (if (looking-at gdb-breakpoint-regexp)
1677 (looking-at "\\([0-9]+\\).*?point\\s-+\\S-+\\s-+\\(.\\)\\s-+")
1678 (looking-at
1679 "\\([0-9]+\\)\\s-+\\S-+\\s-+\\S-+\\s-+\\(.\\)\\s-+\\S-+\\s-+\\S-+:[0-9]+"))
1680 (gdb-enqueue-input 1676 (gdb-enqueue-input
1681 (list 1677 (list
1682 (concat gdb-server-prefix 1678 (concat gdb-server-prefix
1683 (if (eq ?y (char-after (match-beginning 2))) 1679 (if (eq ?y (char-after (match-beginning 2)))
1684 "disable " 1680 "disable "
1688 1684
1689 (defun gdb-delete-breakpoint () 1685 (defun gdb-delete-breakpoint ()
1690 "Delete the breakpoint at current line." 1686 "Delete the breakpoint at current line."
1691 (interactive) 1687 (interactive)
1692 (beginning-of-line 1) 1688 (beginning-of-line 1)
1693 (if (if (eq (buffer-local-value 'gud-minor-mode gud-comint-buffer) 'gdba) 1689 (if (looking-at gdb-breakpoint-regexp)
1694 (looking-at "\\([0-9]+\\).*?point\\s-+\\S-+\\s-+\\(.\\)")
1695 (looking-at
1696 "\\([0-9]+\\)\\s-+\\S-+\\s-+\\S-+\\s-+\\s-+\\S-+\\s-+\\S-+:[0-9]+"))
1697 (gdb-enqueue-input 1690 (gdb-enqueue-input
1698 (list 1691 (list
1699 (concat gdb-server-prefix "delete " (match-string 1) "\n") 'ignore)) 1692 (concat gdb-server-prefix "delete " (match-string 1) "\n") 'ignore))
1700 (error "Not recognized as break/watchpoint line"))) 1693 (error "Not recognized as break/watchpoint line")))
1701 1694
1706 ;; Hack to stop gdb-goto-breakpoint displaying in GUD buffer. 1699 ;; Hack to stop gdb-goto-breakpoint displaying in GUD buffer.
1707 (let ((window (get-buffer-window gud-comint-buffer))) 1700 (let ((window (get-buffer-window gud-comint-buffer)))
1708 (if window (save-selected-window (select-window window)))) 1701 (if window (save-selected-window (select-window window))))
1709 (save-excursion 1702 (save-excursion
1710 (beginning-of-line 1) 1703 (beginning-of-line 1)
1711 (if (if (eq (buffer-local-value 'gud-minor-mode gud-comint-buffer) 'gdba) 1704 (if (looking-at "\\([0-9]+\\) .+ in .+ at\\s-+\\(\\S-+\\):\\([0-9]+\\)")
1712 (looking-at "\\([0-9]+\\) .+ in .+ at\\s-+\\(\\S-+\\):\\([0-9]+\\)")
1713 (looking-at
1714 "\\([0-9]+\\)\\s-+\\S-+\\s-+\\S-+\\s-+.\\s-+\\S-+\\s-+\
1715 \\(\\S-+\\):\\([0-9]+\\)"))
1716 (let ((bptno (match-string 1)) 1705 (let ((bptno (match-string 1))
1717 (file (match-string 2)) 1706 (file (match-string 2))
1718 (line (match-string 3))) 1707 (line (match-string 3)))
1719 (save-selected-window 1708 (save-selected-window
1720 (let* ((buf (find-file-noselect 1709 (let* ((buf (find-file-noselect
1722 (cdr (assoc bptno gdb-location-alist))))) 1711 (cdr (assoc bptno gdb-location-alist)))))
1723 (window (display-buffer buf))) 1712 (window (display-buffer buf)))
1724 (with-current-buffer buf 1713 (with-current-buffer buf
1725 (goto-line (string-to-number line)) 1714 (goto-line (string-to-number line))
1726 (set-window-point window (point)))))) 1715 (set-window-point window (point))))))
1727 (error "Not recognized as break/watchpoint line")))) 1716 (error "No location specified."))))
1728 1717
1729 1718
1730 ;; Frames buffer. This displays a perpetually correct bactracktrace 1719 ;; Frames buffer. This displays a perpetually correct bactracktrace
1731 ;; (from the command `where'). 1720 ;; (from the command `where').
1732 ;; 1721 ;;
2414 (setq buffer-read-only t) 2403 (setq buffer-read-only t)
2415 (use-local-map gdb-locals-mode-map) 2404 (use-local-map gdb-locals-mode-map)
2416 (set (make-local-variable 'font-lock-defaults) 2405 (set (make-local-variable 'font-lock-defaults)
2417 '(gdb-locals-font-lock-keywords)) 2406 '(gdb-locals-font-lock-keywords))
2418 (run-mode-hooks 'gdb-locals-mode-hook) 2407 (run-mode-hooks 'gdb-locals-mode-hook)
2419 (if (eq (buffer-local-value 'gud-minor-mode gud-comint-buffer) 'gdba) 2408 (if (and (eq (buffer-local-value 'gud-minor-mode gud-comint-buffer) 'gdba)
2420 (if (string-equal gdb-version "pre-6.4") 2409 (string-equal gdb-version "pre-6.4"))
2421 'gdb-invalidate-locals 2410 'gdb-invalidate-locals
2422 'gdb-invalidate-locals-1) 2411 'gdb-invalidate-locals-1))
2423 'gdbmi-invalidate-locals))
2424 2412
2425 (defun gdb-locals-buffer-name () 2413 (defun gdb-locals-buffer-name ()
2426 (with-current-buffer gud-comint-buffer 2414 (with-current-buffer gud-comint-buffer
2427 (concat "*locals of " (gdb-get-target-string) "*"))) 2415 (concat "*locals of " (gdb-get-target-string) "*")))
2428 2416
2476 (define-key menu [memory] '("Memory" . gdb-display-memory-buffer)) 2464 (define-key menu [memory] '("Memory" . gdb-display-memory-buffer))
2477 (define-key menu [disassembly] 2465 (define-key menu [disassembly]
2478 '("Disassembly" . gdb-display-assembler-buffer)) 2466 '("Disassembly" . gdb-display-assembler-buffer))
2479 (define-key menu [registers] '("Registers" . gdb-display-registers-buffer)) 2467 (define-key menu [registers] '("Registers" . gdb-display-registers-buffer))
2480 (define-key menu [inferior] 2468 (define-key menu [inferior]
2481 '(menu-item "Inferior IO" gdb-display-inferior-io-buffer 2469 '(menu-item "Inferior IO" gdb-display-separate-io-buffer
2482 :enable gdb-use-inferior-io-buffer)) 2470 :enable gdb-use-separate-io-buffer))
2483 (define-key menu [locals] '("Locals" . gdb-display-locals-buffer)) 2471 (define-key menu [locals] '("Locals" . gdb-display-locals-buffer))
2484 (define-key menu [frames] '("Stack" . gdb-display-stack-buffer)) 2472 (define-key menu [frames] '("Stack" . gdb-display-stack-buffer))
2485 (define-key menu [breakpoints] 2473 (define-key menu [breakpoints]
2486 '("Breakpoints" . gdb-display-breakpoints-buffer))) 2474 '("Breakpoints" . gdb-display-breakpoints-buffer)))
2487 2475
2493 (define-key menu [threads] '("Threads" . gdb-frame-threads-buffer)) 2481 (define-key menu [threads] '("Threads" . gdb-frame-threads-buffer))
2494 (define-key menu [memory] '("Memory" . gdb-frame-memory-buffer)) 2482 (define-key menu [memory] '("Memory" . gdb-frame-memory-buffer))
2495 (define-key menu [disassembly] '("Disassembiy" . gdb-frame-assembler-buffer)) 2483 (define-key menu [disassembly] '("Disassembiy" . gdb-frame-assembler-buffer))
2496 (define-key menu [registers] '("Registers" . gdb-frame-registers-buffer)) 2484 (define-key menu [registers] '("Registers" . gdb-frame-registers-buffer))
2497 (define-key menu [inferior] 2485 (define-key menu [inferior]
2498 '(menu-item "Inferior IO" gdb-frame-inferior-io-buffer 2486 '(menu-item "Inferior IO" gdb-frame-separate-io-buffer
2499 :enable gdb-use-inferior-io-buffer)) 2487 :enable gdb-use-separate-io-buffer))
2500 (define-key menu [locals] '("Locals" . gdb-frame-locals-buffer)) 2488 (define-key menu [locals] '("Locals" . gdb-frame-locals-buffer))
2501 (define-key menu [frames] '("Stack" . gdb-frame-stack-buffer)) 2489 (define-key menu [frames] '("Stack" . gdb-frame-stack-buffer))
2502 (define-key menu [breakpoints] 2490 (define-key menu [breakpoints]
2503 '("Breakpoints" . gdb-frame-breakpoints-buffer))) 2491 '("Breakpoints" . gdb-frame-breakpoints-buffer)))
2504 2492
2505 (let ((menu (make-sparse-keymap "GDB-UI/MI"))) 2493 (let ((menu (make-sparse-keymap "GDB-UI/MI")))
2506 (define-key gud-menu-map [ui] 2494 (define-key gud-menu-map [ui]
2507 `(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")
2508 ,menu :visible (memq gud-minor-mode '(gdbmi gdba)))) 2496 ,menu :visible (memq gud-minor-mode '(gdbmi gdba))))
2509 (define-key menu [gdb-use-inferior-io] 2497 (define-key menu [gdb-use-separate-io]
2510 '(menu-item "Separate inferior IO" gdb-use-inferior-io-buffer 2498 '(menu-item "Separate inferior IO" gdb-use-separate-io-buffer
2511 :visible (eq gud-minor-mode 'gdba) 2499 :visible (eq gud-minor-mode 'gdba)
2512 :help "Toggle separate IO for inferior." 2500 :help "Toggle separate IO for inferior."
2513 :button (:toggle . gdb-use-inferior-io-buffer))) 2501 :button (:toggle . gdb-use-separate-io-buffer)))
2514 (define-key menu [gdb-many-windows] 2502 (define-key menu [gdb-many-windows]
2515 '(menu-item "Display Other Windows" gdb-many-windows 2503 '(menu-item "Display Other Windows" gdb-many-windows
2516 :help "Toggle display of locals, stack and breakpoint information" 2504 :help "Toggle display of locals, stack and breakpoint information"
2517 :button (:toggle . gdb-many-windows))) 2505 :button (:toggle . gdb-many-windows)))
2518 (define-key menu [gdb-restore-windows] 2506 (define-key menu [gdb-restore-windows]
2554 (other-window 1) 2542 (other-window 1)
2555 (switch-to-buffer 2543 (switch-to-buffer
2556 (if gud-last-last-frame 2544 (if gud-last-last-frame
2557 (gud-find-file (car gud-last-last-frame)) 2545 (gud-find-file (car gud-last-last-frame))
2558 (gud-find-file gdb-main-file))) 2546 (gud-find-file gdb-main-file)))
2559 (when gdb-use-inferior-io-buffer 2547 (when gdb-use-separate-io-buffer
2560 (split-window-horizontally) 2548 (split-window-horizontally)
2561 (other-window 1) 2549 (other-window 1)
2562 (gdb-set-window-buffer 2550 (gdb-set-window-buffer
2563 (gdb-get-create-buffer 'gdb-inferior-io))) 2551 (gdb-get-create-buffer 'gdb-inferior-io)))
2564 (other-window 1) 2552 (other-window 1)
2682 "Set up buffer for debugging if file is part of the source code 2670 "Set up buffer for debugging if file is part of the source code
2683 of the current session." 2671 of the current session."
2684 (if (and (buffer-name gud-comint-buffer) 2672 (if (and (buffer-name gud-comint-buffer)
2685 ;; in case gud or gdb-ui is just loaded 2673 ;; in case gud or gdb-ui is just loaded
2686 gud-comint-buffer 2674 gud-comint-buffer
2687 (eq (buffer-local-value 'gud-minor-mode gud-comint-buffer) 2675 (memq (buffer-local-value 'gud-minor-mode gud-comint-buffer)
2688 'gdba)) 2676 '(gdba gdbmi)))
2689 (if (member buffer-file-name gdb-source-file-list) 2677 (if (member buffer-file-name gdb-source-file-list)
2690 (with-current-buffer (find-buffer-visiting buffer-file-name) 2678 (with-current-buffer (find-buffer-visiting buffer-file-name)
2691 (set (make-local-variable 'gud-minor-mode) 'gdba) 2679 (set (make-local-variable 'gud-minor-mode)
2680 (buffer-local-value 'gud-minor-mode gud-comint-buffer))
2692 (set (make-local-variable 'tool-bar-map) gud-tool-bar-map))))) 2681 (set (make-local-variable 'tool-bar-map) gud-tool-bar-map)))))
2693 2682
2694 ;;from put-image 2683 ;;from put-image
2695 (defun gdb-put-string (putstring pos &optional dprop &rest sprops) 2684 (defun gdb-put-string (putstring pos &optional dprop &rest sprops)
2696 "Put string PUTSTRING in front of POS in the current buffer. 2685 "Put string PUTSTRING in front of POS in the current buffer.
2965 (setq gdb-frame-address (match-string 1)))) 2954 (setq gdb-frame-address (match-string 1))))
2966 (goto-char (point-min)) 2955 (goto-char (point-min))
2967 (if (re-search-forward " source language \\(\\S-*\\)\." nil t) 2956 (if (re-search-forward " source language \\(\\S-*\\)\." nil t)
2968 (setq gdb-current-language (match-string 1))) 2957 (setq gdb-current-language (match-string 1)))
2969 (gdb-invalidate-assembler)) 2958 (gdb-invalidate-assembler))
2959
2970 2960
2971
2972 ;; For debugging Emacs only (assumes that usual stack buffer already exists).
2973 (defun gdb-xbacktrace ()
2974 "Generate a full lisp level backtrace with arguments."
2975 (interactive)
2976 (setq my-frames nil)
2977 (with-current-buffer (get-buffer-create "xbacktrace")
2978 (erase-buffer))
2979 (let (frame-number gdb-frame-number)
2980 (with-current-buffer (gdb-get-buffer 'gdb-stack-buffer)
2981 (save-excursion
2982 (goto-char (point-min))
2983 (while (search-forward "in Ffuncall " nil t)
2984 (goto-char (line-beginning-position))
2985 (looking-at "^#\\([0-9]+\\)")
2986 (push (match-string-no-properties 1) my-frames)
2987 (forward-line 1))))
2988 (dolist (frame my-frames)
2989 (gdb-enqueue-input (list (concat "server frame " frame "\n")
2990 'ignore))
2991 ; (gdb-enqueue-input (list "server ppargs\n" 'gdb-get-arguments))
2992 (gud-basic-call "server ppargs")
2993 )
2994 (gdb-enqueue-input (list (concat "server frame " frame-number "\n")
2995 'ignore))))
2996
2997 (defun gdb-get-arguments ()
2998 (with-current-buffer "xbacktrace"
2999 (insert-buffer-substring (gdb-get-buffer 'gdb-partial-output-buffer))))
3000
3001 ;; Code specific to GDB 6.4 2961 ;; Code specific to GDB 6.4
3002 (defconst gdb-source-file-regexp-1 "fullname=\"\\(.*?\\)\"") 2962 (defconst gdb-source-file-regexp-1 "fullname=\"\\(.*?\\)\"")
3003 2963
3004 (defun gdb-set-gud-minor-mode-existing-buffers-1 () 2964 (defun gdb-set-gud-minor-mode-existing-buffers-1 ()
3005 "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."
3006 (goto-char (point-min)) 2968 (goto-char (point-min))
3007 (while (re-search-forward gdb-source-file-regexp-1 nil t) 2969 (while (re-search-forward gdb-source-file-regexp-1 nil t)
3008 (push (match-string 1) gdb-source-file-list)) 2970 (push (match-string 1) gdb-source-file-list))
3009 (dolist (buffer (buffer-list)) 2971 (dolist (buffer (buffer-list))
3010 (with-current-buffer buffer 2972 (with-current-buffer buffer
3011 (when (member buffer-file-name gdb-source-file-list) 2973 (when (member buffer-file-name gdb-source-file-list)
3012 (set (make-local-variable 'gud-minor-mode) 'gdba) 2974 (set (make-local-variable 'gud-minor-mode)
2975 (buffer-local-value 'gud-minor-mode gud-comint-buffer))
3013 (set (make-local-variable 'tool-bar-map) gud-tool-bar-map) 2976 (set (make-local-variable 'tool-bar-map) gud-tool-bar-map)
3014 (when gud-tooltip-mode 2977 (when gud-tooltip-mode
3015 (make-local-variable 'gdb-define-alist) 2978 (make-local-variable 'gdb-define-alist)
3016 (gdb-create-define-alist) 2979 (gdb-create-define-alist)
3017 (add-hook 'after-save-hook 'gdb-create-define-alist nil t)))))) 2980 (add-hook 'after-save-hook 'gdb-create-define-alist nil t))))))
3018 2981
3019 ; Uses "-var-list-children --all-values". Needs GDB 6.1 onwards. 2982 ; Uses "-var-list-children --all-values". Needs GDB 6.1 onwards.
3020 (defun gdb-var-list-children-1 (varnum) 2983 (defun gdb-var-list-children-1 (varnum)
3021 (gdb-enqueue-input 2984 (gdb-enqueue-input
3022 (list (concat "server interpreter mi \"-var-update " varnum "\"\n") 2985 (list
3023 'ignore)) 2986 (if (eq (buffer-local-value 'gud-minor-mode gud-comint-buffer) 'gdba)
3024 (gdb-enqueue-input 2987 (concat "server interpreter mi \"-var-list-children --all-values "
3025 (list (concat "server interpreter mi \"-var-list-children --all-values " 2988 varnum "\"\n")
3026 varnum "\"\n") 2989 (concat "-var-list-children --all-values " varnum "\n"))
3027 `(lambda () (gdb-var-list-children-handler-1 ,varnum))))) 2990 `(lambda () (gdb-var-list-children-handler-1 ,varnum)))))
3028 2991
3029 (defconst gdb-var-list-children-regexp-1 2992 (defconst gdb-var-list-children-regexp-1
3030 "name=\"\\(.+?\\)\",exp=\"\\(.+?\\)\",numchild=\"\\(.+?\\)\",\ 2993 "name=\"\\(.+?\\)\",exp=\"\\(.+?\\)\",numchild=\"\\(.+?\\)\",\
3031 value=\\(\".*?\"\\),type=\"\\(.+?\\)\"}") 2994 value=\\(\".*?\"\\),type=\"\\(.+?\\)\"}")
3032 2995
3057 (defun gdb-var-update-1 () 3020 (defun gdb-var-update-1 ()
3058 (if (not (member 'gdb-var-update gdb-pending-triggers)) 3021 (if (not (member 'gdb-var-update gdb-pending-triggers))
3059 (progn 3022 (progn
3060 (gdb-enqueue-input 3023 (gdb-enqueue-input
3061 (list 3024 (list
3062 (if (with-current-buffer gud-comint-buffer (eq gud-minor-mode 'gdba)) 3025 (if (eq (buffer-local-value 'gud-minor-mode gud-comint-buffer) 'gdba)
3063 "server interpreter mi \"-var-update --all-values *\"\n" 3026 "server interpreter mi \"-var-update --all-values *\"\n"
3064 "-var-update --all-values *\n") 3027 "-var-update --all-values *\n")
3065 'gdb-var-update-handler-1)) 3028 'gdb-var-update-handler-1))
3066 (push 'gdb-var-update gdb-pending-triggers)))) 3029 (push 'gdb-var-update gdb-pending-triggers))))
3067 3030
3068 (defconst gdb-var-update-regexp-1 "name=\"\\(.*?\\)\",value=\\(\".*?\"\\),") 3031 (defconst gdb-var-update-regexp-1 "name=\"\\(.*?\\)\",value=\\(\".*?\"\\),")
3069 3032
3070 (defun gdb-var-update-handler-1 () 3033 (defun gdb-var-update-handler-1 ()
3096 'gdb-registers-buffer-name 3059 'gdb-registers-buffer-name
3097 'gdb-registers-mode) 3060 'gdb-registers-mode)
3098 3061
3099 (def-gdb-auto-update-trigger gdb-invalidate-registers-1 3062 (def-gdb-auto-update-trigger gdb-invalidate-registers-1
3100 (gdb-get-buffer 'gdb-registers-buffer) 3063 (gdb-get-buffer 'gdb-registers-buffer)
3101 (if (eq gud-minor-mode 'gdba) 3064 (if (eq (buffer-local-value 'gud-minor-mode gud-comint-buffer) 'gdba)
3102 "server interpreter mi \"-data-list-register-values x\"\n" 3065 "server interpreter mi \"-data-list-register-values x\"\n"
3103 "-data-list-register-values x\n") 3066 "-data-list-register-values x\n")
3104 gdb-data-list-register-values-handler) 3067 gdb-data-list-register-values-handler)
3105 3068
3106 (defconst gdb-data-list-register-values-regexp 3069 (defconst gdb-data-list-register-values-regexp
3155 mouse-face highlight)))) 3118 mouse-face highlight))))
3156 (forward-line 1)))))) 3119 (forward-line 1))))))
3157 3120
3158 ;; Needs GDB 6.4 onwards (used to fail with no stack). 3121 ;; Needs GDB 6.4 onwards (used to fail with no stack).
3159 (defun gdb-get-changed-registers () 3122 (defun gdb-get-changed-registers ()
3160 (if (not (member 'gdb-get-changed-registers gdb-pending-triggers)) 3123 (if (and (gdb-get-buffer 'gdb-registers-buffer)
3124 (not (member 'gdb-get-changed-registers gdb-pending-triggers)))
3161 (progn 3125 (progn
3162 (gdb-enqueue-input 3126 (gdb-enqueue-input
3163 (list 3127 (list
3164 (if (eq gud-minor-mode 'gdba) 3128 (if (eq (buffer-local-value 'gud-minor-mode gud-comint-buffer) 'gdba)
3165 "server interpreter mi -data-list-changed-registers\n" 3129 "server interpreter mi -data-list-changed-registers\n"
3166 "-data-list-changed-registers\n") 3130 "-data-list-changed-registers\n")
3167 'gdb-get-changed-registers-handler)) 3131 'gdb-get-changed-registers-handler))
3168 (push 'gdb-get-changed-registers gdb-pending-triggers)))) 3132 (push 'gdb-get-changed-registers gdb-pending-triggers))))
3169 3133
3170 (defconst gdb-data-list-register-names-regexp "\"\\(.*?\\)\"") 3134 (defconst gdb-data-list-register-names-regexp "\"\\(.*?\\)\"")
3171 3135
3172 (defun gdb-get-changed-registers-handler () 3136 (defun gdb-get-changed-registers-handler ()
3185 'gdb-locals-buffer-name 3149 'gdb-locals-buffer-name
3186 'gdb-locals-mode) 3150 'gdb-locals-mode)
3187 3151
3188 (def-gdb-auto-update-trigger gdb-invalidate-locals-1 3152 (def-gdb-auto-update-trigger gdb-invalidate-locals-1
3189 (gdb-get-buffer 'gdb-locals-buffer) 3153 (gdb-get-buffer 'gdb-locals-buffer)
3190 "server interpreter mi -\"stack-list-locals --simple-values\"\n" 3154 (if (eq (buffer-local-value 'gud-minor-mode gud-comint-buffer) 'gdba)
3155 "server interpreter mi -\"stack-list-locals --simple-values\"\n"
3156 "-stack-list-locals --simple-values\n")
3191 gdb-stack-list-locals-handler) 3157 gdb-stack-list-locals-handler)
3192 3158
3193 (defconst gdb-stack-list-locals-regexp 3159 (defconst gdb-stack-list-locals-regexp
3194 "name=\"\\(.*?\\)\",type=\"\\(.*?\\)\"") 3160 "name=\"\\(.*?\\)\",type=\"\\(.*?\\)\"")
3195 3161