comparison lisp/gdb-ui.el @ 48498:8fdedd7dca85

General tidying. Patches from Stefan Monnier.
author Nick Roberts <nickrob@snap.net.nz>
date Thu, 21 Nov 2002 21:07:01 +0000
parents 69646014abb3
children 3216cd45d6d2
comparison
equal deleted inserted replaced
48497:016a2985b8c6 48498:8fdedd7dca85
39 39
40 (defvar gdb-main-file nil "Source file from which program execution begins.") 40 (defvar gdb-main-file nil "Source file from which program execution begins.")
41 (defvar gdb-cdir nil "Compilation directory.") 41 (defvar gdb-cdir nil "Compilation directory.")
42 (defvar gdb-main-or-pc nil "Initialisation for Assembler buffer.") 42 (defvar gdb-main-or-pc nil "Initialisation for Assembler buffer.")
43 (defvar gdb-prev-main-or-pc nil) 43 (defvar gdb-prev-main-or-pc nil)
44 (defvar gdb-current-address nil)
45 (defvar gdb-current-frame nil)
46 (defvar gdb-display-in-progress nil)
47 (defvar gdb-dive nil)
48 (defvar gdb-first-time nil)
49 (defvar breakpoint-enabled-icon
50 "Icon for enabled breakpoint in display margin")
51 (defvar breakpoint-disabled-icon
52 "Icon for disabled breakpoint in display margin")
53 (defvar gdb-nesting-level)
54 (defvar gdb-expression-buffer-name)
55 (defvar gdb-expression)
56 (defvar gdb-point)
57 (defvar gdb-annotation-arg)
58 (defvar gdb-array-start)
59 (defvar gdb-array-stop)
60 (defvar gdb-display-number)
61 (defvar gdb-dive-display-number)
62 (defvar gdb-dive-map nil)
63 (defvar gdb-display-string)
64 (defvar gdb-values)
65 (defvar gdb-array-size)
66 (defvar gdb-array-slice-map nil)
67 (defvar gdb-buffer-instance nil)
68 (defvar gdb-source-window nil)
69 (defvar gdb-target-name "--unknown--"
70 "The apparent name of the program being debugged in a gud buffer.")
44 71
45 (defun gdba (command-line) 72 (defun gdba (command-line)
46 "Run gdb on program FILE in buffer *gdb-FILE*. 73 "Run gdb on program FILE in buffer *gdb-FILE*.
47 The directory containing FILE becomes the initial working directory 74 The directory containing FILE becomes the initial working directory
48 and source-file directory for your debugger. 75 and source-file directory for your debugger.
287 ;; gdb-instance objects 314 ;; gdb-instance objects
288 ;; 315 ;;
289 316
290 (defun make-gdb-instance (proc) 317 (defun make-gdb-instance (proc)
291 "Create a gdb instance object from a gdb process." 318 "Create a gdb instance object from a gdb process."
292 (setq last-proc proc)
293 (let ((instance (cons 'gdb-instance proc))) 319 (let ((instance (cons 'gdb-instance proc)))
294 (save-excursion 320 (with-current-buffer (process-buffer proc)
295 (set-buffer (process-buffer proc))
296 (setq gdb-buffer-instance instance) 321 (setq gdb-buffer-instance instance)
297 (progn 322 (progn
298 (mapcar 'make-variable-buffer-local gdb-instance-variables) 323 (mapc 'make-local-variable gdb-instance-variables)
299 (setq gdb-buffer-type 'gdba) 324 (setq gdb-buffer-type 'gdba)
300 ;; If we're taking over the buffer of another process, 325 ;; If we're taking over the buffer of another process,
301 ;; take over it's ancillery buffers as well. 326 ;; take over it's ancillary buffers as well.
302 ;; 327 ;;
303 (let ((dead (or old-gdb-buffer-instance))) 328 (let ((dead old-gdb-buffer-instance))
304 (mapcar 329 (dolist (b (buffer-list))
305 (function
306 (lambda (b)
307 (progn
308 (set-buffer b) 330 (set-buffer b)
309 (if (eq dead gdb-buffer-instance) 331 (if (eq dead gdb-buffer-instance)
310 (setq gdb-buffer-instance instance))))) 332 (setq gdb-buffer-instance instance))))))
311 (buffer-list)))))
312 instance)) 333 instance))
313 334
314 (defun gdb-instance-process (inst) (cdr inst)) 335 (defun gdb-instance-process (inst) (cdr inst))
315 336
316 ;;; The list of instance variables is built up by the expansions of 337 ;;; The list of instance variables is built up by the expansions of
318 ;;; 339 ;;;
319 (defvar gdb-instance-variables '() 340 (defvar gdb-instance-variables '()
320 "A list of variables that are local to the GUD buffer associated 341 "A list of variables that are local to the GUD buffer associated
321 with a gdb instance.") 342 with a gdb instance.")
322 343
323 (defmacro def-gdb-variable 344 (defmacro def-gdb-variable (name accessor setter &optional default doc)
324 (name accessor setter &optional default doc)
325 `(progn 345 `(progn
326 (defvar ,name ,default ,(or doc "undocumented")) 346 (defvar ,name ,default ,(or doc "undocumented"))
327 (if (not (memq ',name gdb-instance-variables)) 347 (if (not (memq ',name gdb-instance-variables))
328 (setq gdb-instance-variables 348 (setq gdb-instance-variables
329 (cons ',name gdb-instance-variables))) 349 (cons ',name gdb-instance-variables)))
1157 (let ((gdb-value-list (split-string gdb-values ", "))) 1177 (let ((gdb-value-list (split-string gdb-values ", ")))
1158 (string-match "\\({+\\)" (car gdb-value-list)) 1178 (string-match "\\({+\\)" (car gdb-value-list))
1159 (let* ((depth (- (match-end 1) (match-beginning 1))) 1179 (let* ((depth (- (match-end 1) (match-beginning 1)))
1160 (indices (make-vector depth '0)) 1180 (indices (make-vector depth '0))
1161 (index 0) (num 0) (array-start "") 1181 (index 0) (num 0) (array-start "")
1162 (array-stop "") (array-slice "") 1182 (array-stop "") (array-slice "") (array-range nil)
1163 (flag t) (indices-string "")) 1183 (flag t) (indices-string ""))
1164 (while gdb-value-list 1184 (while gdb-value-list
1165 (string-match "{*\\([^}]*\\)\\(}*\\)" (car gdb-value-list)) 1185 (string-match "{*\\([^}]*\\)\\(}*\\)" (car gdb-value-list))
1166 (setq num 0) 1186 (setq num 0)
1167 (while (< num depth) 1187 (while (< num depth)
1225 (setq num (+ num 1))) 1245 (setq num (+ num 1)))
1226 (insert 1246 (insert
1227 (concat "\n Slice : " array-slice "\n\nIndex\tValues\n\n")))) 1247 (concat "\n Slice : " array-slice "\n\nIndex\tValues\n\n"))))
1228 (setq buffer-read-only t)) 1248 (setq buffer-read-only t))
1229 1249
1230 (defvar gdb-dive-map nil)
1231 (setq gdb-dive-map (make-keymap)) 1250 (setq gdb-dive-map (make-keymap))
1232 (define-key gdb-dive-map [mouse-2] 'gdb-dive) 1251 (define-key gdb-dive-map [mouse-2] 'gdb-dive)
1233 (define-key gdb-dive-map [S-mouse-2] 'gdb-dive-new-frame) 1252 (define-key gdb-dive-map [S-mouse-2] 'gdb-dive-new-frame)
1234 1253
1235 (defun gdb-dive (event) 1254 (defun gdb-dive (event)
1630 (interactive) 1649 (interactive)
1631 (save-excursion 1650 (save-excursion
1632 (beginning-of-line 1) 1651 (beginning-of-line 1)
1633 (if (not (looking-at "\\([0-9]+\\).*point\\s-*\\S-*\\s-*\\(.\\)")) 1652 (if (not (looking-at "\\([0-9]+\\).*point\\s-*\\S-*\\s-*\\(.\\)"))
1634 (error "Not recognized as break/watchpoint line") 1653 (error "Not recognized as break/watchpoint line")
1635 (Gdb-instance-enqueue-idle-input 1654 (gdb-instance-enqueue-idle-input
1636 gdb-buffer-instance 1655 gdb-buffer-instance
1637 (list 1656 (list
1638 (concat 1657 (concat
1639 (if (eq ?y (char-after (match-beginning 2))) 1658 (if (eq ?y (char-after (match-beginning 2)))
1640 "server disable " 1659 "server disable "
2113 (defun gdb-display-gdb-buffer (instance) 2132 (defun gdb-display-gdb-buffer (instance)
2114 (interactive (list (gdb-needed-default-instance))) 2133 (interactive (list (gdb-needed-default-instance)))
2115 (gdb-display-buffer 2134 (gdb-display-buffer
2116 (gdb-get-create-instance-buffer instance 'gdba))) 2135 (gdb-get-create-instance-buffer instance 'gdba)))
2117 2136
2118 (defun make-windows-menu (map) 2137 (defun gdb-make-windows-menu (map)
2138 ;; FIXME: This adds to the DBX, PerlDB, ... menu as well :-(
2139 ;; Probably we should create gdb-many-windows-map and put those menus
2140 ;; on that map.
2119 (define-key map [menu-bar displays] 2141 (define-key map [menu-bar displays]
2120 (cons "GDB-Windows" (make-sparse-keymap "GDB-Windows"))) 2142 (cons "GDB-Windows" (make-sparse-keymap "GDB-Windows")))
2121 (define-key map [menu-bar displays gdb] 2143 (define-key map [menu-bar displays gdb]
2122 '("Gdb" . gdb-display-gdb-buffer)) 2144 '("Gdb" . gdb-display-gdb-buffer))
2123 (define-key map [menu-bar displays locals] 2145 (define-key map [menu-bar displays locals]
2135 2157
2136 (define-key gud-minor-mode-map "\C-c\M-\C-r" 'gdb-display-registers-buffer) 2158 (define-key gud-minor-mode-map "\C-c\M-\C-r" 'gdb-display-registers-buffer)
2137 (define-key gud-minor-mode-map "\C-c\M-\C-f" 'gdb-display-stack-buffer) 2159 (define-key gud-minor-mode-map "\C-c\M-\C-f" 'gdb-display-stack-buffer)
2138 (define-key gud-minor-mode-map "\C-c\M-\C-b" 'gdb-display-breakpoints-buffer) 2160 (define-key gud-minor-mode-map "\C-c\M-\C-b" 'gdb-display-breakpoints-buffer)
2139 2161
2140 (make-windows-menu gud-minor-mode-map) 2162 (gdb-make-windows-menu gud-minor-mode-map)
2141 2163
2142 (defun gdb-frame-gdb-buffer (instance) 2164 (defun gdb-frame-gdb-buffer (instance)
2143 (interactive (list (gdb-needed-default-instance))) 2165 (interactive (list (gdb-needed-default-instance)))
2144 (switch-to-buffer-other-frame 2166 (switch-to-buffer-other-frame
2145 (gdb-get-create-instance-buffer instance 'gdba))) 2167 (gdb-get-create-instance-buffer instance 'gdba)))
2146 2168
2147 (defun make-frames-menu (map) 2169 (defun gdb-make-frames-menu (map)
2148 (define-key map [menu-bar frames] 2170 (define-key map [menu-bar frames]
2149 (cons "GDB-Frames" (make-sparse-keymap "GDB-Frames"))) 2171 (cons "GDB-Frames" (make-sparse-keymap "GDB-Frames")))
2150 (define-key map [menu-bar frames gdb] 2172 (define-key map [menu-bar frames gdb]
2151 '("Gdb" . gdb-frame-gdb-buffer)) 2173 '("Gdb" . gdb-frame-gdb-buffer))
2152 (define-key map [menu-bar frames locals] 2174 (define-key map [menu-bar frames locals]
2161 '("Display" . gdb-frame-display-buffer)) 2183 '("Display" . gdb-frame-display-buffer))
2162 (define-key map [menu-bar frames assembler] 2184 (define-key map [menu-bar frames assembler]
2163 '("Assembler" . gdb-frame-assembler-buffer))) 2185 '("Assembler" . gdb-frame-assembler-buffer)))
2164 2186
2165 (if (display-graphic-p) 2187 (if (display-graphic-p)
2166 (make-frames-menu gud-minor-mode-map)) 2188 (gdb-make-frames-menu gud-minor-mode-map))
2167
2168 (defvar gdb-target-name "--unknown--"
2169 "The apparent name of the program being debugged in a gud buffer.")
2170 2189
2171 (defun gdb-proc-died (proc) 2190 (defun gdb-proc-died (proc)
2172 ;; Stop displaying an arrow in a source file. 2191 ;; Stop displaying an arrow in a source file.
2173 (setq overlay-arrow-position nil) 2192 (setq overlay-arrow-position nil)
2174 2193
2210 (switch-to-buffer (gdb-breakpoints-buffer-name instance)) 2229 (switch-to-buffer (gdb-breakpoints-buffer-name instance))
2211 (other-window 1)) 2230 (other-window 1))
2212 2231
2213 (defun gdb-restore-windows () 2232 (defun gdb-restore-windows ()
2214 "Restore the basic arrangement of windows used by gdba. 2233 "Restore the basic arrangement of windows used by gdba.
2215 This arrangement depends on the value of `gdb-many-windows'" 2234 This arrangement depends on the value of `gdb-many-windows'."
2216 (interactive) 2235 (interactive)
2217 (if gdb-many-windows 2236 (if gdb-many-windows
2218 (progn 2237 (progn
2219 (switch-to-buffer gud-comint-buffer) 2238 (switch-to-buffer gud-comint-buffer)
2220 (delete-other-windows) 2239 (delete-other-windows)
2419 (aset gdb-array-stop n stop))) 2438 (aset gdb-array-stop n stop)))
2420 (gdb-array-format1)) 2439 (gdb-array-format1))
2421 2440
2422 (defun gdb-array-visualise () 2441 (defun gdb-array-visualise ()
2423 "Visualise arrays and slices using graph program from plotutils." 2442 "Visualise arrays and slices using graph program from plotutils."
2424 (Interactive) 2443 (interactive)
2425 (if (and (display-graphic-p) gdb-display-string) 2444 (if (and (display-graphic-p) gdb-display-string)
2426 (let ((n 0) m) 2445 (let ((n 0) m)
2427 (catch 'multi-dimensional 2446 (catch 'multi-dimensional
2428 (while (eq (aref gdb-array-start n) (aref gdb-array-stop n)) 2447 (while (eq (aref gdb-array-start n) (aref gdb-array-stop n))
2429 (setq n (+ n 1))) 2448 (setq n (+ n 1)))
2433 (progn 2452 (progn
2434 (x-popup-dialog 2453 (x-popup-dialog
2435 t `(,(concat "Only one dimensional data can be visualised.\n" 2454 t `(,(concat "Only one dimensional data can be visualised.\n"
2436 "Use an array slice to reduce the number of\n" 2455 "Use an array slice to reduce the number of\n"
2437 "dimensions") ("OK" t))) 2456 "dimensions") ("OK" t)))
2438 (throw 'multi-dimensional)) 2457 (throw 'multi-dimensional nil))
2439 (setq m (+ m 1)))) 2458 (setq m (+ m 1))))
2440 (shell-command (concat "echo" gdb-display-string " | graph -a 1 " 2459 (shell-command (concat "echo" gdb-display-string " | graph -a 1 "
2441 (int-to-string (aref gdb-array-start n)) 2460 (int-to-string (aref gdb-array-start n))
2442 " -x " 2461 " -x "
2443 (int-to-string (aref gdb-array-start n)) 2462 (int-to-string (aref gdb-array-start n))
2466 gdb-assembler-custom) 2485 gdb-assembler-custom)
2467 2486
2468 (defun gdb-assembler-custom () 2487 (defun gdb-assembler-custom ()
2469 (let ((buffer (gdb-get-instance-buffer gdb-buffer-instance 2488 (let ((buffer (gdb-get-instance-buffer gdb-buffer-instance
2470 'gdb-assembler-buffer)) 2489 'gdb-assembler-buffer))
2471 (gdb-arrow-position)) 2490 (gdb-arrow-position) (address) (flag))
2472 (if gdb-current-address 2491 (if gdb-current-address
2473 (progn 2492 (progn
2474 (save-excursion 2493 (save-excursion
2475 (set-buffer buffer) 2494 (set-buffer buffer)
2476 (remove-arrow) 2495 (remove-arrow)