{"id":23,"date":"2008-02-10T22:03:06","date_gmt":"2008-02-10T21:03:06","guid":{"rendered":"http:\/\/slack.codemaniacs.com\/blog\/2008\/02\/10\/trazas-con-gdb\/"},"modified":"2023-05-07T06:38:04","modified_gmt":"2023-05-07T05:38:04","slug":"trazas-con-gdb","status":"publish","type":"post","link":"https:\/\/slack.codemaniacs.com\/blog\/2008\/02\/10\/trazas-con-gdb\/","title":{"rendered":"Trazas con gdb"},"content":{"rendered":"<p>Todo programador ha pasado alguna vez por la experiencia de depurar un programa a golpe de printf(), con los inconvenientes que ello supone, sobre todo recompilar cada vez que se quiere cambiar la informaci\u00f3n que se imprime en la traza.<\/p>\n<p>Pues resulta que es posible hacer las cosas &#8220;bien&#8221; :)<\/p>\n<p>Con gdb podemos imprimir los valores de variables de nuestro programa, eso es algo que todos sabemos PERO tambi\u00e9n podemos darle una serie de \u00f3rdenes a ejecutar al pasar por un breakpoint.<\/p>\n<p>Veamos un ejemplo. Sea el siguiente programa en C:<\/p>\n<pre>#include &lt;stdio.h&gt;\n\nint main()\n{\n        int i;\n        double x=2.0f;\n        for (i=0; i&lt;64; i++)\n                x*=2;\n        return 0;\n}\n<\/pre>\n<p>Si compilamos con -g (para debug) y lo lanzamos en gdb podemos visualizar los valores de x as\u00ed\u00ad:<\/p>\n<pre><code>(gdb) break 8\nBreakpoint 1 at 0x400463: file a.c, line 8.\n(gdb) commands 1\nType commands for when breakpoint 1 is hit, one per line.\nEnd with a line saying just \"end\".\n&gt;silent\n&gt;printf \"x=%g\\n\",x\n&gt;cont\n&gt;end\n(gdb) r\nStarting program: \/home\/slack\/a.out\nx=2\nx=4\nx=8\nx=16\nx=32\nx=64\n[...]<\/code><\/pre>\n<p>El &#8220;silent&#8221; del principio es para que gdb no imprima la informaci\u00f3n que suele mostrar al pararse en un breakpoint (fichero, n\u00famero de l\u00ednea, contador de programa, etc) y la traza salga m\u00e1s limpia.<\/p>\n<p>Por supuesto se pueden hacer mas cosas. gdb permite definir variables externas al programa y ejecuci\u00f3n condicional, as\u00ed\u00ad que podemos contar las veces que pasamos por algun sitio y lanzar \u00f3rdenes en momentos concretos y tonter\u00edas similares :D<\/p>\n<p>Happy coding!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Todo programador ha pasado alguna vez por la experiencia de depurar un programa a golpe de printf(), con los inconvenientes que ello supone, sobre todo recompilar cada vez que se quiere cambiar la informaci\u00f3n que se imprime en la traza. Pues resulta que es posible hacer las cosas &#8220;bien&#8221; :) Con gdb podemos imprimir los [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[11],"tags":[],"_links":{"self":[{"href":"https:\/\/slack.codemaniacs.com\/blog\/wp-json\/wp\/v2\/posts\/23"}],"collection":[{"href":"https:\/\/slack.codemaniacs.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/slack.codemaniacs.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/slack.codemaniacs.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/slack.codemaniacs.com\/blog\/wp-json\/wp\/v2\/comments?post=23"}],"version-history":[{"count":3,"href":"https:\/\/slack.codemaniacs.com\/blog\/wp-json\/wp\/v2\/posts\/23\/revisions"}],"predecessor-version":[{"id":92,"href":"https:\/\/slack.codemaniacs.com\/blog\/wp-json\/wp\/v2\/posts\/23\/revisions\/92"}],"wp:attachment":[{"href":"https:\/\/slack.codemaniacs.com\/blog\/wp-json\/wp\/v2\/media?parent=23"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/slack.codemaniacs.com\/blog\/wp-json\/wp\/v2\/categories?post=23"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/slack.codemaniacs.com\/blog\/wp-json\/wp\/v2\/tags?post=23"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}