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