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))