[slime-devel] gdb support for cmucl/sparc

Raymond Toy toy.raymond at gmail.com
Thu Aug 26 19:45:41 UTC 2010


Here are a couple of replacement functions that make slime disassemble
work with cmucl/sparc.  The disassembly works for me on cmucl/sparc.
The foreign source location appears to work, but the only foreign
function I've been able to test with is call_into_lisp which doesn't
have any line info.  But slime recognizes that and prints a message to
that affect.

Ray

> (defun frame-ip (frame)
>   "Return the (absolute) instruction pointer and the relative pc of FRAME."
>   (if (not frame)
>       (sys:int-sap (ldb (byte vm:word-bits 0) -1))
>       (let ((debug-fun (di::frame-debug-function frame)))
>         (etypecase debug-fun
>           (di::compiled-debug-function 
>            (let* ((code-loc (di:frame-code-location frame))
>                   (component (di::compiled-debug-function-component debug-fun))
>                   (pc (di::compiled-code-location-pc code-loc))
>                   (ip (sys:without-gcing
>                        (sys:sap-int
>                         (sys:sap+ (kernel:code-instructions component) pc)))))
>              (values ip pc)))
>           (di::interpreted-debug-function
>            (sys:int-sap (ldb (byte vm:word-bits 0) -1)))
>           (di::bogus-debug-function
>            #-x86
>            (let* ((real (di::frame-real-frame (di::frame-up frame)))
>                   (fp (di::frame-pointer real)))
>              #+(or)
>              (progn
>                (format *debug-io* "Frame-real-frame = ~S~%" real)
>                (format *debug-io* "fp = ~S~%" fp)
>                (format *debug-io* "lra = ~S~%"
>                        (kernel:stack-ref fp vm::lra-save-offset)))
>              (values 
>               (sys:int-sap
>                (kernel:get-lisp-obj-address
>                 (kernel:stack-ref fp vm::lra-save-offset)))
>               0))
>            #+x86
>            (let ((fp (di::frame-pointer (di:frame-up frame))))
>              (multiple-value-bind (ra ofp) (di::x86-call-context fp)
>                (declare (ignore ofp))
>                (values ra 0))))))))
> 
> (defun foreign-frame-p (frame)
>   #-x86
>   (let ((ip (frame-ip frame)))
>     (and (sys:system-area-pointer-p ip)
>          (typep (di::frame-debug-function frame) 'di::bogus-debug-function)))
>   #+x86
>   (let ((ip (frame-ip frame)))
>     (and (sys:system-area-pointer-p ip)
>          (multiple-value-bind (pc code)
>              (di::compute-lra-data-from-pc ip)
>            (declare (ignore pc))
>            (not code)))))
> 
> (defun gdb-exec (cmd)
>   (with-temporary-file (file filename)
>     (write-string cmd file)
>     (force-output file)
>     (let* ((output (make-string-output-stream))
>            ;; gdb on sparc needs to know the executable to find the
>            ;; symbols.  Without this, gdb can't disassemble anything.
>            ;; NOTE: We assume that the first entry in
>            ;; lisp::*cmucl-lib* is the bin directory where lisp is
>            ;; located.  If this is not true, we'll have to do
>            ;; something better to find the lisp executable.
>            (lisp-path
>             #+sparc
>              (list
>               (namestring
>                (probe-file
>                 (merge-pathnames "lisp"
>                                  (car (lisp::parse-unix-search-path lisp::*cmucl-lib*))))))
>              #-sparc
>              nil)
>            (proc (ext:run-program "gdb" `(, at lisp-path "-batch" "-x" ,filename) 
>                                   :wait t
>                                   :output output)))
>       (assert (eq (ext:process-status proc) :exited))
>       (assert (eq (ext:process-exit-code proc) 0))
>       (get-output-stream-string output))))






More information about the slime-devel mailing list