diff options
| author | Nick Roberts | 2005-01-31 02:22:24 +0000 |
|---|---|---|
| committer | Nick Roberts | 2005-01-31 02:22:24 +0000 |
| commit | 37ebd64bd93a489e5f0ed61a2a4f936d111391e3 (patch) | |
| tree | 951dffdf279b05d0eac7c12e7c9c1586856da54c | |
| parent | 2d08f307e9ac4af5263bfcea672166354e601bbb (diff) | |
| download | emacs-37ebd64bd93a489e5f0ed61a2a4f936d111391e3.tar.gz emacs-37ebd64bd93a489e5f0ed61a2a4f936d111391e3.zip | |
(gdb-memory-address)
(gdb-memory-repeat-count, gdb-memory-format, gdb-memory-unit)
(gdb-memory-mode-map, gdb-memory-format-keymap)
(gdb-memory-format-menu, gdb-memory-unit-keymap)
(gdb-memory-unit-menu): New variables for a buffer
that lets the user examine program memory.
(gdb-memory-set-address, gdb-memory-set-repeat-count)
(gdb-memory-format-binary, gdb-memory-format-octal)
(gdb-memory-format-unsigned, gdb-memory-format-signed)
(gdb-memory-format-hexadecimal, gdb-memory-format-menu)
(gdb-memory-format-menu-1, gdb-memory-unit-giant)
(gdb-memory-unit-word, gdb-memory-unit-halfword)
(gdb-memory-unit-byte, gdb-memory-unit-menu)
(gdb-memory-unit-menu-1, gdb-make-header-line-mouse-map)
(gdb-memory-mode, gdb-memory-buffer-name)
(gdb-display-memory-buffer, gdb-frame-memory-buffer):
New functions for above buffer.
| -rw-r--r-- | lisp/progmodes/gdb-ui.el | 279 |
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) "\ | ||
| 1730 | Return a keymap with single entry for mouse key MOUSE on the header line. | ||
| 1731 | MOUSE is defined to run function FUNCTION with no args in the buffer | ||
| 1732 | corresponding 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)) |