comparison lisp/progmodes/gdb-mi.el @ 104148:3bbb840267e1

(gdb-add-pending, gdb-pending-p, gdb-delete-pending): Macros to handle pending triggers. (gdb-threads-mode-map, def-gdb-thread-buffer-command) (def-gdb-thread-buffer-simple-command) (gdb-display-stack-for-thread, gdb-display-locals-for-thread) (gdb-display-registers-for-thread, gdb-frame-stack-for-thread) (gdb-frame-locals-for-thread, gdb-frame-registers-for-thread): New commands which show buffers bound to thread. (gdb-stack-list-locals-regexp): Removed unused regexp.
author Dmitry Dzhus <dima@sphinx.net.ru>
date Tue, 04 Aug 2009 13:27:21 +0000
parents 9629847b09ed
children da5e764f0af8
comparison
equal deleted inserted replaced
104147:9629847b09ed 104148:3bbb840267e1
189 for subsequent processing by a command. This is the 189 for subsequent processing by a command. This is the
190 disposition of output generated by commands that 190 disposition of output generated by commands that
191 gdb mode sends to gdb on its own behalf.") 191 gdb mode sends to gdb on its own behalf.")
192 192
193 (defvar gdb-pending-triggers '() 193 (defvar gdb-pending-triggers '()
194 "A list of trigger functions that have run later than their output handlers.") 194 "A list of trigger functions which have not yet been handled.
195
196 Elements are either function names or pairs (buffer . function)")
197
198 (defmacro gdb-add-pending (item)
199 `(push ,item gdb-pending-triggers))
200 (defmacro gdb-pending-p (item)
201 `(member ,item gdb-pending-triggers))
202 (defmacro gdb-delete-pending (item)
203 `(setq gdb-pending-triggers
204 (delete ,item gdb-pending-triggers)))
195 205
196 (defcustom gdb-debug-log-max 128 206 (defcustom gdb-debug-log-max 128
197 "Maximum size of `gdb-debug-log'. If nil, size is unlimited." 207 "Maximum size of `gdb-debug-log'. If nil, size is unlimited."
198 :group 'gdb 208 :group 'gdb
199 :type '(choice (integer :tag "Number of elements") 209 :type '(choice (integer :tag "Number of elements")
722 ,(car var) nil))))) 732 ,(car var) nil)))))
723 (message-box "No symbol \"%s\" in current context." expr))) 733 (message-box "No symbol \"%s\" in current context." expr)))
724 734
725 (defun gdb-speedbar-update () 735 (defun gdb-speedbar-update ()
726 (when (and (boundp 'speedbar-frame) (frame-live-p speedbar-frame) 736 (when (and (boundp 'speedbar-frame) (frame-live-p speedbar-frame)
727 (not (member 'gdb-speedbar-timer gdb-pending-triggers))) 737 (not (gdb-pending-p 'gdb-speedbar-timer)))
728 ;; Dummy command to update speedbar even when idle. 738 ;; Dummy command to update speedbar even when idle.
729 (gdb-input (list "-environment-pwd" 'gdb-speedbar-timer-fn)) 739 (gdb-input (list "-environment-pwd" 'gdb-speedbar-timer-fn))
730 ;; Keep gdb-pending-triggers non-nil till end. 740 ;; Keep gdb-pending-triggers non-nil till end.
731 (push 'gdb-speedbar-timer gdb-pending-triggers))) 741 (gdb-add-pending 'gdb-speedbar-timer)))
732 742
733 (defun gdb-speedbar-timer-fn () 743 (defun gdb-speedbar-timer-fn ()
734 (if gdb-speedbar-auto-raise 744 (if gdb-speedbar-auto-raise
735 (raise-frame speedbar-frame)) 745 (raise-frame speedbar-frame))
736 (setq gdb-pending-triggers 746 (gdb-delete-pending 'gdb-speedbar-timer)
737 (delq 'gdb-speedbar-timer gdb-pending-triggers))
738 (speedbar-timer-fn)) 747 (speedbar-timer-fn))
739 748
740 (defun gdb-var-evaluate-expression-handler (varnum changed) 749 (defun gdb-var-evaluate-expression-handler (varnum changed)
741 (goto-char (point-min)) 750 (goto-char (point-min))
742 (re-search-forward ".*value=\\(\".*\"\\)" nil t) 751 (re-search-forward ".*value=\\(\".*\"\\)" nil t)
829 (if (re-search-forward gdb-error-regexp nil t) 838 (if (re-search-forward gdb-error-regexp nil t)
830 (message-box "Invalid number or expression (%s)" value))) 839 (message-box "Invalid number or expression (%s)" value)))
831 840
832 ; Uses "-var-update --all-values". Needs GDB 6.4 onwards. 841 ; Uses "-var-update --all-values". Needs GDB 6.4 onwards.
833 (defun gdb-var-update () 842 (defun gdb-var-update ()
834 (if (not (member 'gdb-var-update gdb-pending-triggers)) 843 (if (not (gdb-pending-p 'gdb-var-update))
835 (gdb-input 844 (gdb-input
836 (list "-var-update --all-values *" 'gdb-var-update-handler))) 845 (list "-var-update --all-values *" 'gdb-var-update-handler)))
837 (push 'gdb-var-update gdb-pending-triggers)) 846 (gdb-add-pending 'gdb-var-update))
838 847
839 (defconst gdb-var-update-regexp 848 (defconst gdb-var-update-regexp
840 "{.*?name=\"\\(.*?\\)\".*?,\\(?:value=\\(\".*?\"\\),\\)?.*?\ 849 "{.*?name=\"\\(.*?\\)\".*?,\\(?:value=\\(\".*?\"\\),\\)?.*?\
841 in_scope=\"\\(.*?\\)\".*?}") 850 in_scope=\"\\(.*?\\)\".*?}")
842 851
857 (setcar (nthcdr 5 var) 'changed) 866 (setcar (nthcdr 5 var) 'changed)
858 (setcar (nthcdr 4 var) 867 (setcar (nthcdr 4 var)
859 (read (match-string 2)))) 868 (read (match-string 2))))
860 ((string-equal match "invalid") 869 ((string-equal match "invalid")
861 (gdb-var-delete-1 varnum))))))) 870 (gdb-var-delete-1 varnum)))))))
862 (setq gdb-pending-triggers 871 (gdb-delete-pending 'gdb-var-update)
863 (delq 'gdb-var-update gdb-pending-triggers))
864 (gdb-speedbar-update)) 872 (gdb-speedbar-update))
865 873
866 (defun gdb-speedbar-expand-node (text token indent) 874 (defun gdb-speedbar-expand-node (text token indent)
867 "Expand the node the user clicked on. 875 "Expand the node the user clicked on.
868 TEXT is the text of the button we clicked on, a + or - item. 876 TEXT is the text of the button we clicked on, a + or - item.
914 922
915 (defun gdb-get-buffer (key &optional thread) 923 (defun gdb-get-buffer (key &optional thread)
916 "Get a specific GDB buffer. 924 "Get a specific GDB buffer.
917 925
918 In that buffer, `gdb-buffer-type' must be equal to KEY and 926 In that buffer, `gdb-buffer-type' must be equal to KEY and
919 `gdb-thread-number' (if provided) must be equal to THREAD." 927 `gdb-thread-number' (if provided) must be equal to THREAD.
928
929 When THREAD is nil, global `gdb-thread-number' value is used."
930 (when (not thread) (setq thread gdb-thread-number))
920 (catch 'found 931 (catch 'found
921 (dolist (buffer (buffer-list) nil) 932 (dolist (buffer (buffer-list) nil)
922 (with-current-buffer buffer 933 (with-current-buffer buffer
923 (when (and (eq gdb-buffer-type key) 934 (when (and (eq gdb-buffer-type key)
924 (or (not thread) 935 (equal gdb-thread-number thread))
925 (equal gdb-thread-number thread)))
926 (throw 'found buffer)))))) 936 (throw 'found buffer))))))
927 937
928 (defun gdb-get-buffer-create (key &optional thread) 938 (defun gdb-get-buffer-create (key &optional thread)
929 "Create a new GDB buffer of the type specified by KEY. 939 "Create a new GDB buffer of the type specified by KEY.
930 The key should be one of the cars in `gdb-buffer-rules'. 940 The key should be one of the cars in `gdb-buffer-rules'.
1220 (setcar item (concat (number-to-string gdb-token-number) (car item))) 1230 (setcar item (concat (number-to-string gdb-token-number) (car item)))
1221 (push (cons gdb-token-number (car (cdr item))) gdb-handler-alist) 1231 (push (cons gdb-token-number (car (cdr item))) gdb-handler-alist)
1222 (process-send-string (get-buffer-process gud-comint-buffer) 1232 (process-send-string (get-buffer-process gud-comint-buffer)
1223 (concat (car item) "\n"))) 1233 (concat (car item) "\n")))
1224 1234
1225 (defmacro gdb-current-context-command (command) 1235 (defun gdb-current-context-command (command)
1226 "Add --thread option to gdb COMMAND. 1236 "Add --thread option to gdb COMMAND.
1227 1237
1228 Option value is taken from `gdb-thread-number'." 1238 Option value is taken from `gdb-thread-number'."
1229 (concat command " --thread " gdb-thread-number)) 1239 (concat command " --thread " gdb-thread-number))
1240
1241 (defun gdb-current-context-buffer-name (name)
1242 "Add thread information and asterisks to string NAME."
1243 (concat "*" name
1244 (if (local-variable-p 'gdb-thread-number)
1245 " (bound to thread "
1246 " (current thread ")
1247 gdb-thread-number ")*"))
1230 1248
1231 1249
1232 (defcustom gud-gdb-command-name "gdb -i=mi" 1250 (defcustom gud-gdb-command-name "gdb -i=mi"
1233 "Default command to execute an executable under the GDB debugger." 1251 "Default command to execute an executable under the GDB debugger."
1234 :type 'string 1252 :type 'string
1565 ;; See how it's done in gdb-get-buffer-create. 1583 ;; See how it's done in gdb-get-buffer-create.
1566 1584
1567 (defmacro def-gdb-auto-update-trigger (trigger-name gdb-command 1585 (defmacro def-gdb-auto-update-trigger (trigger-name gdb-command
1568 handler-name) 1586 handler-name)
1569 `(defun ,trigger-name (&optional signal) 1587 `(defun ,trigger-name (&optional signal)
1570 (if (not (member (cons (current-buffer) ',trigger-name) 1588 (if (not (gdb-pending-p
1571 gdb-pending-triggers)) 1589 (cons (current-buffer) ',trigger-name)))
1572 (progn 1590 (progn
1573 (gdb-input 1591 (gdb-input
1574 (list ,gdb-command 1592 (list ,gdb-command
1575 (gdb-bind-function-to-buffer ',handler-name (current-buffer)))) 1593 (gdb-bind-function-to-buffer ',handler-name (current-buffer))))
1576 (push (cons (current-buffer) ',trigger-name) gdb-pending-triggers))))) 1594 (gdb-add-pending (cons (current-buffer) ',trigger-name))))))
1577 1595
1578 ;; Used by disassembly buffer only, the rest use 1596 ;; Used by disassembly buffer only, the rest use
1579 ;; def-gdb-trigger-and-handler 1597 ;; def-gdb-trigger-and-handler
1580 (defmacro def-gdb-auto-update-handler (handler-name trigger-name custom-defun) 1598 (defmacro def-gdb-auto-update-handler (handler-name trigger-name custom-defun)
1581 "Define a handler HANDLER-NAME for TRIGGER-NAME with CUSTOM-DEFUN. 1599 "Define a handler HANDLER-NAME for TRIGGER-NAME with CUSTOM-DEFUN.
1582 1600
1583 Delete ((current-buffer) . TRIGGER) from `gdb-pending-triggers', 1601 Delete ((current-buffer) . TRIGGER) from `gdb-pending-triggers',
1584 erase current buffer and evaluate CUSTOM-DEFUN." 1602 erase current buffer and evaluate CUSTOM-DEFUN."
1585 `(defun ,handler-name () 1603 `(defun ,handler-name ()
1586 (setq gdb-pending-triggers 1604 (gdb-delete-pending (cons (current-buffer) ',trigger-name))
1587 (delq (cons (current-buffer) ',trigger-name)
1588 gdb-pending-triggers))
1589 (let* ((buffer-read-only nil)) 1605 (let* ((buffer-read-only nil))
1590 (erase-buffer) 1606 (erase-buffer)
1591 (,custom-defun) 1607 (,custom-defun)
1592 (gdb-update-buffer-name)))) 1608 (gdb-update-buffer-name))))
1593 1609
1617 'gdb-breakpoints-buffer-name 1633 'gdb-breakpoints-buffer-name
1618 'gdb-breakpoints-mode 1634 'gdb-breakpoints-mode
1619 'gdb-invalidate-breakpoints) 1635 'gdb-invalidate-breakpoints)
1620 1636
1621 (defun gdb-breakpoints-list-handler-custom () 1637 (defun gdb-breakpoints-list-handler-custom ()
1622 (setq gdb-pending-triggers (delq 'gdb-invalidate-breakpoints
1623 gdb-pending-triggers))
1624 (let ((breakpoints-list (gdb-get-field 1638 (let ((breakpoints-list (gdb-get-field
1625 (json-partial-output "bkpt" "script") 1639 (json-partial-output "bkpt" "script")
1626 'BreakpointTable 'body))) 1640 'BreakpointTable 'body)))
1627 (setq gdb-breakpoints-list breakpoints-list) 1641 (setq gdb-breakpoints-list breakpoints-list)
1628 (insert "Num\tType\t\tDisp\tEnb\tHits\tAddr What\n") 1642 (insert "Num\tType\t\tDisp\tEnb\tHits\tAddr What\n")
1944 "Font lock keywords used in `gdb-threads-mode'.") 1958 "Font lock keywords used in `gdb-threads-mode'.")
1945 1959
1946 (defvar gdb-threads-mode-map 1960 (defvar gdb-threads-mode-map
1947 (let ((map (make-sparse-keymap))) 1961 (let ((map (make-sparse-keymap)))
1948 (define-key map " " 'gdb-select-thread) 1962 (define-key map " " 'gdb-select-thread)
1963 (define-key map "s" 'gdb-display-stack-for-thread)
1964 (define-key map "S" 'gdb-frame-stack-for-thread)
1965 (define-key map "l" 'gdb-display-locals-for-thread)
1966 (define-key map "L" 'gdb-frame-locals-for-thread)
1967 (define-key map "r" 'gdb-display-registers-for-thread)
1968 (define-key map "R" 'gdb-frame-registers-for-thread)
1949 map)) 1969 map))
1950 1970
1951 (defvar gdb-breakpoints-header 1971 (defvar gdb-breakpoints-header
1952 (list 1972 (list
1953 (gdb-propertize-header "Breakpoints" gdb-breakpoints-buffer 1973 (gdb-propertize-header "Breakpoints" gdb-breakpoints-buffer
2003 (when (string-equal gdb-thread-number 2023 (when (string-equal gdb-thread-number
2004 (gdb-get-field thread 'id)) 2024 (gdb-get-field thread 'id))
2005 (set-marker gdb-thread-position (line-beginning-position))) 2025 (set-marker gdb-thread-position (line-beginning-position)))
2006 (newline)))) 2026 (newline))))
2007 2027
2008 (defun gdb-select-thread () 2028 (defmacro def-gdb-thread-buffer-command (name custom-defun &optional doc)
2009 "Select the thread at current line of threads buffer." 2029 "Define a NAME command which will act upon thread on the current line.
2010 (interactive) 2030
2011 (save-excursion 2031 CUSTOM-DEFUN may use locally bound `thread' variable, which will
2012 (beginning-of-line) 2032 be the value of 'gdb-thread propery of the current line. If
2013 (let ((thread (get-text-property (point) 'gdb-thread))) 2033 'gdb-thread is nil, error is signaled."
2014 (if thread 2034 `(defun ,name ()
2015 (if (string-equal (gdb-get-field thread 'state) "running") 2035 ,(when doc doc)
2016 (error "Cannot select running thread") 2036 (interactive)
2017 (let ((new-id (gdb-get-field thread 'id))) 2037 (save-excursion
2018 (setq gdb-thread-number new-id) 2038 (beginning-of-line)
2019 (gud-basic-call (concat "-thread-select " new-id)))) 2039 (let ((thread (get-text-property (point) 'gdb-thread)))
2020 (error "Not recognized as thread line"))))) 2040 (if thread
2041 ,custom-defun
2042 (error "Not recognized as thread line"))))))
2043
2044 (defmacro def-gdb-thread-buffer-simple-command (name buffer-command &optional doc)
2045 "Define a NAME which will call BUFFER-COMMAND with id of thread
2046 on the current line."
2047 `(def-gdb-thread-buffer-command ,name
2048 (,buffer-command (gdb-get-field thread 'id))
2049 ,doc))
2050
2051 (def-gdb-thread-buffer-command gdb-select-thread
2052 (if (string-equal (gdb-get-field thread 'state) "running")
2053 (error "Cannot select running thread")
2054 (let ((new-id (gdb-get-field thread 'id)))
2055 (setq gdb-thread-number new-id)
2056 (gud-basic-call (concat "-thread-select " new-id))))
2057 "Select the thread at current line of threads buffer.")
2058
2059 (def-gdb-thread-simple-buffer-command
2060 gdb-display-stack-for-thread
2061 gdb-display-stack-buffer
2062 "Display stack buffer for the thread at current line.")
2063
2064 (def-gdb-thread-simple-buffer-command
2065 gdb-display-locals-for-thread
2066 gdb-display-locals-buffer
2067 "Display locals buffer for the thread at current line.")
2068
2069 (def-gdb-thread-simple-buffer-command
2070 gdb-display-registers-for-thread
2071 gdb-display-registers-buffer
2072 "Display registers buffer for the thread at current line.")
2073
2074 (def-gdb-thread-simple-buffer-command
2075 gdb-frame-stack-for-thread
2076 gdb-frame-stack-buffer
2077 "Display a new frame with stack buffer for the thread at
2078 current line.")
2079
2080 (def-gdb-thread-simple-buffer-command
2081 gdb-frame-locals-for-thread
2082 gdb-frame-locals-buffer
2083 "Display a new frame with locals buffer for the thread at
2084 current line.")
2085
2086 (def-gdb-thread-simple-buffer-command
2087 gdb-frame-registers-for-thread
2088 gdb-frame-registers-buffer
2089 "Display a new frame with registers buffer for the thread at
2090 current line.")
2021 2091
2022 2092
2023 ;;; Memory view 2093 ;;; Memory view
2024 2094
2025 (defcustom gdb-memory-rows 8 2095 (defcustom gdb-memory-rows 8
2652 (put-text-property bl (+ bl 4) 2722 (put-text-property bl (+ bl 4)
2653 'face '(:inverse-video t))))) 2723 'face '(:inverse-video t)))))
2654 (forward-line 1))))) 2724 (forward-line 1)))))
2655 2725
2656 (defun gdb-stack-buffer-name () 2726 (defun gdb-stack-buffer-name ()
2657 (concat "*stack frames of " (gdb-get-target-string) " (thread " gdb-thread-number ")*")) 2727 (gdb-current-context-buffer-name
2728 (concat "stack frames of " (gdb-get-target-string))))
2658 2729
2659 (def-gdb-display-buffer 2730 (def-gdb-display-buffer
2660 gdb-display-stack-buffer 2731 gdb-display-stack-buffer
2661 'gdb-stack-buffer 2732 'gdb-stack-buffer
2662 "Display backtrace of current stack.") 2733 "Display backtrace of current stack.")
2721 (gdb-set-buffer-rules 2792 (gdb-set-buffer-rules
2722 'gdb-locals-buffer 2793 'gdb-locals-buffer
2723 'gdb-locals-buffer-name 2794 'gdb-locals-buffer-name
2724 'gdb-locals-mode 2795 'gdb-locals-mode
2725 'gdb-invalidate-locals) 2796 'gdb-invalidate-locals)
2726
2727 (defconst gdb-stack-list-locals-regexp
2728 (concat "name=\"\\(.*?\\)\",type=\"\\(.*?\\)\""))
2729 2797
2730 (defvar gdb-locals-watch-map 2798 (defvar gdb-locals-watch-map
2731 (let ((map (make-sparse-keymap))) 2799 (let ((map (make-sparse-keymap)))
2732 (suppress-keymap map) 2800 (suppress-keymap map)
2733 (define-key map "\r" 'gud-watch) 2801 (define-key map "\r" 'gud-watch)
2807 '(gdb-locals-font-lock-keywords)) 2875 '(gdb-locals-font-lock-keywords))
2808 (run-mode-hooks 'gdb-locals-mode-hook) 2876 (run-mode-hooks 'gdb-locals-mode-hook)
2809 'gdb-invalidate-locals) 2877 'gdb-invalidate-locals)
2810 2878
2811 (defun gdb-locals-buffer-name () 2879 (defun gdb-locals-buffer-name ()
2812 (concat "*locals of " (gdb-get-target-string) "*")) 2880 (gdb-current-context-buffer-name
2881 (concat "locals of " (gdb-get-target-string))))
2813 2882
2814 (def-gdb-display-buffer 2883 (def-gdb-display-buffer
2815 gdb-display-locals-buffer 2884 gdb-display-locals-buffer
2816 'gdb-locals-buffer 2885 'gdb-locals-buffer
2817 "Display local variables of current stack and their values.") 2886 "Display local variables of current stack and their values.")
2872 (use-local-map gdb-registers-mode-map) 2941 (use-local-map gdb-registers-mode-map)
2873 (run-mode-hooks 'gdb-registers-mode-hook) 2942 (run-mode-hooks 'gdb-registers-mode-hook)
2874 'gdb-invalidate-registers) 2943 'gdb-invalidate-registers)
2875 2944
2876 (defun gdb-registers-buffer-name () 2945 (defun gdb-registers-buffer-name ()
2877 (concat "*registers of " (gdb-get-target-string) "*")) 2946 (gdb-current-context-buffer-name
2947 (concat "registers of " (gdb-get-target-string))))
2878 2948
2879 (def-gdb-display-buffer 2949 (def-gdb-display-buffer
2880 gdb-display-registers-buffer 2950 gdb-display-registers-buffer
2881 'gdb-registers-buffer 2951 'gdb-registers-buffer
2882 "Display integer register contents.") 2952 "Display integer register contents.")
2887 "Display integer register contents in a new frame.") 2957 "Display integer register contents in a new frame.")
2888 2958
2889 ;; Needs GDB 6.4 onwards (used to fail with no stack). 2959 ;; Needs GDB 6.4 onwards (used to fail with no stack).
2890 (defun gdb-get-changed-registers () 2960 (defun gdb-get-changed-registers ()
2891 (if (and (gdb-get-buffer 'gdb-registers-buffer) 2961 (if (and (gdb-get-buffer 'gdb-registers-buffer)
2892 (not (member 'gdb-get-changed-registers gdb-pending-triggers))) 2962 (not (gdb-pending-p 'gdb-get-changed-registers)))
2893 (progn 2963 (progn
2894 (gdb-input 2964 (gdb-input
2895 (list 2965 (list
2896 "-data-list-changed-registers" 2966 "-data-list-changed-registers"
2897 'gdb-changed-registers-handler)) 2967 'gdb-changed-registers-handler))
2898 (push 'gdb-get-changed-registers gdb-pending-triggers)))) 2968 (gdb-add-pending 'gdb-get-changed-registers))))
2899 2969
2900 (defun gdb-changed-registers-handler () 2970 (defun gdb-changed-registers-handler ()
2901 (setq gdb-pending-triggers 2971 (gdb-delete-pending 'gdb-get-changed-registers)
2902 (delq 'gdb-get-changed-registers gdb-pending-triggers))
2903 (setq gdb-changed-registers nil) 2972 (setq gdb-changed-registers nil)
2904 (dolist (register-number (gdb-get-field (json-partial-output) 'changed-registers)) 2973 (dolist (register-number (gdb-get-field (json-partial-output) 'changed-registers))
2905 (push register-number gdb-changed-registers))) 2974 (push register-number gdb-changed-registers)))
2906 2975
2907 (defun gdb-register-names-handler () 2976 (defun gdb-register-names-handler ()
2926 (gdb-init-buffer)))) 2995 (gdb-init-buffer))))
2927 (gdb-force-mode-line-update 2996 (gdb-force-mode-line-update
2928 (propertize "ready" 'face font-lock-variable-name-face))) 2997 (propertize "ready" 'face font-lock-variable-name-face)))
2929 2998
2930 (defun gdb-get-selected-frame () 2999 (defun gdb-get-selected-frame ()
2931 (if (not (member 'gdb-get-selected-frame gdb-pending-triggers)) 3000 (if (not (gdb-pending-p 'gdb-get-selected-frame))
2932 (progn 3001 (progn
2933 (gdb-input 3002 (gdb-input
2934 (list (gdb-current-context-command "-stack-info-frame") 'gdb-frame-handler)) 3003 (list (gdb-current-context-command "-stack-info-frame") 'gdb-frame-handler))
2935 (push 'gdb-get-selected-frame 3004 (push 'gdb-get-selected-frame
2936 gdb-pending-triggers)))) 3005 gdb-pending-triggers))))
2937 3006
2938 (defun gdb-frame-handler () 3007 (defun gdb-frame-handler ()
2939 (setq gdb-pending-triggers 3008 (gdb-delete-pending 'gdb-get-selected-frame)
2940 (delq 'gdb-get-selected-frame gdb-pending-triggers))
2941 (let ((frame (gdb-get-field (json-partial-output) 'frame))) 3009 (let ((frame (gdb-get-field (json-partial-output) 'frame)))
2942 (when frame 3010 (when frame
2943 (setq gdb-frame-number (gdb-get-field frame 'level)) 3011 (setq gdb-frame-number (gdb-get-field frame 'level))
2944 (setq gdb-pc-address (gdb-get-field frame 'addr)) 3012 (setq gdb-pc-address (gdb-get-field frame 'addr))
2945 (setq gdb-selected-frame (gdb-get-field frame 'func)) 3013 (setq gdb-selected-frame (gdb-get-field frame 'func))