aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYuan Fu2019-10-05 22:42:07 -0400
committerEli Zaretskii2020-02-08 11:46:54 +0200
commit07e1852c9b58ffa86443f61705e3dae4af0736f7 (patch)
treeef450586552bae025758d31d865939939b8ed207
parent30abcda54e1b0e15fc10b3db1c2b9f89ca521bfa (diff)
downloademacs-07e1852c9b58ffa86443f61705e3dae4af0736f7.tar.gz
emacs-07e1852c9b58ffa86443f61705e3dae4af0736f7.zip
Enhance memory address evaluation in gdb-mi
Before, the memory buffer evaluated the expression as address and used the fixed result in each stop. This change store the expression itself and reevaluates it in each stop to yield an address. We also add a warning (a red bold exclamation mark) on the header line when the content of the page doesn't represent the memory location user requested for. That happends when some error occurs in evaluating the address, and we display the last successfully displayed memory page. * lisp/progmodes/gdb-mi.el (gdb-memory-address-expression) (gdb--memory-display-warning): New variables. (gdb-memory-address): Change default value to nil; add docstring. (def-gdb-trigger-and-handler, gdb-invalidate-memory) (gdb-memory-set-address): Replace 'gdb-memory-address' with 'gdb-memory-address-expression'. (gdb-memory-header): Add code to display 'gdb-memory-address-expression' on header line. Move the mouse event from address to expression. Add code to display the warning. (gdb-memory-header): Fix the error from 'propertize' when 'gdb-memory-address-expression' or 'gdb-memory-address' is nil. (gdb-read-memory-custom): Change 'error' to 'user-error'. Add code to display the warning. (Bug#39180)
-rw-r--r--lisp/progmodes/gdb-mi.el57
1 files changed, 42 insertions, 15 deletions
diff --git a/lisp/progmodes/gdb-mi.el b/lisp/progmodes/gdb-mi.el
index e785acd2840..da5a2a503a6 100644
--- a/lisp/progmodes/gdb-mi.el
+++ b/lisp/progmodes/gdb-mi.el
@@ -105,13 +105,24 @@
105(defvar speedbar-initial-expansion-list-name) 105(defvar speedbar-initial-expansion-list-name)
106(defvar speedbar-frame) 106(defvar speedbar-frame)
107 107
108(defvar gdb-memory-address "main") 108(defvar-local gdb-memory-address-expression "main"
109(defvar gdb-memory-last-address nil 109 "This expression is passed to gdb.
110Possible value: main, $rsp, x+3.")
111(defvar-local gdb-memory-address nil
112 "Address of memory display.")
113(defvar-local gdb-memory-last-address nil
110 "Last successfully accessed memory address.") 114 "Last successfully accessed memory address.")
111(defvar gdb-memory-next-page nil 115(defvar gdb-memory-next-page nil
112 "Address of next memory page for program memory buffer.") 116 "Address of next memory page for program memory buffer.")
113(defvar gdb-memory-prev-page nil 117(defvar gdb-memory-prev-page nil
114 "Address of previous memory page for program memory buffer.") 118 "Address of previous memory page for program memory buffer.")
119(defvar-local gdb--memory-display-warning nil
120 "Display warning on memory header if t.
121
122When error occurs when retrieving memory, gdb-mi displays the
123last successful page. In that case the expression might not
124match the memory displayed. We want to let the user be aware of
125that, so display a warning exclamation mark in the header line.")
115 126
116(defvar gdb-thread-number nil 127(defvar gdb-thread-number nil
117 "Main current thread. 128 "Main current thread.
@@ -3450,7 +3461,7 @@ line."
3450(def-gdb-trigger-and-handler 3461(def-gdb-trigger-and-handler
3451 gdb-invalidate-memory 3462 gdb-invalidate-memory
3452 (format "-data-read-memory %s %s %d %d %d" 3463 (format "-data-read-memory %s %s %d %d %d"
3453 gdb-memory-address 3464 (gdb-mi-quote gdb-memory-address-expression)
3454 gdb-memory-format 3465 gdb-memory-format
3455 gdb-memory-unit 3466 gdb-memory-unit
3456 gdb-memory-rows 3467 gdb-memory-rows
@@ -3490,6 +3501,9 @@ in `gdb-memory-format'."
3490 (err-msg (bindat-get-field res 'msg))) 3501 (err-msg (bindat-get-field res 'msg)))
3491 (if (not err-msg) 3502 (if (not err-msg)
3492 (let ((memory (bindat-get-field res 'memory))) 3503 (let ((memory (bindat-get-field res 'memory)))
3504 (when gdb-memory-last-address
3505 ;; Nil means last retrieve emits error or just started the session.
3506 (setq gdb--memory-display-warning nil))
3493 (setq gdb-memory-address (bindat-get-field res 'addr)) 3507 (setq gdb-memory-address (bindat-get-field res 'addr))
3494 (setq gdb-memory-next-page (bindat-get-field res 'next-page)) 3508 (setq gdb-memory-next-page (bindat-get-field res 'next-page))
3495 (setq gdb-memory-prev-page (bindat-get-field res 'prev-page)) 3509 (setq gdb-memory-prev-page (bindat-get-field res 'prev-page))
@@ -3503,10 +3517,15 @@ in `gdb-memory-format'."
3503 gdb-memory-format))))) 3517 gdb-memory-format)))))
3504 (newline))) 3518 (newline)))
3505 ;; Show last page instead of empty buffer when out of bounds 3519 ;; Show last page instead of empty buffer when out of bounds
3506 (progn 3520 (when gdb-memory-last-address
3507 (let ((gdb-memory-address gdb-memory-last-address)) 3521 (let ((gdb-memory-address-expression gdb-memory-last-address))
3522 ;; If we don't set `gdb-memory-last-address' to nil,
3523 ;; `gdb-invalidate-memory' eventually calls
3524 ;; `gdb-read-memory-custom', making an infinite loop.
3525 (setq gdb-memory-last-address nil
3526 gdb--memory-display-warning t)
3508 (gdb-invalidate-memory 'update) 3527 (gdb-invalidate-memory 'update)
3509 (error err-msg)))))) 3528 (user-error "Error when retrieving memory: %s Displaying last successful page" err-msg))))))
3510 3529
3511(defvar gdb-memory-mode-map 3530(defvar gdb-memory-mode-map
3512 (let ((map (make-sparse-keymap))) 3531 (let ((map (make-sparse-keymap)))
@@ -3540,7 +3559,7 @@ in `gdb-memory-format'."
3540 "Set the start memory address." 3559 "Set the start memory address."
3541 (interactive) 3560 (interactive)
3542 (let ((arg (read-from-minibuffer "Memory address: "))) 3561 (let ((arg (read-from-minibuffer "Memory address: ")))
3543 (setq gdb-memory-address arg)) 3562 (setq gdb-memory-address-expression arg))
3544 (gdb-invalidate-memory 'update)) 3563 (gdb-invalidate-memory 'update))
3545 3564
3546(defmacro def-gdb-set-positive-number (name variable echo-string &optional doc) 3565(defmacro def-gdb-set-positive-number (name variable echo-string &optional doc)
@@ -3723,7 +3742,19 @@ DOC is an optional documentation string."
3723(defvar gdb-memory-header 3742(defvar gdb-memory-header
3724 '(:eval 3743 '(:eval
3725 (concat 3744 (concat
3726 "Start address[" 3745 "Start address "
3746 ;; If `gdb-memory-address-expression' is nil, `propertize' would error.
3747 (propertize (or gdb-memory-address-expression "N/A")
3748 'face font-lock-warning-face
3749 'help-echo "mouse-1: set start address"
3750 'mouse-face 'mode-line-highlight
3751 'local-map (gdb-make-header-line-mouse-map
3752 'mouse-1
3753 #'gdb-memory-set-address-event))
3754 (if gdb--memory-display-warning
3755 (propertize " !" 'face '(:inherit error :weight bold))
3756 "")
3757 " ["
3727 (propertize "-" 3758 (propertize "-"
3728 'face font-lock-warning-face 3759 'face font-lock-warning-face
3729 'help-echo "mouse-1: decrement address" 3760 'help-echo "mouse-1: decrement address"
@@ -3740,13 +3771,9 @@ DOC is an optional documentation string."
3740 'mouse-1 3771 'mouse-1
3741 #'gdb-memory-show-next-page)) 3772 #'gdb-memory-show-next-page))
3742 "]: " 3773 "]: "
3743 (propertize gdb-memory-address 3774 ;; If `gdb-memory-address' is nil, `propertize' would error.
3744 'face font-lock-warning-face 3775 (propertize (or gdb-memory-address "N/A")
3745 'help-echo "mouse-1: set start address" 3776 'face font-lock-warning-face)
3746 'mouse-face 'mode-line-highlight
3747 'local-map (gdb-make-header-line-mouse-map
3748 'mouse-1
3749 #'gdb-memory-set-address-event))
3750 " Rows: " 3777 " Rows: "
3751 (propertize (number-to-string gdb-memory-rows) 3778 (propertize (number-to-string gdb-memory-rows)
3752 'face font-lock-warning-face 3779 'face font-lock-warning-face