41 |
;; developing the mode itself, then see the Annotations section in the GDB |
;; developing the mode itself, then see the Annotations section in the GDB |
42 |
;; info manual. |
;; info manual. |
43 |
;; |
;; |
44 |
;; Known Bugs: |
;; Known Bugs: |
45 |
;; Does not auto-display arrays of structures or structures containing arrays. |
;; 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 |
;; On MS Windows, Gdb 5.1.1 from MinGW 2.0 does not flush the output from the |
47 |
;; inferior. |
;; inferior. |
48 |
|
|
49 |
;;; Code: |
;;; Code: |
50 |
|
|
60 |
:type 'integer |
:type 'integer |
61 |
:group 'gud) |
:group 'gud) |
62 |
|
|
63 |
(defvar gdb-current-address nil "Initialisation for Assembler buffer.") |
(defvar gdb-current-address "main" "Initialisation for Assembler buffer.") |
64 |
(defvar gdb-previous-address nil) |
(defvar gdb-previous-address nil) |
65 |
(defvar gdb-previous-frame nil) |
(defvar gdb-previous-frame nil) |
66 |
|
(defvar gdb-current-frame "main") |
67 |
(defvar gdb-display-in-progress nil) |
(defvar gdb-display-in-progress nil) |
68 |
(defvar gdb-dive nil) |
(defvar gdb-dive nil) |
69 |
(defvar gdb-view-source t "Non-nil means that source code can be viewed") |
(defvar gdb-view-source t "Non-nil means that source code can be viewed") |
163 |
(setq gdb-current-address "main") |
(setq gdb-current-address "main") |
164 |
(setq gdb-previous-address nil) |
(setq gdb-previous-address nil) |
165 |
(setq gdb-previous-frame nil) |
(setq gdb-previous-frame nil) |
166 |
|
(setq gdb-current-frame "main") |
167 |
(setq gdb-display-in-progress nil) |
(setq gdb-display-in-progress nil) |
168 |
(setq gdb-dive nil) |
(setq gdb-dive nil) |
169 |
(setq gdb-view-source t) |
(setq gdb-view-source t) |
178 |
(gdb-enqueue-input (list "set new-console off\n" 'ignore))) |
(gdb-enqueue-input (list "set new-console off\n" 'ignore))) |
179 |
(gdb-enqueue-input (list "set height 0\n" 'ignore)) |
(gdb-enqueue-input (list "set height 0\n" 'ignore)) |
180 |
;; find source file and compilation directory here |
;; find source file and compilation directory here |
181 |
(gdb-enqueue-input (list "server list\n" 'ignore)) ; C program |
(gdb-enqueue-input (list "server list main\n" 'ignore)) ; C program |
182 |
(gdb-enqueue-input (list "server list MAIN__\n" 'ignore)) ; Fortran program |
(gdb-enqueue-input (list "server list MAIN__\n" 'ignore)) ; Fortran program |
183 |
(gdb-enqueue-input (list "server info source\n" |
(gdb-enqueue-input (list "server info source\n" |
184 |
'gdb-source-info)) |
'gdb-source-info)) |
203 |
(goto-char (- (point-max) 1)) |
(goto-char (- (point-max) 1)) |
204 |
(if (equal (char-before) (string-to-char "\*")) |
(if (equal (char-before) (string-to-char "\*")) |
205 |
(gdb-enqueue-input |
(gdb-enqueue-input |
206 |
(list (concat "server display* " expr "\n") 'ignore)) |
(list (concat "display* " expr "\n") 'ignore)) |
207 |
(gdb-enqueue-input |
(gdb-enqueue-input |
208 |
(list (concat "server display " expr "\n") 'ignore))))) |
(list (concat "display " expr "\n") 'ignore))))) |
209 |
|
|
210 |
; this would messy because these bindings don't work with M-x gdb |
; this would messy because these bindings don't work with M-x gdb |
211 |
; (define-key global-map "\C-x\C-a\C-a" 'gud-display) |
; (define-key global-map "\C-x\C-a\C-a" 'gud-display) |
746 |
(set-buffer (gdb-get-buffer 'gdb-partial-output-buffer)) |
(set-buffer (gdb-get-buffer 'gdb-partial-output-buffer)) |
747 |
(setq gdb-dive nil)) |
(setq gdb-dive nil)) |
748 |
|
|
|
(defvar gdb-current-frame nil) |
|
749 |
(defvar gdb-nesting-level) |
(defvar gdb-nesting-level) |
750 |
(defvar gdb-expression) |
(defvar gdb-expression) |
751 |
(defvar gdb-point) |
(defvar gdb-point) |
2050 |
(gdb-display-buffer |
(gdb-display-buffer |
2051 |
(gdb-get-create-buffer 'gdba))) |
(gdb-get-create-buffer 'gdba))) |
2052 |
|
|
2053 |
|
(defvar gdb-main-file nil "Source file from which program execution begins.") |
2054 |
|
|
2055 |
(defun gdb-view-source() |
(defun gdb-view-source() |
2056 |
(interactive) |
(interactive) |
2057 |
(if gdb-view-source |
(if gdb-view-source |
2058 |
(if gud-last-last-frame |
(if gud-last-last-frame |
2059 |
(set-window-buffer gdb-source-window |
(set-window-buffer gdb-source-window |
2060 |
(gud-find-file (car gud-last-last-frame))) |
(gud-find-file (car gud-last-last-frame))) |
2061 |
(set-window-buffer gdb-source-window (gud-find-file gdb-main-file)))) |
(set-window-buffer gdb-source-window (gud-find-file gdb-main-file)))) |
2062 |
(setq gdb-selected-view 'source)) |
(setq gdb-selected-view 'source)) |
2063 |
|
|
2064 |
(defun gdb-view-assembler() |
(defun gdb-view-assembler() |
2065 |
(interactive) |
(interactive) |
2066 |
(set-window-buffer gdb-source-window |
(set-window-buffer gdb-source-window |
2067 |
(gdb-get-create-buffer 'gdb-assembler-buffer)) |
(gdb-get-create-buffer 'gdb-assembler-buffer)) |
2068 |
(setq gdb-selected-view 'assembler)) |
(setq gdb-selected-view 'assembler)) |
2069 |
|
|
2070 |
;(defun gdb-view-both() |
;(defun gdb-view-both() |
2071 |
;(interactive) |
;(interactive) |
2072 |
;(setq gdb-selected-view 'both)) |
;(setq gdb-selected-view 'both)) |
2073 |
|
|
|
(defvar gdb-main-file nil "Source file from which program execution begins.") |
|
|
|
|
2074 |
;; layout for all the windows |
;; layout for all the windows |
2075 |
(defun gdb-setup-windows () |
(defun gdb-setup-windows () |
2076 |
(gdb-display-locals-buffer) |
(gdb-display-locals-buffer) |
2136 |
(gud-find-file (car gud-last-last-frame)) |
(gud-find-file (car gud-last-last-frame)) |
2137 |
(gud-find-file gdb-main-file))) |
(gud-find-file gdb-main-file))) |
2138 |
(switch-to-buffer (gdb-get-create-buffer 'gdb-assembler-buffer))) |
(switch-to-buffer (gdb-get-create-buffer 'gdb-assembler-buffer))) |
2139 |
|
(setq gdb-source-window (get-buffer-window (current-buffer))) |
2140 |
(other-window 1))) |
(other-window 1))) |
2141 |
|
|
2142 |
(defun gdb-reset () |
(defun gdb-reset () |
2166 |
"Find the source file where the program starts and displays it with related |
"Find the source file where the program starts and displays it with related |
2167 |
buffers." |
buffers." |
2168 |
(goto-char (point-min)) |
(goto-char (point-min)) |
2169 |
(when (search-forward "directory is " nil t) |
(if (search-forward "directory is " nil t) |
2170 |
(if (looking-at "\\S-*:\\(\\S-*\\)") |
(progn |
2171 |
(setq gdb-cdir (match-string 1)) |
(if (looking-at "\\S-*:\\(\\S-*\\)") |
2172 |
(looking-at "\\S-*") |
(setq gdb-cdir (match-string 1)) |
2173 |
(setq gdb-cdir (match-string 0))) |
(looking-at "\\S-*") |
2174 |
(search-forward "Located in ") |
(setq gdb-cdir (match-string 0))) |
2175 |
(looking-at "\\S-*") |
(search-forward "Located in ") |
2176 |
(setq gdb-main-file (match-string 0)) |
(looking-at "\\S-*") |
2177 |
;; Make sure we are not in the minibuffer window when we try to delete |
(setq gdb-main-file (match-string 0))) |
2178 |
;; all other windows. |
(setq gdb-view-source nil)) |
2179 |
(if (window-minibuffer-p (selected-window)) |
(delete-other-windows) |
2180 |
(other-window 1)) |
(if gdb-many-windows |
2181 |
|
(gdb-setup-windows) |
2182 |
|
(gdb-display-breakpoints-buffer) |
2183 |
|
(gdb-display-display-buffer) |
2184 |
(delete-other-windows) |
(delete-other-windows) |
2185 |
(if gdb-many-windows |
(split-window) |
2186 |
(gdb-setup-windows) |
(other-window 1) |
2187 |
(gdb-display-breakpoints-buffer) |
(if gdb-view-source |
2188 |
(gdb-display-display-buffer) |
(switch-to-buffer (gud-find-file gdb-main-file)) |
2189 |
(delete-other-windows) |
(switch-to-buffer (gdb-get-create-buffer 'gdb-assembler-buffer)) |
2190 |
(split-window) |
(gdb-invalidate-assembler)) |
2191 |
(other-window 1) |
(setq gdb-source-window (get-buffer-window (current-buffer))) |
2192 |
(switch-to-buffer (gud-find-file gdb-main-file)) |
(other-window 1))) |
|
(setq gdb-source-window (get-buffer-window (current-buffer))) |
|
|
(other-window 1)))) |
|
2193 |
|
|
2194 |
;;from put-image |
;;from put-image |
2195 |
(defun gdb-put-string (putstring pos) |
(defun gdb-put-string (putstring pos) |
2297 |
|
|
2298 |
(defun gdb-assembler-custom () |
(defun gdb-assembler-custom () |
2299 |
(let ((buffer (gdb-get-buffer 'gdb-assembler-buffer)) |
(let ((buffer (gdb-get-buffer 'gdb-assembler-buffer)) |
2300 |
(address) (flag)) |
(gdb-arrow-position 1) (address) (flag)) |
2301 |
(with-current-buffer buffer |
(with-current-buffer buffer |
2302 |
(if (not (equal gdb-current-address "main")) |
(if (not (equal gdb-current-address "main")) |
2303 |
(progn |
(progn |
2304 |
(gdb-remove-arrow) |
(gdb-remove-arrow) |
2305 |
(goto-char (point-min)) |
(goto-char (point-min)) |
2306 |
(if (re-search-forward gdb-current-address nil t) |
(if (re-search-forward gdb-current-address nil t) |
2307 |
(gdb-put-arrow "=>" (point))))) |
(progn |
2308 |
|
(setq gdb-arrow-position (point)) |
2309 |
|
(gdb-put-arrow "=>" (point)))))) |
2310 |
;; remove all breakpoint-icons in assembler buffer before updating. |
;; remove all breakpoint-icons in assembler buffer before updating. |
2311 |
(if (eq window-system 'x) |
(if (eq window-system 'x) |
2312 |
(remove-images (point-min) (point-max)) |
(remove-images (point-min) (point-max)) |
2344 |
(gdb-remove-strings start end) |
(gdb-remove-strings start end) |
2345 |
(if (eq ?y flag) |
(if (eq ?y flag) |
2346 |
(gdb-put-string "B" (+ start 1)) |
(gdb-put-string "B" (+ start 1)) |
2347 |
(gdb-put-string "b" (+ start 1))))))))))))) |
(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)))) |
2350 |
|
|
2351 |
(defvar gdb-assembler-mode-map |
(defvar gdb-assembler-mode-map |
2352 |
(let ((map (make-sparse-keymap))) |
(let ((map (make-sparse-keymap))) |