{"id":546,"date":"2013-05-22T22:45:35","date_gmt":"2013-05-22T20:45:35","guid":{"rendered":"http:\/\/www.blackhats.es\/wordpress\/?p=546"},"modified":"2022-08-20T18:25:37","modified_gmt":"2022-08-20T16:25:37","slug":"slime-sldb-slime-debugger","status":"publish","type":"post","link":"https:\/\/www.blackhats.es\/wordpress\/?p=546","title":{"rendered":"SLDB (SLIME Debugger)"},"content":{"rendered":"<p style=\"text-align: justify;\">SLDB es el debugger incluido en SLIME, aunque por supuesto se puede especificar otro; aunque este esta optimizado para CL y bien integrado en emacs.<\/p>\n<p style=\"text-align: justify;\">Ciertas condiciones en el sistema Lisp invocaran a SLDB en emacs mediante *DEBUGGER-HOOK*. SLDB mostrara un buffer con la condicion que ha lanzado la senal. Es a partir de este momento cuando se nos da la posibilidad de debuggear mediante SLDB.<\/p>\n<p>Para examinar frames tenemos los siguientes keybindings:<\/p>\n<p style=\"padding-left: 30px;\"><strong>t<\/strong> : &#8216;<span style=\"color: #0000ff;\">sldb-toggle-details<\/span>&#8216; ; Hace toggle para mostrar las variables locales y los tags CATCH.<\/p>\n<p style=\"padding-left: 30px;\"><strong>v<\/strong> : &#8216;<span style=\"color: #0000ff;\">sldb-show-source<\/span>&#8216; ; Visualiza las expresiones de codigo del frame actual.<\/p>\n<p style=\"padding-left: 30px;\"><strong>e<\/strong> : &#8216;<span style=\"color: #0000ff;\">sldb-eval-in-frame<\/span>&#8216; ; Evalua una expresion en el frame. La expresion puede referirse a las variables locales disponibles del frame.<\/p>\n<p style=\"padding-left: 30px;\"><strong>d<\/strong> : &#8216;<span style=\"color: #0000ff;\">sldb-pprint-eval-in-frame<\/span>&#8216; ; Evalua una expresion en el frame e imprime el resultado en un buffer temporal.<\/p>\n<p style=\"padding-left: 30px;\"><strong>D<\/strong> : &#8216;<span style=\"color: #0000ff;\">sldb-disassemble<\/span>&#8216; ; Desensambla la funcion de un frame. Incluye informacion como punteros a instrucciones en el frame.<\/p>\n<p style=\"padding-left: 30px;\"><strong>i<\/strong> : &#8216;<span style=\"color: #0000ff;\">sldb-inspect-in-frame<\/span>&#8216; ; Inspecciona el resultado de evaluar una expresion en el frame.<\/p>\n<p style=\"padding-left: 30px;\"><strong>C-c C-c<\/strong> : &#8216;<span style=\"color: #0000ff;\">sldb-recompile-frame-source<\/span>&#8216; ; Recompila un frame. Mediante el argumento con C-u C-c C-c recompila el frame con las opciones de debugging maximas posibles.<\/p>\n<p>Para reiniciar la invocacion:<\/p>\n<p style=\"padding-left: 30px;\"><strong>a<\/strong> : &#8216;<span style=\"color: #0000ff;\">sldb-abort<\/span>&#8216; ; Invoca el reinicio ABORT.<\/p>\n<p style=\"padding-left: 30px;\"><strong>q<\/strong> : &#8216;<span style=\"color: #0000ff;\">sldb-quit<\/span>&#8216; ; Sale. Para peticiones de evaluacion SLIME, invoca el reinicio el cual restaura el estado conocido de un programa. Para errores en otros threads, es necesario indagar en [SWANK:*SLDB-QUIT-RESTART*].<\/p>\n<p style=\"padding-left: 30px;\"><strong>c<\/strong> : &#8216;<span style=\"color: #0000ff;\">sldb-continue<\/span>&#8216; ; invoca el reinicio CONTINUE<\/p>\n<p style=\"padding-left: 30px;\"><strong>0&#8230;9<\/strong> : invoca el reinicio por numero<\/p>\n<p>Los reinicios pueden ser tambien invocados pulsando <strong>RET<\/strong> en el buffer.<\/p>\n<p style=\"padding-left: 30px;\">Para navegar entre frames:<\/p>\n<p style=\"padding-left: 30px;\"><strong>n<\/strong> : &#8216;<span style=\"color: #0000ff;\">sldb-down<\/span>&#8216; ; Se mueve frame abajo.<\/p>\n<p style=\"padding-left: 30px;\"><strong>p<\/strong> : &#8216;<span style=\"color: #0000ff;\">sldb-up<\/span>&#8216; ; Se mueve frame arriba.<\/p>\n<p style=\"padding-left: 30px;\"><strong>M-n<\/strong> : &#8216;<span style=\"color: #0000ff;\">sldb-details-down<\/span>&#8216; ; Se mueve frame abajo \u00abcon azucar\u00bb: oculta los detalles del frame original y muestra detalles y codigo fuente del siguiente. El movimiento entre frames con azucarado muesta los detalles del codigo fuente del frame actual solamente.<\/p>\n<p style=\"padding-left: 30px;\"><strong>M-p<\/strong> : &#8216;<span style=\"color: #0000ff;\">sldb-details-up<\/span>&#8216; ; Se mueve frame arriba \u00abcon azucar\u00bb: oculta los detalles del frame original y muestra detalles y codigo fuente del anterior. El movimiento entre frames con azucarado muesta los detalles del codigo fuente del frame actual solamente.<\/p>\n<p style=\"padding-left: 30px;\"><strong>&gt;<\/strong> : &#8216;<span style=\"color: #0000ff;\">sldb-end-of-backtrace<\/span>&#8216; ; Captura el backtrace entero y salta al ultimo frame.<\/p>\n<p style=\"padding-left: 30px;\"><strong>&lt;<\/strong> : &#8216;<span style=\"color: #0000ff;\">sldb-beginning-of-backtrace<\/span>&#8216; ; Salta al primer frame.<\/p>\n<p>Para realizar pasos con el debugger empleamos los siguientes keybidings:<\/p>\n<p style=\"padding-left: 30px;\"><strong>s<\/strong> : &#8216;<span style=\"color: #0000ff;\">sldb-step<\/span>&#8216; ; Da un paso hacia la siguiente expresion en el frame. Para CMUCL esto significa que hace set para un breakpoint para todas aquellas partes de codigo del bloque actual de codigo el cual es alcanzable desde el codigo en la localizacion actual.<\/p>\n<p style=\"padding-left: 30px;\"><strong>x<\/strong> : &#8216;<span style=\"color: #0000ff;\">sldb-next<\/span>&#8216; ; Da un paso hacia adelante en la funcion actual.<\/p>\n<p style=\"padding-left: 30px;\"><strong>o<\/strong> : &#8216;<span style=\"color: #0000ff;\">sldb-out<\/span>&#8216; ; Para el paso-simple de forma temporal, pero lo continua una vez se vuelva de la funcion actual.<\/p>\n<p>Otros keybidings empleandos en el debugger y de utilidad son:<\/p>\n<p style=\"padding-left: 30px;\"><strong>r<\/strong> : &#8216;<span style=\"color: #0000ff;\">sldb-restart-frame<\/span>&#8216; ; Reinicia la ejecucion de un frame con los mismos argumentos que fueron originalmente usados en la llamada.<\/p>\n<p style=\"padding-left: 30px;\"><strong>R<\/strong> : &#8216;<span style=\"color: #0000ff;\">sldb-return-from-frame<\/span>&#8216; ; Vuelve desde el frame con el valor introducido en el minibuffer.<\/p>\n<p style=\"padding-left: 30px;\"><strong>B<\/strong> : &#8216;<span style=\"color: #0000ff;\">sldb-break-with-default-debugger<\/span>&#8216; ; Sale de SLDB y debuggea la condicion usando el debugger por defecto del sistema Lisp.<\/p>\n<p style=\"padding-left: 30px;\"><strong>C<\/strong> : &#8216;<span style=\"color: #0000ff;\">sldb-inspect-condition<\/span>&#8216; ; Inspecciona la condicion actual a ser debuggeada.<\/p>\n<p style=\"padding-left: 30px;\"><strong>:<\/strong> : &#8216;<span style=\"color: #0000ff;\">slime-interactive-eval<\/span>&#8216; ; Evalua una expresion introducida en el minibuffer.<\/p>\n<p style=\"padding-left: 30px;\"><strong>A<\/strong> : &#8216;<span style=\"color: #0000ff;\">sldb-break-with-system-debugger<\/span>&#8216; ; Adjunta el debugger al proceso actual lisp.<\/p>\n<p style=\"padding-left: 30px; text-align: center;\"><a href=\"https:\/\/www.blackhats.es\/wordpress\/?attachment_id=547\" rel=\"attachment wp-att-547\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-547\" alt=\"Selection_002\" src=\"https:\/\/www.blackhats.es\/wordpress\/wp-content\/uploads\/2013\/05\/Selection_002.png\" width=\"706\" height=\"420\" srcset=\"https:\/\/www.blackhats.es\/wordpress\/wp-content\/uploads\/2013\/05\/Selection_002.png 706w, https:\/\/www.blackhats.es\/wordpress\/wp-content\/uploads\/2013\/05\/Selection_002-300x178.png 300w\" sizes=\"(max-width: 706px) 100vw, 706px\" \/><\/a><\/p>\n<p style=\"padding-left: 30px; text-align: center;\">Captura de pantalla de SLDB<\/p>\n","protected":false},"excerpt":{"rendered":"<p>SLDB es el debugger incluido en SLIME, aunque por supuesto se puede especificar otro; aunque este esta optimizado para CL y bien integrado en emacs. Ciertas condiciones en el sistema Lisp invocaran a SLDB en emacs mediante *DEBUGGER-HOOK*. SLDB mostrara un buffer con la condicion que ha lanzado la senal. Es a partir de este [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[297],"tags":[248,69,299,67,8,66,298,71,300],"class_list":["post-546","post","type-post","status-publish","format-standard","hentry","category-advanced","tag-cl","tag-common-lisp","tag-debugger","tag-elisp","tag-emacs","tag-lisp","tag-sldb","tag-slime","tag-slime-debugger"],"_links":{"self":[{"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/546"}],"collection":[{"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=546"}],"version-history":[{"count":4,"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/546\/revisions"}],"predecessor-version":[{"id":550,"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/546\/revisions\/550"}],"wp:attachment":[{"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=546"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=546"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=546"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}