Mercurial > emacs
comparison etc/DEBUG @ 69558:aed02e3a8c0f
Elaborate on debugging GC crashes.
author | Eli Zaretskii <eliz@gnu.org> |
---|---|
date | Sat, 18 Mar 2006 14:30:37 +0000 |
parents | 4a8aa0c1f128 |
children | 241a58942caf e3bacb89536a |
comparison
equal
deleted
inserted
replaced
69557:8dbad9547843 | 69558:aed02e3a8c0f |
---|---|
504 ** Debugging problems which happen in GC | 504 ** Debugging problems which happen in GC |
505 | 505 |
506 The array `last_marked' (defined on alloc.c) can be used to display up | 506 The array `last_marked' (defined on alloc.c) can be used to display up |
507 to 500 last objects marked by the garbage collection process. | 507 to 500 last objects marked by the garbage collection process. |
508 Whenever the garbage collector marks a Lisp object, it records the | 508 Whenever the garbage collector marks a Lisp object, it records the |
509 pointer to that object in the `last_marked' array. The variable | 509 pointer to that object in the `last_marked' array, which is maintained |
510 `last_marked_index' holds the index into the `last_marked' array one | 510 as a circular buffer. The variable `last_marked_index' holds the |
511 place beyond where the pointer to the very last marked object is | 511 index into the `last_marked' array one place beyond where the pointer |
512 stored. | 512 to the very last marked object is stored. |
513 | 513 |
514 The single most important goal in debugging GC problems is to find the | 514 The single most important goal in debugging GC problems is to find the |
515 Lisp data structure that got corrupted. This is not easy since GC | 515 Lisp data structure that got corrupted. This is not easy since GC |
516 changes the tag bits and relocates strings which make it hard to look | 516 changes the tag bits and relocates strings which make it hard to look |
517 at Lisp objects with commands such as `pr'. It is sometimes necessary | 517 at Lisp objects with commands such as `pr'. It is sometimes necessary |
518 to convert Lisp_Object variables into pointers to C struct's manually. | 518 to convert Lisp_Object variables into pointers to C struct's manually. |
519 | |
519 Use the `last_marked' array and the source to reconstruct the sequence | 520 Use the `last_marked' array and the source to reconstruct the sequence |
520 that objects were marked. | 521 that objects were marked. In general, you need to correlate the |
521 | 522 values recorded in the `last_marked' array with the corresponding |
522 Once you discover the corrupted Lisp object or data structure, it is | 523 stack frames in the backtrace, beginning with the innermost frame. |
523 useful to look at it in a fresh Emacs session and compare its contents | 524 Some subroutines of `mark_object' are invoked recursively, others loop |
524 with a session that you are debugging. | 525 over portions of the data structure and mark them as they go. By |
526 looking at the code of those routines and comparing the frames in the | |
527 backtrace with the values in `last_marked', you will be able to find | |
528 connections between the values in `last_marked'. E.g., when GC finds | |
529 a cons cell, it recursively marks its car and its cdr. Similar things | |
530 happen with properties of symbols, elements of vectors, etc. Use | |
531 these connections to reconstruct the data structure that was being | |
532 marked, paying special attention to the strings and names of symbols | |
533 that you encounter: these strings and symbol names can be used to grep | |
534 the sources to find out what high-level symbols and global variables | |
535 are involved in the crash. | |
536 | |
537 Once you discover the corrupted Lisp object or data structure, grep | |
538 the sources for its uses and try to figure out what could cause the | |
539 corruption. If looking at the sources doesn;t help, you could try | |
540 setting a watchpoint on the corrupted data, and see what code modifies | |
541 it in some invalid way. (Obviously, this technique is only useful for | |
542 data that is modified only very rarely.) | |
543 | |
544 It is also useful to look at the corrupted object or data structure in | |
545 a fresh Emacs session and compare its contents with a session that you | |
546 are debugging. | |
525 | 547 |
526 ** Debugging problems with non-ASCII characters | 548 ** Debugging problems with non-ASCII characters |
527 | 549 |
528 If you experience problems which seem to be related to non-ASCII | 550 If you experience problems which seem to be related to non-ASCII |
529 characters, such as \201 characters appearing in the buffer or in your | 551 characters, such as \201 characters appearing in the buffer or in your |