Gentoo Archives: gentoo-commits

From: "JosA MarAa Alonso (nimiux)" <nimiux@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] gentoo commit in xml/htdocs/proj/es/qa: backtraces.xml
Date: Mon, 28 Jun 2010 17:30:52
Message-Id: 20100628173049.E70782CE15@corvid.gentoo.org
1 nimiux 10/06/28 17:30:49
2
3 Added: backtraces.xml
4 Log:
5 New spanish tranlation.
6
7 Revision Changes Path
8 1.1 xml/htdocs/proj/es/qa/backtraces.xml
9
10 file : http://sources.gentoo.org/viewvc.cgi/gentoo/xml/htdocs/proj/es/qa/backtraces.xml?rev=1.1&view=markup
11 plain: http://sources.gentoo.org/viewvc.cgi/gentoo/xml/htdocs/proj/es/qa/backtraces.xml?rev=1.1&content-type=text/plain
12
13 Index: backtraces.xml
14 ===================================================================
15 <?xml version="1.0" encoding="utf-8"?>
16 <!DOCTYPE guide SYSTEM "http://www.gentoo.org/dtd/guide.dtd">
17 <!-- $Header: /var/cvsroot/gentoo/xml/htdocs/proj/es/qa/backtraces.xml,v 1.1 2010/06/28 17:30:49 nimiux Exp $ -->
18
19
20 <guide link="/proj/en/qa/backtraces.xml" lang="en">
21 <title>Cómo obtener trazas íntegras en Gentoo</title>
22
23 <author title="Autor">
24 <mail link="flameeyes@g.o">Diego E. Pettenò</mail>
25 </author>
26
27 <author title="Información sobre la cadena de herramientas Hardened">
28 <mail link="solar@g.o">Ned Ludd</mail>
29 </author>
30
31 <author title="Información sobre la cadena de herramientas Hardened y la arquitectura x86">
32 <mail link="kevquinn@g.o">Kevin Quinn</mail>
33 </author>
34
35 <author title="Revisor">
36 <mail link="dberkholz@g.o">Donnie Berkholz</mail>
37 </author>
38
39 <abstract>
40 Esta guía pretende ofrecer a los usuarios una explicación simple de porqué
41 una instalación por defecto de Gentoo no ofrece unas trazas íntegras y cómo
42 realizar ajustes para obtenerlas.
43 </abstract>
44
45 <!-- The content of this document is licensed under the CC-BY-SA license -->
46 <!-- See http://creativecommons.org/licenses/by-sa/2.5 -->
47
48
49 <license/>
50
51 <version>0.10</version>
52 <date>2010-06-16</date>
53
54 <chapter><!-- Introduction -->
55
56 <title>Trazas en Gentoo</title>
57
58 <section>
59 <title>¿Qué son las trazas?</title>
60
61 <body>
62
63 <p>
64 Una <e>traza</e>, también llamada bt, trace, o stack trace (traza de pila)
65 es un informe legible por un humano de la pila de llamadas realizadas por un
66 programa. Informa en qué punto de un programa se encuentra y cómo se llegó
67 a ese punto a través de todas las funciones hasta la función
68 <path>main()</path> (por lo menos esta es la teoría). Las trazas son
69 normalmente analizadas cuando acontecen condiciones de error como fallos de
70 segmento o abortos en la ejecución. Para su análisis se usan depuradores
71 como <c>gdb</c> (GNU debugger), que ayudan a encontrar la causa del error.
72 </p>
73
74 <p>
75 Una traza íntegra, contiene no sólo los objetos compartidos (shared objects)
76 en los que se generó la llamada, también el nombre de la función, el nombre
77 del fichero y el la línea en la que se detuvo la ejecución. Desgraciadamente
78 en un sistema optimizado para el rendimiento y el ahorro de espacio, las
79 trazas no tienen ninguna utilidad y muestran únicamente los punteros a la
80 pila y una serie de caracteres ?? en lugar del nombre de las funciones y su
81 posición.
82 </p>
83
84 <p>
85 Esta guía le mostrará cómo es posible obtener trazas útiles e íntegras en
86 Gentoo usando características de Portage.
87 </p>
88
89 </body>
90 </section>
91
92 <section><!-- Compiler flags -->
93
94 <title>Ajustes del compilador</title>
95
96 <body>
97
98 <p>
99 Por defecto <c>gcc</c> no incluye información de depuración dentro de los
100 objetos (librerías y programas) que construye, ya que ésto crearía objetos
101 más grandes. También muchas optimizaciones interfieren en cómo la
102 información de depuración es guardada. Por estas razones, la primera
103 cuestión a tener en cuenta es que los ajustes CFLAGS estén preparados para
104 generar información de depuración útil.
105 </p>
106
107 <p>
108 El ajuste básico a añadir en este caso es <c>-g</c>. Ésto hace que el
109 compilador incluya información extra en los objetos, como los nombres de
110 fichero y los números de línea. Esto normalmente es suficiente para tener
111 trazas básicas. Sin embargo el ajuste <c>-ggdb</c> añade más información. De
112 hecho existe otro ajuste (<c>-g3</c>) pero su uso no está
113 recomendado. Parece que rompe las interfaces binarias y puede llevar a algún
114 error de ejecución inesperado. Por ejemplo <path>glibc</path> falla cuando
115 se construye usando este ajuste. Si quiere ofrecer la mayor información
116 posible, debe usar el ajuste <c>-ggdb</c>.
117 </p>
118
119 <pre caption="Ejemplo de CFLAGS con información de depuración">
120 CFLAGS="-march=k8 -O2 -ggdb"
121 CXXFLAGS="${CFLAGS}"
122 </pre>
123
124 <p>
125 Altos niveles de optimización como <c>-O3</c> pueden causar que la traza sea
126 menos fiable o incluso incorrecta. Generalmente hablando, <c>-O2</c> y
127 <c>-Os</c> pueden usarse de forma segura para obtener una traza aproximada,
128 bajando hasta la función llamada y el área del fichero fuente dónde se
129 produjo el error de ejecución. Para trazas más precisas se puede usar
130 <c>-O1</c>.
131 </p>
132
133 <note>
134 El uso de <c>-O0</c> es sugerido a menudo cuando se intenta producir una
135 traza completa. Desgraciadamente esto no funciona siempre bien con el
136 software, ya que la desactivación de las optimizaciones cambia la
137 implementación de las funciones en la librería GNU C (sys-libs/glibc), hasta
138 el punto de que se pueden considerar dos librerías diferentes, una para
139 construcciones optimizadas y otra para no optimizadas. También, algún
140 software puede fallar a la hora de ser construido cuando se usa <c>-O0</c>,
141 debido a los cambios en los ficheros de inclusión de cabeceras y la falta de
142 características como la propagación constante en la eliminación de código
143 muerto.
144 </note>
145
146 <p>
147 Aviso para los usuarios de arquitecturas x86: Los usuarios de x86
148 normalmente tienen <c>-fomit-frame-pointer</c> en su CFLAGS. La arquitectura
149 x86 tiene un juego limitado de registros generales, y este ajuste puede
150 hacer que esté disponible un nuevo registro que mejora el rendimiento. Sin
151 embargo, esto tiene un coste: hace imposible a <c>gdb</c> "caminar por la
152 pila" &#8212; en otras palabras: generar la traza de forma
153 confiable. Elimine este ajuste de CFLAGS para construir algo más fácil de
154 comprender para <c>gdb</c>. En otras plataformas no hay que preocuparse por
155 esto; generalmente el ajuste <c>-fomit-frame-pointer</c> no está activado, o
156 el código generado por <c>gcc</c> no confunde a <c>gdb</c> (en cuyo caso el
157 ajuste está activado por el nivel de optimización <c>-O2</c>).
158 </p>
159
160 <p>
161 Los usuarios de hardened tienen otras cosas de las que preocuparse. Las <uri
162 link="http://www.gentoo.org/proj/en/hardened/hardenedfaq.xml#hardeneddebug">
163 Preguntas de Uso Frecuente de Gentoo Hardened</uri> ofrecen consejos y
164 trucos extra que necesitará saber.
165 </p>
166
167 </body>
168 </section>
169
170 <section><!-- Stripping -->
171
172 <title>Recortando (haciendo stripping)</title>
173
174 <body>
175 <p>
176 Simplemente cambiando sus CFLAGS y haciendo emerge world de nuevo no le dará
177 trazas íntegras, ya que tiene que solventar el problema del recorte. Por
178 defecto Portage recorta los binarios que genera. En otras palabras, elimina
179 las secciones innecesarias para el funcionamiento reduciendo el tamaño de
180 los ficheros instalados. Esto es bueno para el usuario medio, el cual no
181 necesita generar trazas, sin embargo, elimina toda la información de
182 depuración generada por los ajustes <c>-g*</c> al igual que las tablas de
183 símbolos que son necesarias para encontrar la información base para mostrar
184 las trazas de una forma legible por los humanos.
185 </p>
186
187 <p>
188 Hay dos formas de hacer que el recorte no afecte a la depuración y a la
189 generación de trazas. En primer lugar, se debe indicar a Portage que no
190 recorte binarios de ningún modo, añadiendo <e>nostrip</e> a FEATURES. Esto
191 dejará instalados los ficheros exactamante donde <c>gcc</c> los creó, con
192 toda la información de depuración y las tablas de símbolos, lo cual
193 incrementa el espacio en disco ocupado por los ejecutables y las
194 librerías. Para evitar este problema, en la versión 2.0.54-r1 uy en las
195 series 2.1 de Portage, es posible usar la FEATURE <e>splitdebug</e> en su
196 lugar.
197 </p>
198
199 <p>
200 Con <e>splitdebug</e> activado, Portage recortará los binarios instalados en
201 el sistema. Pero antes de hacer esto, toda la información de depuración que
202 sea de utilidad es copiada al fichero ".debug", que es luego instalado
203 dentro de <path>/usr/lib/debug</path> (el nombre completo del fichero se
204 obtendría añadiendo a éste el camino donde el fichero es instalado
205 realmente). El camino a este fichero es entonces guardado en el fichero
206 original dentro de una sección ELF llamada ".gnu_debuglink", de modo que
207 <c>gdb</c> sepa desde que fichero tiene que cargar los símbolos.
208 </p>
209
210 <impo>
211 Si se activan ambas características <e>nostrip</e> y <e>splitdebug</e>,
212 Portage no recortará los binarios de ninguna forma, de modo que se debe que
213 prestar especial atención a lo que se quiere hacer.
214 </impo>
215
216 <p>
217 Otra ventaja de <e>splitdebug</e> es que no requiere la reconstrucción de
218 los paquetes para deshacerse de la información de depuración. Esto es útil
219 cuando se construyen algunos paquetes con depuración para obtener una traza
220 de un sólo error. Una vez este error está subsanado, simplemente se necesita
221 eliminar el directorio <path>/usr/lib/debug</path>.
222 </p>
223
224 <p>
225 Para asegurarse de que no se recortan los binarios, deberá también
226 asegurarse de que tiene activado el ajuste <c>-s</c> en su LDFLAGS. Esto le
227 indica al enlazador que debe recortar los binarios resultantes en la fase de
228 enlazado. También note que usando este ajuste puede desembocar en problemas
229 futuros. No se respetarán las restricciones impuestas por algunos paquetes
230 que dejan de funcionar cuando son recortados completamente.
231 </p>
232
233 <note>
234 Algunos paquetes desafortunadamente manejan el recorte por sí mismos, dentro
235 de los ficheros makefile suministrados por el equipo de desarrollo. Esto es
236 un error y debe ser notificado. Todos los paquetes deben dejar a Portage la
237 tarea de hacer el recorte, o no permitir el recorte de ningún modo. La
238 principal excepción a esto son los paquetes binarios. Son normalmente
239 recortados por el equipo de desarrollo del paquete fuera del control de
240 Portage.
241 </note>
242
243 </body>
244
245 </section>
246
247 <section><!-- debug USE flag -->
248
249 <title>Ajuste USE debug</title>
250
251 <body>
252
253 <p>
254 Algunos ebuild proporcionan un ajuste USE <b>debug</b>. Aunque algunos lo
255 usan de forma incorrecta para ofrecer información de depuración y juegan con
256 los ajustes del compilador cuando el ajuste está activado, éste no es su
257 propósito.
258 </p>
259
260 <p>
261 Si está tratando de depurar un error de ejecución que se puede reproducir,
262 se deberá dejar sólo este ajuste USE, ya que estará construyendo una fuente
263 diferente de la que tenía previamente. Es más eficiente obtener en primer
264 lugar una traza sin cambiar el código, simplemente omitiendo la información
265 de símbolos y justo después de activar las características de depuración
266 para hacer un seguimiento del problema más adelante.
267 </p>
268
269 <p>
270 La características de depuración son activadas mediante las aserciones en
271 los ficheros de cabecera, registros de depuración en la pantalla, ficheros
272 de depuración, detección de goteras (leaks) y operaciones con seguridad
273 extra (como por ejemplo la limpieza de memoria antes de su uso). Algunos
274 pueden ser complicados, especialmente en software complejo o en el cual el
275 rendimiento es una cuestión importante.
276 </p>
277
278 <p>
279 Por estas razones, por favor, tenga cuidado cuando active el ajuste USE
280 <b>debug</b>, y considérelo como el último recurso.
281 </p>
282
283 </body>
284
285 </section>
286
287 <section><!-- Introducing gdb -->
288
289 <title>Introducción a gdb</title>
290
291 <body>
292
293 <p>
294 Una vez construidos los paquetes con información de depuración y no son
295 recortados, simplemente necesita obtener la traza. Para ello, necesitará el
296 paquete <path>sys-devel/gdb</path>. Contiene el depurador GNU
297 (<c>gdb</c>). Después de instalarlo, podrá obtener la traza. La forma más
298 simple de obtnerla es ejecutar el programa dentro de <c>gdb</c>. Para ello,
299 necesitará apuntar <c>gdb</c> al camino del programa a ejecutar, darle los
300 argumentos que necesite y ejecutarlo:
301 </p>
302
303 <pre caption="Corriendo ls a través de gdb">
304 $ <i>gdb /bin/ls</i>
305 GNU gdb 6.4
306 [...]
307
308 (gdb) <i>set args /usr/share/fonts</i>
309 (gdb) <i>run</i>
310 Starting program: /bin/ls /usr/share/fonts
311 [Thread debugging using libthread_db enabled]
312 [New Thread 47467411020832 (LWP 11100)]
313 100dpi aquafont baekmuk-fonts cyrillic dejavu fonts.cache-1 kochi-substitute misc xdtv
314 75dpi arphicfonts CID default encodings fonts.dir mikachan-font util
315
316 Program exited normally.
317 (gdb)
318 </pre>
319
320 <p>
321 El mensaje "Program exited normally" (el programa terminó correctamente),
322 indica que el programa acabó devolviendo el código de salida 0. Esto
323 significa que no se produjo ningún error. No debe fiarse mucho de esto ya
324 que hay programas que devuelven 0 cuando alcanzan una condición de
325 error. Otro mensaje común es "Program exited with code <e>nn</e>" (el
326 programa terminó con código <e>nn</e>). Esto simplemente le indica que
327 código de estado distinto de cero ha devuelto el programa. Esto puede
328 implicar una condición de error manejada o esperada. Para fallos de segmento
329 y abortos en la ejecución puede que obtenga el mensaje "Program received
330 signal SIGsomething" (el programa recibió la señal SIGalgo).
331 </p>
332
333 <p>
334 Cuando un programa recibe una señal, puede ser por varias razones. En el
335 caso de SIGSEGV y SIGABRT (fallo de segmento y aborto en la ejecución
336 respectivamente), normalmente significa que el código está haciendo algo
337 incorrecto como una llamada al sistema inválida o acceder a memoria a través
338 de un puntero roto. Otras señales comunes son: SIGTERM, SIGQUIT y SIGINT (la
339 última se recibe cuando se envía CTRL-C al programa y normalmente es
340 capturada por <c>gdb</c> e ignorada por el programa).
341 </p>
342
343 <p>
344 Finalmente hay una serie de "Eventos de tiempo real". Se nombran como
345 SIG<e>nn</e> siendo <e>nn</e> un número mayor que 31. La implementación
346 pthread normalmente usa estos eventos para sincronizar los diferentes hilos
347 del programa, y así no se presentan condiciones de error de ningún tipo. Es
348 fácil ofrecer trazas sin sentido cuando se confunden las señales de tiempo
349 real con las condiciones de error. Para evitar esto, puede indicar a
350 <c>gdb</c> que no pare cuando éstas se reciben, y en lugar de ésto, pasarlas
351 directamente al programa como en el ejemplo siguiente.
352 </p>
353
354 <pre caption="Corriendo xine-ui a través de gdb, ignorando las señales de tiempo real.">
355 $ <i>gdb /usr/bin/xine</i>
356 GNU gdb 6.4
357 [...]
358
359 (gdb) <i>run</i>
360 Starting program: /usr/bin/xine
361 [...]
362
363 Program received signal SIG33, Real-time event 33.
364 [Switching to Thread 1182845264 (LWP 11543)]
365 0x00002b661d87d536 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib/libpthread.so.0
366 (gdb) <i>handle SIG33 nostop noprint noignore pass</i>
367 Signal Stop Print Pass to program Description
368 SIG33 No No Yes Real-time event 33
369 (gdb) <i>kill</i>
370 Kill the program being debugged? (y or n) <i>y</i>
371 (gdb) <i>run</i>
372 </pre>
373
374 <p>
375 El comando <c>handle</c> indica a <c>gdb</c> qué debe hacer cuando la señal
376 dada es enviada al programa; en este caso los ajustes son <c>nostop</c> (no
377 parar el programa, devolviendo el comando al depurador), <c>noprint</c> (no
378 molestarse en imprimir la recepción de la señal recibida), <c>noignore</c>
379 (no ignorar la señal &#8212; ignorar señales es peligroso, ya que implica
380 descartarlas sin pasarlas al programa), <c>pass</c> (pasar las señal al
381 programa en depuración).
382 </p>
383
384 <p>
385 Después de que los eventuales eventos en tiempo real son ignorados por
386 <c>gdb</c>, deberá intentar reproducir el error que desea reportar. si lo
387 puede reproducir de forma sistemática, entonces es muy fácil. Cuando
388 <c>gdb</c> indica que el programa ha recibido las señales SIGSEGV o SIGABRT
389 (o cualquier otra señal que pueda representar una condición de error en el
390 programa), tendrá que generar la traza, posiblemente guardándola en algún
391 lugar. El comando básico para hacerlo es <c>bt</c>, que es la abreviatura de
392 <c>backtrace</c>, este comando muestra la traza del hilo de ejecución actual
393 (si el programa tiene un solo hilo, entonces hay un solo hilo de ejecución).
394 </p>
395
396 <p>
397 Un comando alternativo para obtener una traza más detallada es <c>bt
398 full</c>. Este comando ofrece información sobre parámetros y variables
399 locales de la función en la que las llamadas son realizadas (siempre que
400 estén disponibles y no hayan sido eliminadas por el uso de
401 optimizaciones). Esto hace que la traza sea más larga, pero más útil a la
402 hora de encontrar, por ejemplo, porqué un puntero no se ha inicializado.
403 </p>
404
405 <p>
406 Finalmente, no es extraño que incluso los programas más simples sean
407 escritos con múltiples hilos de ejecución. En estos casos usar la salida de
408 un simple <c>bt</c>, aunque tiene sentido, no tiene ninguna utilidad, ya que
409 puede representar el estado de un hilo de ejecución diferente al hilo en el
410 que se ha generado la señal o en el que la condición de error se ha
411 manifestado (en caso que haya otro hilo responsable de generar señales). Por
412 esta razón, debe en su lugar obtener la traza con el comando <c>thread apply
413 all bt full</c> (más largo), que indica a la depuración que imprima la traza
414 completa de todos los hilos que se estén ejecutando en ese momento.
415 </p>
416
417 <p>
418 Si la traza es corta, es fácil copiar y pegarla fuera del terminal (a menos
419 que el fallo suceda en un terminal sin X). En la mayoría de los casos es tan
420 larga que no puede ser copiada fácilmente ya que se extiende a través de
421 varias páginas. Para poder obtener trazas en un fichero con la intención de
422 adjuntarlo a un informe de error, se debe usar la característica
423 <c>logging</c>:
424 </p>
425
426 <pre caption="Usando la característica logging para guardar la traza a un fichero.">
427 $ <i>gdb /usr/bin/xine</i>
428 GNU gdb 6.5
429 [...]
430
431 (gdb) <i>run</i>
432 [...]
433
434 (gdb) <i>set logging file backtrace.log</i>
435 (gdb) <i>set logging on</i>
436 Copying output to backtrace.log.
437 (gdb) <i>bt</i>
438 #0 0x0000003000eb7472 in __select_nocancel () from /lib/libc.so.6
439 ...
440 (gdb) <i>set logging off</i>
441 Done logging to backtrace.log.
442 (gdb) <i>quit</i>
443 </pre>
444
445 <p>
446 Ahora puede obtener la traza en el fichero <path>backtrace.log</path> y
447 simplemente enviarla por correo electrónico o adjuntar el fichero al informe
448 de error relacionado.
449 </p>
450
451 </body>
452 </section>
453
454 <section><!-- Core dumps -->
455
456 <title>Volcados Core</title>
457
458 <body>
459
460 <p>
461 En algunas ocasiones, los errores de ejecución son difíciles de reproducir,
462 el programa tienes muchos hilos y es muy lento ejecutarlo en <c>gdb</c> o
463 está embrollado cuando se realiza la ejecución con el depurador (no debería
464 sorprender a nadie que al realizar las ejecuciones dentro del depurador se
465 muestran más errores que al tratar de reproducirlos sin el depurador). En
466 estos casos hay una herramienta que se muestra muy útil: el volcado core.
467 </p>
468
469 <p>
470 Un volcado core es un fichero que contiene todo el área de memoria de un
471 programa cuando éste ha fallado. Usando este fichero es posible extraer la
472 traza de la pila, incluso si el programa ha fallado fuera de <c>gdb</c>,
473 asumiendo que los volcados core están activados. Por defecto, los volcados
474 core no están activados en Gentoo Linux (sin embargo, son activados por
475 defecto en <uri link="http://www.gentoo.org/proj/en/gentoo-alt/bsd/fbsd/">
476 Gentoo/FreeBSD</uri>), por lo que tendrá que activarlos.
477 </p>
478
479 <p>
480 Los ficheros de volcado core son generados directamente por el núcleo; por
481 esta razón, el núcleo necesita tener esta característica activada en el
482 momento de su construcción para que funcione correctamente. Normalmente las
483 configuraciones por defecto del núcleo activan los ficheros de volcado
484 core. Si está corriendo un núcleo incrustado, o ha configurado la sección
485 standard kernel features (características estándar del núcleo), debería
486 verificar las siguientes opciones:
487 </p>
488
489 <note>
490 Puede saltarse este paso si no ha activado la opción “Configure standard
491 kernel features en ningún momento, lo cual no debería hacerlo si no sabe si
492 lo hizo o no.
493 </note>
494
495 <pre caption="Opciones del núcleo para activar los volcados core">
496 General Setup ---&gt;
497 Configure standard kernel features ---&gt;
498 Enable ELF core dumps
499 </pre>
500
501 <p>
502 Los volcados core pueden ser activados al nivel de sistema o al nivel de
503 sesión del intérprete de comandos. En el primer caso, todo en el sistema que
504 produzca un error de ejecución y no tenga un manejador de ese error (mire
505 más abajo algunas notas sobre el manejador de errores de KDE) será
506 volcado. Cuando se activa al nivel de sesión, únicamente los programas que
507 sean ejecutados en esa sesión generarán un volcado.
508 </p>
509
510 <p>
511 Para activar los volcados core al nivel de sistema, tendrá que editar, bien
512 <path>/etc/security/limits.conf</path> (si está usando PAM, situación por
513 defecto), bien <path>/etc/limits.conf</path>. En el primer caso, debe
514 definir un límite (hardware o más comúnmente software; para ficheros core,
515 el cual puede ser cualquiera entre 0 y ningún límite). En el último caso,
516 simplemente necesita definir la variable C al tamaño límite de un fichero
517 core (aquí no existe "ilimitado").
518 </p>
519
520 <pre caption="Ejemplo de regla para obtener ficheros core ilimitados cuando se usa PAM">
521 # /etc/security/limits.conf
522 * soft core unlimited
523 </pre>
524
525 <pre caption="Ejemplo de regla para obtener ficheros core de hasta 20 MB cuando no se usa PAM">
526 # /etc/limits.conf
527 * C20480
528 </pre>
529
530 <p>
531 Para activar fichero core en una sesión simple del intérprete de comandos
532 puede usar el comando <c>ulimit</c> con la opción <c>-c</c>. 0 indica
533 desactivado; cualquier otro número positivo es el tamaño en KB del fichero
534 core generado, mientras que <e>unlimited</e> simplemente elimina el límite
535 en las dimensiones de los ficheros core. A partir de ese momento, todos los
536 programas que terminen como resultado de una señal como SIGABRT or SIGSEGV
537 dejarán un fichero core que puede llamarse "core" o "core.<e>pid</e>" (donde
538 pid es reemplazado por el identificador de proceso del programa que murió).
539 </p>
540
541 <pre caption="Ejemplo de uso de ulimit">
542 $ <i>ulimit -c unlimited</i>
543 $ <i>crashing-program</i>
544 [...]
545 Abort (Core Dumped)
546 $
547 </pre>
548
549 <note>
550 El comando <c>ulimit</c> es un comando interno en bash y zsh. En otros
551 intérpretes de comandos puede tener otro nombre o incluso no estar
552 disponible.
553 </note>
554
555 <p>
556 Después de obtener un volcado core, puede ejecutar <c>gdb</c> sobre él,
557 especificando tanto el fichero que generó el volcado core (tiene que ser
558 exactamente el mismo binario, por lo que si recompila, el volcado core es
559 inútil) y el camino al fichero core. Una vez que haya abierto <c>gdb</c>
560 sobre él, puede seguir las mismas instrucciones detalladas arriba tal y como
561 si se hubiera recibido la señal que mata el proceso en ese preciso instante.
562 </p>
563
564 <pre caption="Arrancado gdb con un fichero core">
565 $ <i>gdb $(el programa que murió) --core core</i>
566 </pre>
567
568 <p>
569 Como alternativa, puede usar la capacidades de línea de comandos de
570 <c>gdb</c> para obtener la traza sin entrar en modo interactivo. Esto
571 también hace más fácil guardar la traza en un fichero o enviarla a una
572 tubería (pipe) de cualquier tipo. El truco están en las opciones
573 <c>--batch</c> y <c>-ex</c> que son aceptadas por <c>gdb</c>. Puede usar la
574 siguiente función bash para obtener la traza completa de un volcado core
575 (incluyendo todos los hilos de ejecución) en la salida estándar.
576 </p>
577
578 <pre caption="Función para obtener la traza completa de un volcado core">
579 gdb_get_backtrace() {
580 local exe=$1
581 local core=$2
582
583 gdb ${exe} \
584 --core ${core} \
585 --batch \
586 --quiet \
587 -ex "thread apply all bt full" \
588 -ex "quit"
589 }
590 </pre>
591
592 </body>
593
594 </section>
595
596 <section><!-- KDE crash handler's notes -->
597
598 <title>Notas acerca del manejador de errores de ejecución de KDE</title>
599
600 <body>
601
602 <p>
603 La aplicaciones basadas en KDE se ejecutan por defecto con su propio
604 manejador de errores de ejecución, el cual es presentado al usuario como
605 "Dr. Konqi" si está instalado (el paquete es <path>kde-base/kdebase</path> o
606 <path>kde-base/drkonqi</path> (incluido en <path>kdebase-meta</path>). Este
607 manejador de errores de ejecución muestra al usuario un diálogo informativo
608 de que el programa ha fallado. En este diálogo hay una pestaña "Backtrace"
609 (traza) que cuando es cargada llama a <c>gdb</c> y hace que éste cargue los
610 datos y genere la traza completa en representación del usuario, mostrándola
611 en la caja de texto principal y permitiendo que ésta sea salvada
612 directamente a un fichero. Esa traza, normalmente, es suficientemente buena
613 para informar de un problema.
614 </p>
615
616 <p>
617 Cuando drkonqi no está instalado, los errores de ejecución no generarán un
618 volcado core, y el usuario no recibirá ninguna información por defecto. Para
619 evitar esto, es posible usar el argumento <c>--nocrashhandler</c> en todas
620 las aplicaciones basadas en KDE. Esto desactivará el gestor de errores de
621 ejecución completamente y dejará que las señales sean gestionadas por el
622 sistema operativo como es normal. Esto es útil para generar ficheros core
623 cuando drkonqi no está disponible o cuando se desea inspeccionar las trazas
624 de la pila a mano.
625 </p>
626
627 </body>
628
629 </section>
630
631 <!-- TODO
632 - add notes about GNOME's crash handler
633 - add notes about renaming core dump files
634 -->
635
636
637 </chapter>
638
639 </guide>
640
641 <!-- kate: space-indent on; indent-width 2; replace-tabs on; indent-mode normal; -->