diff options
| author | Nick Roberts | 2008-04-23 02:50:24 +0000 |
|---|---|---|
| committer | Nick Roberts | 2008-04-23 02:50:24 +0000 |
| commit | 7446b6573e7bab079dce887fc118b2fd303c1f92 (patch) | |
| tree | 5bfcdc87dab0f69657178c672ccb6c6335fff364 | |
| parent | 91bd4e50abf21bbbab691ed15916bf829d7d0f44 (diff) | |
| download | emacs-7446b6573e7bab079dce887fc118b2fd303c1f92.tar.gz emacs-7446b6573e7bab079dce887fc118b2fd303c1f92.zip | |
(gdb-previous-frame-address): Rename...
(gdb-previous-frame-pc-address): ...to this.
(gdb-get-selected-frame): Use MI command -stack-info-frame instead
of "info frame" with Gdb 6.4+.
(gdb-stack-list-frames-regexp): New regexp.
(gdb-frame-handler-1): Parse output of -stack-info-frame
| -rw-r--r-- | lisp/progmodes/gdb-ui.el | 42 |
1 files changed, 34 insertions, 8 deletions
diff --git a/lisp/progmodes/gdb-ui.el b/lisp/progmodes/gdb-ui.el index 9899d55eac3..d9776c0c4cd 100644 --- a/lisp/progmodes/gdb-ui.el +++ b/lisp/progmodes/gdb-ui.el | |||
| @@ -110,7 +110,7 @@ | |||
| 110 | (defvar gdb-pc-address nil "Initialization for Assembler buffer. | 110 | (defvar gdb-pc-address nil "Initialization for Assembler buffer. |
| 111 | Set to \"main\" at start if `gdb-show-main' is t.") | 111 | Set to \"main\" at start if `gdb-show-main' is t.") |
| 112 | (defvar gdb-frame-address nil "Identity of frame for watch expression.") | 112 | (defvar gdb-frame-address nil "Identity of frame for watch expression.") |
| 113 | (defvar gdb-previous-frame-address nil) | 113 | (defvar gdb-previous-frame-pc-address nil) |
| 114 | (defvar gdb-memory-address "main") | 114 | (defvar gdb-memory-address "main") |
| 115 | (defvar gdb-previous-frame nil) | 115 | (defvar gdb-previous-frame nil) |
| 116 | (defvar gdb-selected-frame nil) | 116 | (defvar gdb-selected-frame nil) |
| @@ -585,7 +585,7 @@ otherwise do not." | |||
| 585 | 585 | ||
| 586 | ;; (re-)initialize | 586 | ;; (re-)initialize |
| 587 | (setq gdb-pc-address (if gdb-show-main "main" nil)) | 587 | (setq gdb-pc-address (if gdb-show-main "main" nil)) |
| 588 | (setq gdb-previous-frame-address nil | 588 | (setq gdb-previous-frame-pc-address nil |
| 589 | gdb-memory-address "main" | 589 | gdb-memory-address "main" |
| 590 | gdb-previous-frame nil | 590 | gdb-previous-frame nil |
| 591 | gdb-selected-frame nil | 591 | gdb-selected-frame nil |
| @@ -3542,7 +3542,7 @@ BUFFER nil or omitted means use the current buffer." | |||
| 3542 | (if (or (not (member 'gdb-invalidate-assembler | 3542 | (if (or (not (member 'gdb-invalidate-assembler |
| 3543 | gdb-pending-triggers)) | 3543 | gdb-pending-triggers)) |
| 3544 | (not (string-equal gdb-pc-address | 3544 | (not (string-equal gdb-pc-address |
| 3545 | gdb-previous-frame-address))) | 3545 | gdb-previous-frame-pc-address))) |
| 3546 | (progn | 3546 | (progn |
| 3547 | ;; take previous disassemble command, if any, off the queue | 3547 | ;; take previous disassemble command, if any, off the queue |
| 3548 | (with-current-buffer gud-comint-buffer | 3548 | (with-current-buffer gud-comint-buffer |
| @@ -3558,16 +3558,20 @@ BUFFER nil or omitted means use the current buffer." | |||
| 3558 | gdb-pc-address "\n") | 3558 | gdb-pc-address "\n") |
| 3559 | 'gdb-assembler-handler)) | 3559 | 'gdb-assembler-handler)) |
| 3560 | (push 'gdb-invalidate-assembler gdb-pending-triggers) | 3560 | (push 'gdb-invalidate-assembler gdb-pending-triggers) |
| 3561 | (setq gdb-previous-frame-address gdb-pc-address) | 3561 | (setq gdb-previous-frame-pc-address gdb-pc-address) |
| 3562 | (setq gdb-previous-frame gdb-selected-frame))))))) | 3562 | (setq gdb-previous-frame gdb-selected-frame))))))) |
| 3563 | 3563 | ||
| 3564 | (defun gdb-get-selected-frame () | 3564 | (defun gdb-get-selected-frame () |
| 3565 | (if (not (member 'gdb-get-selected-frame gdb-pending-triggers)) | 3565 | (if (not (member 'gdb-get-selected-frame gdb-pending-triggers)) |
| 3566 | (progn | 3566 | (progn |
| 3567 | (gdb-enqueue-input | 3567 | (if (string-equal gdb-version "pre-6.4") |
| 3568 | (list (concat gdb-server-prefix "info frame\n") 'gdb-frame-handler)) | 3568 | (gdb-enqueue-input |
| 3569 | (push 'gdb-get-selected-frame | 3569 | (list (concat gdb-server-prefix "info frame\n") |
| 3570 | gdb-pending-triggers)))) | 3570 | 'gdb-frame-handler)) |
| 3571 | (gdb-enqueue-input | ||
| 3572 | (list "server interpreter mi -stack-info-frame\n" | ||
| 3573 | 'gdb-frame-handler-1))) | ||
| 3574 | (push 'gdb-get-selected-frame gdb-pending-triggers)))) | ||
| 3571 | 3575 | ||
| 3572 | (defun gdb-frame-handler () | 3576 | (defun gdb-frame-handler () |
| 3573 | (setq gdb-pending-triggers | 3577 | (setq gdb-pending-triggers |
| @@ -3631,6 +3635,28 @@ is set in them." | |||
| 3631 | (gdb-force-mode-line-update | 3635 | (gdb-force-mode-line-update |
| 3632 | (propertize "ready" 'face font-lock-variable-name-face))) | 3636 | (propertize "ready" 'face font-lock-variable-name-face))) |
| 3633 | 3637 | ||
| 3638 | ;; Used for -stack-info-frame but could be used for -stack-list-frames too. | ||
| 3639 | (defconst gdb-stack-list-frames-regexp | ||
| 3640 | ".*?level=\"\\(.*?\\)\",.*?addr=\"\\(.*?\\)\",.*?func=\"\\(.*?\\)\",\ | ||
| 3641 | \\(?:.*?file=\".*?\",.*?fullname=\"\\(.*?\\)\",.*?line=\"\\(.*?\\)\".*?}\\|\ | ||
| 3642 | from=\"\\(.*?\\)\"\\)") | ||
| 3643 | |||
| 3644 | (defun gdb-frame-handler-1 () | ||
| 3645 | (setq gdb-pending-triggers | ||
| 3646 | (delq 'gdb-get-selected-frame gdb-pending-triggers)) | ||
| 3647 | (goto-char (point-min)) | ||
| 3648 | (when (re-search-forward gdb-stack-list-frames-regexp nil t) | ||
| 3649 | (setq gdb-frame-number (match-string 1)) | ||
| 3650 | (setq gdb-pc-address (match-string 2)) | ||
| 3651 | (setq gdb-selected-frame (match-string 3)) | ||
| 3652 | (if (gdb-get-buffer 'gdb-locals-buffer) | ||
| 3653 | (with-current-buffer (gdb-get-buffer 'gdb-locals-buffer) | ||
| 3654 | (setq mode-name (concat "Locals:" gdb-selected-frame)))) | ||
| 3655 | (if (gdb-get-buffer 'gdb-assembler-buffer) | ||
| 3656 | (with-current-buffer (gdb-get-buffer 'gdb-assembler-buffer) | ||
| 3657 | (setq mode-name (concat "Machine:" gdb-selected-frame))))) | ||
| 3658 | (gdb-invalidate-assembler)) | ||
| 3659 | |||
| 3634 | ; Uses "-var-list-children --all-values". Needs GDB 6.4 onwards. | 3660 | ; Uses "-var-list-children --all-values". Needs GDB 6.4 onwards. |
| 3635 | (defun gdb-var-list-children-1 (varnum) | 3661 | (defun gdb-var-list-children-1 (varnum) |
| 3636 | (gdb-enqueue-input | 3662 | (gdb-enqueue-input |