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