Mercurial > emacs
comparison lisp/gdb-ui.el @ 51617:cef03ad7bf21
(gud-display1): Keep the gdb command, "display", in
the command history.
(gdb-restore-windows): Make restore work when gdb-many-windows
is nil.
(gdb-source-info, gdba): Display assembler if there is no symbol
table for main, or message if there is no main.
(gdb-assembler-custom): Move point to current line of assembler.
author | Nick Roberts <nickrob@snap.net.nz> |
---|---|
date | Wed, 18 Jun 2003 22:37:40 +0000 |
parents | 39126c23006f |
children | 04628db4db1a |
comparison
equal
deleted
inserted
replaced
51616:25262b54af10 | 51617:cef03ad7bf21 |
---|---|
39 ;; Kingdon and uses GDB's annotation interface. You don't need to know about | 39 ;; Kingdon and uses GDB's annotation interface. You don't need to know about |
40 ;; annotations to use this mode as a debugger, but if you are interested | 40 ;; annotations to use this mode as a debugger, but if you are interested |
41 ;; developing the mode itself, then see the Annotations section in the GDB | 41 ;; developing the mode itself, then see the Annotations section in the GDB |
42 ;; info manual. | 42 ;; info manual. |
43 ;; | 43 ;; |
44 ;; Known Bugs: | 44 ;; Known Bugs: |
45 ;; Does not auto-display arrays of structures or structures containing arrays. | 45 ;; Does not auto-display arrays of structures or structures containing arrays. |
46 ;; On MS Windows, Gdb 5.1.1 from MinGW 2.0 does not flush the output from the | 46 ;; On MS Windows, Gdb 5.1.1 from MinGW 2.0 does not flush the output from the |
47 ;; inferior. | 47 ;; inferior. |
48 | 48 |
49 ;;; Code: | 49 ;;; Code: |
50 | 50 |
51 (require 'gud) | 51 (require 'gud) |
52 | 52 |
58 (defcustom gdb-window-width 30 | 58 (defcustom gdb-window-width 30 |
59 "Width of a frame for a displayed expression in GDB-UI." | 59 "Width of a frame for a displayed expression in GDB-UI." |
60 :type 'integer | 60 :type 'integer |
61 :group 'gud) | 61 :group 'gud) |
62 | 62 |
63 (defvar gdb-current-address nil "Initialisation for Assembler buffer.") | 63 (defvar gdb-current-address "main" "Initialisation for Assembler buffer.") |
64 (defvar gdb-previous-address nil) | 64 (defvar gdb-previous-address nil) |
65 (defvar gdb-previous-frame nil) | 65 (defvar gdb-previous-frame nil) |
66 (defvar gdb-current-frame "main") | |
66 (defvar gdb-display-in-progress nil) | 67 (defvar gdb-display-in-progress nil) |
67 (defvar gdb-dive nil) | 68 (defvar gdb-dive nil) |
68 (defvar gdb-view-source t "Non-nil means that source code can be viewed") | 69 (defvar gdb-view-source t "Non-nil means that source code can be viewed") |
69 (defvar gdb-selected-view 'source "Code type that user wishes to view") | 70 (defvar gdb-selected-view 'source "Code type that user wishes to view") |
70 (defvar gdb-buffer-type nil) | 71 (defvar gdb-buffer-type nil) |
160 ;; | 161 ;; |
161 ;; (re-)initialise | 162 ;; (re-)initialise |
162 (setq gdb-current-address "main") | 163 (setq gdb-current-address "main") |
163 (setq gdb-previous-address nil) | 164 (setq gdb-previous-address nil) |
164 (setq gdb-previous-frame nil) | 165 (setq gdb-previous-frame nil) |
166 (setq gdb-current-frame "main") | |
165 (setq gdb-display-in-progress nil) | 167 (setq gdb-display-in-progress nil) |
166 (setq gdb-dive nil) | 168 (setq gdb-dive nil) |
167 (setq gdb-view-source t) | 169 (setq gdb-view-source t) |
168 (setq gdb-selected-view 'source) | 170 (setq gdb-selected-view 'source) |
169 ;; | 171 ;; |
174 ;; | 176 ;; |
175 (if (eq window-system 'w32) | 177 (if (eq window-system 'w32) |
176 (gdb-enqueue-input (list "set new-console off\n" 'ignore))) | 178 (gdb-enqueue-input (list "set new-console off\n" 'ignore))) |
177 (gdb-enqueue-input (list "set height 0\n" 'ignore)) | 179 (gdb-enqueue-input (list "set height 0\n" 'ignore)) |
178 ;; find source file and compilation directory here | 180 ;; find source file and compilation directory here |
179 (gdb-enqueue-input (list "server list\n" 'ignore)) ; C program | 181 (gdb-enqueue-input (list "server list main\n" 'ignore)) ; C program |
180 (gdb-enqueue-input (list "server list MAIN__\n" 'ignore)) ; Fortran program | 182 (gdb-enqueue-input (list "server list MAIN__\n" 'ignore)) ; Fortran program |
181 (gdb-enqueue-input (list "server info source\n" | 183 (gdb-enqueue-input (list "server info source\n" |
182 'gdb-source-info)) | 184 'gdb-source-info)) |
183 ;; | 185 ;; |
184 (run-hooks 'gdba-mode-hook)) | 186 (run-hooks 'gdba-mode-hook)) |
199 (gdb-set-output-sink 'user) | 201 (gdb-set-output-sink 'user) |
200 (gud-call (concat "server ptype " expr))) | 202 (gud-call (concat "server ptype " expr))) |
201 (goto-char (- (point-max) 1)) | 203 (goto-char (- (point-max) 1)) |
202 (if (equal (char-before) (string-to-char "\*")) | 204 (if (equal (char-before) (string-to-char "\*")) |
203 (gdb-enqueue-input | 205 (gdb-enqueue-input |
204 (list (concat "server display* " expr "\n") 'ignore)) | 206 (list (concat "display* " expr "\n") 'ignore)) |
205 (gdb-enqueue-input | 207 (gdb-enqueue-input |
206 (list (concat "server display " expr "\n") 'ignore))))) | 208 (list (concat "display " expr "\n") 'ignore))))) |
207 | 209 |
208 ; this would messy because these bindings don't work with M-x gdb | 210 ; this would messy because these bindings don't work with M-x gdb |
209 ; (define-key global-map "\C-x\C-a\C-a" 'gud-display) | 211 ; (define-key global-map "\C-x\C-a\C-a" 'gud-display) |
210 ; (define-key gud-minor-mode-map "\C-c\C-a" 'gud-display) | 212 ; (define-key gud-minor-mode-map "\C-c\C-a" 'gud-display) |
211 | 213 |
742 (minibuffer . nil)))) | 744 (minibuffer . nil)))) |
743 (gdb-display-buffer (get-buffer gdb-expression-buffer-name))))) | 745 (gdb-display-buffer (get-buffer gdb-expression-buffer-name))))) |
744 (set-buffer (gdb-get-buffer 'gdb-partial-output-buffer)) | 746 (set-buffer (gdb-get-buffer 'gdb-partial-output-buffer)) |
745 (setq gdb-dive nil)) | 747 (setq gdb-dive nil)) |
746 | 748 |
747 (defvar gdb-current-frame nil) | |
748 (defvar gdb-nesting-level) | 749 (defvar gdb-nesting-level) |
749 (defvar gdb-expression) | 750 (defvar gdb-expression) |
750 (defvar gdb-point) | 751 (defvar gdb-point) |
751 (defvar gdb-annotation-arg) | 752 (defvar gdb-annotation-arg) |
752 | 753 |
2047 (defun gdb-display-gdb-buffer () | 2048 (defun gdb-display-gdb-buffer () |
2048 (interactive) | 2049 (interactive) |
2049 (gdb-display-buffer | 2050 (gdb-display-buffer |
2050 (gdb-get-create-buffer 'gdba))) | 2051 (gdb-get-create-buffer 'gdba))) |
2051 | 2052 |
2053 (defvar gdb-main-file nil "Source file from which program execution begins.") | |
2054 | |
2052 (defun gdb-view-source() | 2055 (defun gdb-view-source() |
2053 (interactive) | 2056 (interactive) |
2054 (if gdb-view-source | 2057 (if gdb-view-source |
2055 (if gud-last-last-frame | 2058 (if gud-last-last-frame |
2056 (set-window-buffer gdb-source-window | 2059 (set-window-buffer gdb-source-window |
2057 (gud-find-file (car gud-last-last-frame))) | 2060 (gud-find-file (car gud-last-last-frame))) |
2058 (set-window-buffer gdb-source-window (gud-find-file gdb-main-file)))) | 2061 (set-window-buffer gdb-source-window (gud-find-file gdb-main-file)))) |
2059 (setq gdb-selected-view 'source)) | 2062 (setq gdb-selected-view 'source)) |
2060 | 2063 |
2061 (defun gdb-view-assembler() | 2064 (defun gdb-view-assembler() |
2062 (interactive) | 2065 (interactive) |
2063 (set-window-buffer gdb-source-window | 2066 (set-window-buffer gdb-source-window |
2064 (gdb-get-create-buffer 'gdb-assembler-buffer)) | 2067 (gdb-get-create-buffer 'gdb-assembler-buffer)) |
2065 (setq gdb-selected-view 'assembler)) | 2068 (setq gdb-selected-view 'assembler)) |
2066 | 2069 |
2067 ;(defun gdb-view-both() | 2070 ;(defun gdb-view-both() |
2068 ;(interactive) | 2071 ;(interactive) |
2069 ;(setq gdb-selected-view 'both)) | 2072 ;(setq gdb-selected-view 'both)) |
2070 | |
2071 (defvar gdb-main-file nil "Source file from which program execution begins.") | |
2072 | 2073 |
2073 ;; layout for all the windows | 2074 ;; layout for all the windows |
2074 (defun gdb-setup-windows () | 2075 (defun gdb-setup-windows () |
2075 (gdb-display-locals-buffer) | 2076 (gdb-display-locals-buffer) |
2076 (gdb-display-stack-buffer) | 2077 (gdb-display-stack-buffer) |
2133 (switch-to-buffer | 2134 (switch-to-buffer |
2134 (if gud-last-last-frame | 2135 (if gud-last-last-frame |
2135 (gud-find-file (car gud-last-last-frame)) | 2136 (gud-find-file (car gud-last-last-frame)) |
2136 (gud-find-file gdb-main-file))) | 2137 (gud-find-file gdb-main-file))) |
2137 (switch-to-buffer (gdb-get-create-buffer 'gdb-assembler-buffer))) | 2138 (switch-to-buffer (gdb-get-create-buffer 'gdb-assembler-buffer))) |
2139 (setq gdb-source-window (get-buffer-window (current-buffer))) | |
2138 (other-window 1))) | 2140 (other-window 1))) |
2139 | 2141 |
2140 (defun gdb-reset () | 2142 (defun gdb-reset () |
2141 "Exit a debugging session cleanly by killing the gdb buffers and resetting | 2143 "Exit a debugging session cleanly by killing the gdb buffers and resetting |
2142 the source buffers." | 2144 the source buffers." |
2162 | 2164 |
2163 (defun gdb-source-info () | 2165 (defun gdb-source-info () |
2164 "Find the source file where the program starts and displays it with related | 2166 "Find the source file where the program starts and displays it with related |
2165 buffers." | 2167 buffers." |
2166 (goto-char (point-min)) | 2168 (goto-char (point-min)) |
2167 (when (search-forward "directory is " nil t) | 2169 (if (search-forward "directory is " nil t) |
2168 (if (looking-at "\\S-*:\\(\\S-*\\)") | 2170 (progn |
2169 (setq gdb-cdir (match-string 1)) | 2171 (if (looking-at "\\S-*:\\(\\S-*\\)") |
2170 (looking-at "\\S-*") | 2172 (setq gdb-cdir (match-string 1)) |
2171 (setq gdb-cdir (match-string 0))) | 2173 (looking-at "\\S-*") |
2172 (search-forward "Located in ") | 2174 (setq gdb-cdir (match-string 0))) |
2173 (looking-at "\\S-*") | 2175 (search-forward "Located in ") |
2174 (setq gdb-main-file (match-string 0)) | 2176 (looking-at "\\S-*") |
2175 ;; Make sure we are not in the minibuffer window when we try to delete | 2177 (setq gdb-main-file (match-string 0))) |
2176 ;; all other windows. | 2178 (setq gdb-view-source nil)) |
2177 (if (window-minibuffer-p (selected-window)) | 2179 (delete-other-windows) |
2178 (other-window 1)) | 2180 (if gdb-many-windows |
2181 (gdb-setup-windows) | |
2182 (gdb-display-breakpoints-buffer) | |
2183 (gdb-display-display-buffer) | |
2179 (delete-other-windows) | 2184 (delete-other-windows) |
2180 (if gdb-many-windows | 2185 (split-window) |
2181 (gdb-setup-windows) | 2186 (other-window 1) |
2182 (gdb-display-breakpoints-buffer) | 2187 (if gdb-view-source |
2183 (gdb-display-display-buffer) | 2188 (switch-to-buffer (gud-find-file gdb-main-file)) |
2184 (delete-other-windows) | 2189 (switch-to-buffer (gdb-get-create-buffer 'gdb-assembler-buffer)) |
2185 (split-window) | 2190 (gdb-invalidate-assembler)) |
2186 (other-window 1) | 2191 (setq gdb-source-window (get-buffer-window (current-buffer))) |
2187 (switch-to-buffer (gud-find-file gdb-main-file)) | 2192 (other-window 1))) |
2188 (setq gdb-source-window (get-buffer-window (current-buffer))) | |
2189 (other-window 1)))) | |
2190 | 2193 |
2191 ;;from put-image | 2194 ;;from put-image |
2192 (defun gdb-put-string (putstring pos) | 2195 (defun gdb-put-string (putstring pos) |
2193 "Put string PUTSTRING in front of POS in the current buffer. | 2196 "Put string PUTSTRING in front of POS in the current buffer. |
2194 PUTSTRING is displayed by putting an overlay into the current buffer with a | 2197 PUTSTRING is displayed by putting an overlay into the current buffer with a |
2292 gdb-assembler-handler | 2295 gdb-assembler-handler |
2293 gdb-assembler-custom) | 2296 gdb-assembler-custom) |
2294 | 2297 |
2295 (defun gdb-assembler-custom () | 2298 (defun gdb-assembler-custom () |
2296 (let ((buffer (gdb-get-buffer 'gdb-assembler-buffer)) | 2299 (let ((buffer (gdb-get-buffer 'gdb-assembler-buffer)) |
2297 (address) (flag)) | 2300 (gdb-arrow-position 1) (address) (flag)) |
2298 (with-current-buffer buffer | 2301 (with-current-buffer buffer |
2299 (if (not (equal gdb-current-address "main")) | 2302 (if (not (equal gdb-current-address "main")) |
2300 (progn | 2303 (progn |
2301 (gdb-remove-arrow) | 2304 (gdb-remove-arrow) |
2302 (goto-char (point-min)) | 2305 (goto-char (point-min)) |
2303 (if (re-search-forward gdb-current-address nil t) | 2306 (if (re-search-forward gdb-current-address nil t) |
2304 (gdb-put-arrow "=>" (point))))) | 2307 (progn |
2308 (setq gdb-arrow-position (point)) | |
2309 (gdb-put-arrow "=>" (point)))))) | |
2305 ;; remove all breakpoint-icons in assembler buffer before updating. | 2310 ;; remove all breakpoint-icons in assembler buffer before updating. |
2306 (if (eq window-system 'x) | 2311 (if (eq window-system 'x) |
2307 (remove-images (point-min) (point-max)) | 2312 (remove-images (point-min) (point-max)) |
2308 (gdb-remove-strings (point-min) (point-max)))) | 2313 (gdb-remove-strings (point-min) (point-max)))) |
2309 (with-current-buffer (gdb-get-buffer 'gdb-breakpoints-buffer) | 2314 (with-current-buffer (gdb-get-buffer 'gdb-breakpoints-buffer) |
2337 "breakpoint icon disabled" | 2342 "breakpoint icon disabled" |
2338 'left-margin))) | 2343 'left-margin))) |
2339 (gdb-remove-strings start end) | 2344 (gdb-remove-strings start end) |
2340 (if (eq ?y flag) | 2345 (if (eq ?y flag) |
2341 (gdb-put-string "B" (+ start 1)) | 2346 (gdb-put-string "B" (+ start 1)) |
2342 (gdb-put-string "b" (+ start 1))))))))))))) | 2347 (gdb-put-string "b" (+ start 1))))))))))) |
2348 (if (not (equal gdb-current-address "main")) | |
2349 (set-window-point (get-buffer-window buffer) gdb-arrow-position)))) | |
2343 | 2350 |
2344 (defvar gdb-assembler-mode-map | 2351 (defvar gdb-assembler-mode-map |
2345 (let ((map (make-sparse-keymap))) | 2352 (let ((map (make-sparse-keymap))) |
2346 (suppress-keymap map) | 2353 (suppress-keymap map) |
2347 map)) | 2354 map)) |