aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lisp/progmodes/gdb-ui.el279
1 files changed, 275 insertions, 4 deletions
diff --git a/lisp/progmodes/gdb-ui.el b/lisp/progmodes/gdb-ui.el
index 2769023605e..54c43d1df36 100644
--- a/lisp/progmodes/gdb-ui.el
+++ b/lisp/progmodes/gdb-ui.el
@@ -53,8 +53,14 @@
53;; Known Bugs: 53;; Known Bugs:
54;; 54;;
55;; TODO: 55;; TODO:
56;; Use tree-widget.el instead of the speedbar for watch-expressions? 56;; 1) Use MI command -data-read-memory for memory window.
57;; Mark breakpoint locations on scroll-bar of source buffer? 57;; 2) Highlight changed register values (use MI commands
58;; -data-list-register-values and -data-list-changed-registers instead
59;; of 'info registers'.
60;; 3) Use tree-widget.el instead of the speedbar for watch-expressions?
61;; 4) Mark breakpoint locations on scroll-bar of source buffer?
62;; 5) After release of 21.4 use '-var-list-children --all-values'
63;; and '-stack-list-locals 2' which need GDB 6.1 onwards.
58 64
59;;; Code: 65;;; Code:
60 66
@@ -62,6 +68,7 @@
62 68
63(defvar gdb-current-address "main" "Initialisation for Assembler buffer.") 69(defvar gdb-current-address "main" "Initialisation for Assembler buffer.")
64(defvar gdb-previous-address nil) 70(defvar gdb-previous-address nil)
71(defvar gdb-memory-address "main")
65(defvar gdb-previous-frame nil) 72(defvar gdb-previous-frame nil)
66(defvar gdb-current-frame nil) 73(defvar gdb-current-frame nil)
67(defvar gdb-current-stack-level nil) 74(defvar gdb-current-stack-level nil)
@@ -227,6 +234,7 @@ detailed description of this mode.
227 ;; (re-)initialize 234 ;; (re-)initialize
228 (setq gdb-current-address "main") 235 (setq gdb-current-address "main")
229 (setq gdb-previous-address nil) 236 (setq gdb-previous-address nil)
237 (setq gdb-memory-address "main")
230 (setq gdb-previous-frame nil) 238 (setq gdb-previous-frame nil)
231 (setq gdb-current-frame nil) 239 (setq gdb-current-frame nil)
232 (setq gdb-current-stack-level nil) 240 (setq gdb-current-stack-level nil)
@@ -840,6 +848,7 @@ happens to be appropriate."
840 (gdb-invalidate-breakpoints) 848 (gdb-invalidate-breakpoints)
841 (gdb-invalidate-assembler) 849 (gdb-invalidate-assembler)
842 (gdb-invalidate-registers) 850 (gdb-invalidate-registers)
851 (gdb-invalidate-memory)
843 (gdb-invalidate-locals) 852 (gdb-invalidate-locals)
844 (gdb-invalidate-threads) 853 (gdb-invalidate-threads)
845 (unless (eq system-type 'darwin) ;Breaks on Darwin's GDB-5.3. 854 (unless (eq system-type 'darwin) ;Breaks on Darwin's GDB-5.3.
@@ -1521,8 +1530,268 @@ static char *magick[] = {
1521 (let ((special-display-regexps (append special-display-regexps '(".*"))) 1530 (let ((special-display-regexps (append special-display-regexps '(".*")))
1522 (special-display-frame-alist gdb-frame-parameters)) 1531 (special-display-frame-alist gdb-frame-parameters))
1523 (display-buffer (gdb-get-create-buffer 'gdb-registers-buffer)))) 1532 (display-buffer (gdb-get-create-buffer 'gdb-registers-buffer))))
1524 1533
1534;; Memory buffer.
1525;; 1535;;
1536(defcustom gdb-memory-repeat-count 32
1537 "Number of data items in memory window."
1538 :type 'integer
1539 :group 'gud
1540 :version "21.4")
1541
1542(defcustom gdb-memory-format "x"
1543 "Display format of data items in memory window."
1544 :type '(choice (const :tag "Hexadecimal" "x")
1545 (const :tag "Signed decimal" "d")
1546 (const :tag "Unsigned decimal" "u")
1547 (const :tag "Octal" "o")
1548 (const :tag "Binary" "t"))
1549 :group 'gud
1550 :version "21.4")
1551
1552(defcustom gdb-memory-unit "w"
1553 "Unit size of data items in memory window."
1554 :type '(choice (const :tag "Byte" "b")
1555 (const :tag "Halfword" "h")
1556 (const :tag "Word" "w")
1557 (const :tag "Giant word" "g"))
1558 :group 'gud
1559 :version "21.4")
1560
1561(gdb-set-buffer-rules 'gdb-memory-buffer
1562 'gdb-memory-buffer-name
1563 'gdb-memory-mode)
1564
1565(def-gdb-auto-updated-buffer gdb-memory-buffer
1566 gdb-invalidate-memory
1567 (concat gdb-server-prefix "x/" (number-to-string gdb-memory-repeat-count)
1568 gdb-memory-format gdb-memory-unit " " gdb-memory-address "\n")
1569 gdb-read-memory-handler
1570 gdb-read-memory-custom)
1571
1572(defun gdb-read-memory-custom ())
1573
1574(defvar gdb-memory-mode-map
1575 (let ((map (make-sparse-keymap)))
1576 (suppress-keymap map)
1577 (define-key map "q" 'kill-this-buffer)
1578 map))
1579
1580(defun gdb-memory-set-address (event)
1581 "Set the start memory address."
1582 (interactive "e")
1583 (save-selected-window
1584 (select-window (posn-window (event-start event)))
1585 (let ((arg (read-from-minibuffer "Memory address: ")))
1586 (setq gdb-memory-address arg))
1587 (gdb-invalidate-memory)))
1588
1589(defun gdb-memory-set-repeat-count (event)
1590 "Set the number of data items in memory window."
1591 (interactive "e")
1592 (save-selected-window
1593 (select-window (posn-window (event-start event)))
1594 (let* ((arg (read-from-minibuffer "Repeat count: "))
1595 (count (string-to-int arg)))
1596 (if (< count 0)
1597 (error "Non-negative numbers only")
1598 (customize-set-variable 'gdb-memory-repeat-count count)
1599 (gdb-invalidate-memory)))))
1600
1601(defun gdb-memory-format-binary ()
1602 "Set the display format to binary."
1603 (interactive)
1604 (customize-set-variable 'gdb-memory-format "t")
1605 (gdb-invalidate-memory))
1606
1607(defun gdb-memory-format-octal ()
1608 "Set the display format to octal."
1609 (interactive)
1610 (customize-set-variable 'gdb-memory-format "o")
1611 (gdb-invalidate-memory))
1612
1613(defun gdb-memory-format-unsigned ()
1614 "Set the display format to unsigned decimal."
1615 (interactive)
1616 (customize-set-variable 'gdb-memory-format "u")
1617 (gdb-invalidate-memory))
1618
1619(defun gdb-memory-format-signed ()
1620 "Set the display format to decimal."
1621 (interactive)
1622 (customize-set-variable 'gdb-memory-format "d")
1623 (gdb-invalidate-memory))
1624
1625(defun gdb-memory-format-hexadecimal ()
1626 "Set the display format to hexadecimal."
1627 (interactive)
1628 (customize-set-variable 'gdb-memory-format "x")
1629 (gdb-invalidate-memory))
1630
1631(defvar gdb-memory-format-keymap
1632 (let ((map (make-sparse-keymap)))
1633 (define-key map [header-line down-mouse-3] 'gdb-memory-format-menu-1)
1634 map)
1635 "Keymap to select format in the header line.")
1636
1637(defvar gdb-memory-format-menu (make-sparse-keymap "Format")
1638 "Menu of display formats in the header line.")
1639
1640(define-key gdb-memory-format-menu [binary]
1641 '(menu-item "Binary" gdb-memory-format-binary
1642 :button (:radio . (equal gdb-memory-format "t"))))
1643(define-key gdb-memory-format-menu [octal]
1644 '(menu-item "Octal" gdb-memory-format-octal
1645 :button (:radio . (equal gdb-memory-format "o"))))
1646(define-key gdb-memory-format-menu [unsigned]
1647 '(menu-item "Unsigned Decimal" gdb-memory-format-unsigned
1648 :button (:radio . (equal gdb-memory-format "u"))))
1649(define-key gdb-memory-format-menu [signed]
1650 '(menu-item "Signed Decimal" gdb-memory-format-signed
1651 :button (:radio . (equal gdb-memory-format "d"))))
1652(define-key gdb-memory-format-menu [hexadecimal]
1653 '(menu-item "Hexadecimal" gdb-memory-format-hexadecimal
1654 :button (:radio . (equal gdb-memory-format "x"))))
1655
1656(defun gdb-memory-format-menu (event)
1657 (interactive "@e")
1658 (x-popup-menu event gdb-memory-format-menu))
1659
1660(defun gdb-memory-format-menu-1 (event)
1661 (interactive "e")
1662 (save-selected-window
1663 (select-window (posn-window (event-start event)))
1664 (let* ((selection (gdb-memory-format-menu event))
1665 (binding (and selection (lookup-key gdb-memory-format-menu
1666 (vector (car selection))))))
1667 (if binding (call-interactively binding)))))
1668
1669(defun gdb-memory-unit-giant ()
1670 "Set the unit size to giant words (eight bytes)."
1671 (interactive)
1672 (customize-set-variable 'gdb-memory-unit "g")
1673 (gdb-invalidate-memory))
1674
1675(defun gdb-memory-unit-word ()
1676 "Set the unit size to words (four bytes)."
1677 (interactive)
1678 (customize-set-variable 'gdb-memory-unit "w")
1679 (gdb-invalidate-memory))
1680
1681(defun gdb-memory-unit-halfword ()
1682 "Set the unit size to halfwords (two bytes)."
1683 (interactive)
1684 (customize-set-variable 'gdb-memory-unit "h")
1685 (gdb-invalidate-memory))
1686
1687(defun gdb-memory-unit-byte ()
1688 "Set the unit size to bytes."
1689 (interactive)
1690 (customize-set-variable 'gdb-memory-unit "b")
1691 (gdb-invalidate-memory))
1692
1693(defvar gdb-memory-unit-keymap
1694 (let ((map (make-sparse-keymap)))
1695 (define-key map [header-line down-mouse-3] 'gdb-memory-unit-menu-1)
1696 map)
1697 "Keymap to select units in the header line.")
1698
1699(defvar gdb-memory-unit-menu (make-sparse-keymap "Unit")
1700 "Menu of units in the header line.")
1701
1702(define-key gdb-memory-unit-menu [giantwords]
1703 '(menu-item "Giant words" gdb-memory-unit-giant
1704 :button (:radio . (equal gdb-memory-unit "g"))))
1705(define-key gdb-memory-unit-menu [words]
1706 '(menu-item "Words" gdb-memory-unit-word
1707 :button (:radio . (equal gdb-memory-unit "w"))))
1708(define-key gdb-memory-unit-menu [halfwords]
1709 '(menu-item "Halfwords" gdb-memory-unit-halfword
1710 :button (:radio . (equal gdb-memory-unit "h"))))
1711(define-key gdb-memory-unit-menu [bytes]
1712 '(menu-item "Bytes" gdb-memory-unit-byte
1713 :button (:radio . (equal gdb-memory-unit "b"))))
1714
1715(defun gdb-memory-unit-menu (event)
1716 (interactive "@e")
1717 (x-popup-menu event gdb-memory-unit-menu))
1718
1719(defun gdb-memory-unit-menu-1 (event)
1720 (interactive "e")
1721 (save-selected-window
1722 (select-window (posn-window (event-start event)))
1723 (let* ((selection (gdb-memory-unit-menu event))
1724 (binding (and selection (lookup-key gdb-memory-unit-menu
1725 (vector (car selection))))))
1726 (if binding (call-interactively binding)))))
1727
1728;;from make-mode-line-mouse-map
1729(defun gdb-make-header-line-mouse-map (mouse function) "\
1730Return a keymap with single entry for mouse key MOUSE on the header line.
1731MOUSE is defined to run function FUNCTION with no args in the buffer
1732corresponding to the mode line clicked."
1733 (let ((map (make-sparse-keymap)))
1734 (define-key map (vector 'header-line mouse) function)
1735 (define-key map (vector 'header-line 'down-mouse-1) 'ignore)
1736 map))
1737
1738(defun gdb-memory-mode ()
1739 "Major mode for examining memory.
1740
1741\\{gdb-memory-mode-map}"
1742 (kill-all-local-variables)
1743 (setq major-mode 'gdb-memory-mode)
1744 (setq mode-name "Memory")
1745 (setq buffer-read-only t)
1746 (use-local-map gdb-memory-mode-map)
1747 (setq header-line-format
1748 '(:eval
1749 (concat
1750 "Read address: "
1751 (propertize gdb-memory-address
1752 'face font-lock-warning-face
1753 'help-echo (purecopy "mouse-1: Set memory address")
1754 'local-map (purecopy (gdb-make-header-line-mouse-map
1755 'mouse-1
1756 #'gdb-memory-set-address)))
1757 " Repeat Count: "
1758 (propertize (number-to-string gdb-memory-repeat-count)
1759 'face font-lock-warning-face
1760 'help-echo (purecopy "mouse-1: Set repeat count")
1761 'local-map (purecopy (gdb-make-header-line-mouse-map
1762 'mouse-1
1763 #'gdb-memory-set-repeat-count)))
1764 " Display Format: "
1765 (propertize gdb-memory-format
1766 'face font-lock-warning-face
1767 'help-echo (purecopy "mouse-3: Select display format")
1768 'local-map gdb-memory-format-keymap)
1769 " Unit Size: "
1770 (propertize gdb-memory-unit
1771 'face font-lock-warning-face
1772 'help-echo (purecopy "mouse-3: Select unit size")
1773 'local-map gdb-memory-unit-keymap))))
1774 (run-mode-hooks 'gdb-memory-mode-hook)
1775 'gdb-invalidate-memory)
1776
1777(defun gdb-memory-buffer-name ()
1778 (with-current-buffer gud-comint-buffer
1779 (concat "*memory of " (gdb-get-target-string) "*")))
1780
1781(defun gdb-display-memory-buffer ()
1782 "Display memory contents."
1783 (interactive)
1784 (gdb-display-buffer
1785 (gdb-get-create-buffer 'gdb-memory-buffer)))
1786
1787(defun gdb-frame-memory-buffer ()
1788 "Display memory contents in a new frame."
1789 (interactive)
1790 (let ((special-display-regexps (append special-display-regexps '(".*")))
1791 (special-display-frame-alist gdb-frame-parameters))
1792 (display-buffer (gdb-get-create-buffer 'gdb-memory-buffer))))
1793
1794
1526;; Locals buffer. 1795;; Locals buffer.
1527;; 1796;;
1528(gdb-set-buffer-rules 'gdb-locals-buffer 1797(gdb-set-buffer-rules 'gdb-locals-buffer
@@ -1633,6 +1902,7 @@ static char *magick[] = {
1633 `(menu-item "GDB-Frames" ,menu :visible (eq gud-minor-mode 'gdba))) 1902 `(menu-item "GDB-Frames" ,menu :visible (eq gud-minor-mode 'gdba)))
1634 (define-key menu [gdb] '("Gdb" . gdb-frame-gdb-buffer)) 1903 (define-key menu [gdb] '("Gdb" . gdb-frame-gdb-buffer))
1635 (define-key menu [threads] '("Threads" . gdb-frame-threads-buffer)) 1904 (define-key menu [threads] '("Threads" . gdb-frame-threads-buffer))
1905 (define-key menu [memory] '("Memory" . gdb-frame-memory-buffer))
1636 (define-key menu [assembler] '("Machine" . gdb-frame-assembler-buffer)) 1906 (define-key menu [assembler] '("Machine" . gdb-frame-assembler-buffer))
1637 (define-key menu [registers] '("Registers" . gdb-frame-registers-buffer)) 1907 (define-key menu [registers] '("Registers" . gdb-frame-registers-buffer))
1638 (define-key menu [locals] '("Locals" . gdb-frame-locals-buffer)) 1908 (define-key menu [locals] '("Locals" . gdb-frame-locals-buffer))
@@ -1643,8 +1913,9 @@ static char *magick[] = {
1643 (define-key gud-menu-map [displays] 1913 (define-key gud-menu-map [displays]
1644 `(menu-item "GDB-Windows" ,menu :visible (eq gud-minor-mode 'gdba))) 1914 `(menu-item "GDB-Windows" ,menu :visible (eq gud-minor-mode 'gdba)))
1645 (define-key menu [gdb] '("Gdb" . gdb-display-gdb-buffer)) 1915 (define-key menu [gdb] '("Gdb" . gdb-display-gdb-buffer))
1646 (define-key menu [assembler] '("Machine" . gdb-display-assembler-buffer))
1647 (define-key menu [threads] '("Threads" . gdb-display-threads-buffer)) 1916 (define-key menu [threads] '("Threads" . gdb-display-threads-buffer))
1917 (define-key menu [memory] '("Memory" . gdb-display-memory-buffer))
1918 (define-key menu [assembler] '("Machine" . gdb-display-assembler-buffer))
1648 (define-key menu [registers] '("Registers" . gdb-display-registers-buffer)) 1919 (define-key menu [registers] '("Registers" . gdb-display-registers-buffer))
1649 (define-key menu [locals] '("Locals" . gdb-display-locals-buffer)) 1920 (define-key menu [locals] '("Locals" . gdb-display-locals-buffer))
1650 (define-key menu [frames] '("Stack" . gdb-display-stack-buffer)) 1921 (define-key menu [frames] '("Stack" . gdb-display-stack-buffer))