## Debugging xmlroff

Abstract

Debugging xmlroff

### Command Line

#### -d2 command line switch dumps FO tree

Each node shows its type [FoTree], its address [0x82a0698], and its reference count [1].

Values of the node's properties (GObject properties, which mostly correspond to XSL properties) are shown indented underneath the node information.

Properties of the node's parent type (and that type's parent type, etc.) are shown indented relative to the properties of the node's type.

    [xmlroff]$ ./xmlroff -d2 xmlroff.fo
    (process:16930): libfo-DEBUG: FoTree (0x82a0698 : 1)
    (process:16930): libfo-DEBUG:     default-master:   0x82c7530
    (process:16930): libfo-DEBUG:     master-name hash:
    (process:16930): libfo-DEBUG:       first : 0x82c7530
    (process:16930): libfo-DEBUG:     page-sequence-master-name hash:
    (process:16930): libfo-DEBUG:         generate-reference-area: FALSE
    (process:16930): libfo-DEBUG:         allow-mixed-content: FALSE
    (process:16930): libfo-DEBUG:         element: (nil)
    (process:16930): libfo-DEBUG:         context: 0x82a6d48
    (process:16930): libfo-DEBUG:         areas:
    (process:16930): libfo-DEBUG:           0x82c6a40
    (process:16930): libfo-DEBUG:   root (0x82c6c00 : 1)
    (process:16930): libfo-DEBUG:       media-usage (0x82bd838 : 72)
    (process:16930): libfo-DEBUG:           FoEnum (0x82be270 : 2) : auto
    (process:16930): libfo-DEBUG:         generate-reference-area: FALSE
    (process:16930): libfo-DEBUG:         allow-mixed-content: FALSE
    (process:16930): libfo-DEBUG:         element: 0x82a8e68
    (process:16930): libfo-DEBUG:         context: 0x82dfd48
    (process:16930): libfo-DEBUG:         areas:
    (process:16930): libfo-DEBUG:           (none)
    ...

#### -d4 command line switch dumps area tree

    [xmlroff]$ ./xmlroff -d4 xmlroff.fo
    (process:16932): libfo-DEBUG: FoAreaTree (0x82c6a40 : 1)
    (process:16932): libfo-DEBUG:     context: 0x82c6a90
    (process:16932): libfo-DEBUG:       is-first:              true
    (process:16932): libfo-DEBUG:       prev-part:             (null)
    (process:16932): libfo-DEBUG:       is-last:               true
    (process:16932): libfo-DEBUG:       next-part:             (null)
    (process:16932): libfo-DEBUG:       next-x:                0 pt
    (process:16932): libfo-DEBUG:       next-y:                0 pt
    (process:16932): libfo-DEBUG:       available-width:       0 pt
    (process:16932): libfo-DEBUG:       available-height:      0 pt
    (process:16932): libfo-DEBUG:       child-available-ipdim: 0 pt
    (process:16932): libfo-DEBUG:       child-available-bpdim: 0 pt
    (process:16932): libfo-DEBUG:       generated-by:          (null)
    (process:16932): libfo-DEBUG:       reference:             (null)
    (process:16932): libfo-DEBUG:       page:                  (null)
    (process:16932): libfo-DEBUG:   FoAreaPage (0x82e4300 : 2)
    (process:16932): libfo-DEBUG:       page-number:   1
    (process:16932): libfo-DEBUG:       page-width:    576 pt
    (process:16932): libfo-DEBUG:       page-height:   792 pt
    (process:16932): libfo-DEBUG:       margin-top:    72 pt
    (process:16932): libfo-DEBUG:       margin-bottom: 72 pt
    (process:16932): libfo-DEBUG:       margin-left:   72 pt
    (process:16932): libfo-DEBUG:       margin-right:  72 pt
    (process:16932): libfo-DEBUG:           bpd: 3
    (process:16932): libfo-DEBUG:           ipd: 1
    (process:16932): libfo-DEBUG:           sd:  4
    (process:16932): libfo-DEBUG:             x:              0 pt
    (process:16932): libfo-DEBUG:             y:              0 pt
    (process:16932): libfo-DEBUG:             width:          0 pt
    (process:16932): libfo-DEBUG:             height:         0 pt
    ...

#### -d8 command line switch dumps PangoAttribute information

    [xmlroff]$ ./xmlroff -d8 xmlroff.fo
    (process:16933): libfo-DEBUG: get_text_attr_list:: block text: 'xmlroff ? Sun xmlroff XSL Formatter'
    (process:16933): libfo-DEBUG: get_text_attr_list:: attr_glist: 0x82aa650
    (process:16933): libfo-DEBUG: get_text_attr_list:: attr_glist length: 26
    (process:16933): libfo-DEBUG: dump_attr_list:: String:
    (process:16933): libfo-DEBUG: dump_attr_list:: start: 0; end: 7
    (process:16933): libfo-DEBUG: dump_attr_list:: start: 7; end: 37
    (process:16933): libfo-DEBUG: dump_attr_list:: start: 37; end: 2147483647
    (process:16933): libfo-DEBUG: dump_attr_list:: Font family:
    (process:16933): libfo-DEBUG: dump_attr_list:: start: 0; end: 7; family: mono
    (process:16933): libfo-DEBUG: dump_attr_list:: start: 7; end: 37; family: sans-serif
    (process:16933): libfo-DEBUG: dump_attr_list:: Font size:
    (process:16933): libfo-DEBUG: dump_attr_list:: start: 0; end: 7; size: 10
    (process:16933): libfo-DEBUG: dump_attr_list:: start: 7; end: 37; size: 10
    ...

#### Aborting on critical log message

xmlroff often gives "CRITICAL" error messages when something goes wrong. For example:

`(xmlroff:4384): libfo-CRITICAL **:
fo_area_area_split_before_height_check: assertion `max_height > 0'
failed`

If you want to abort on the critical error so you can use a debugger on the core file, according to http://library.gnome.org/devel/glib/stable/glib-running.html, if you set G_DEBUG=fatal-critical, xmlroff should abort.

### Using GDB or other debugger

#### Statically link xmlroff

GDB, at least, has more to work with when you build a statically linked xmlroff executable.

Add --enable-static --disable-shared to the configure.in (or autogen.sh if building from CVS) command line.

#### Break on g_log

If you are getting an error message and you can't work out what's causing it, break on g_log so you break just before the message is emitted.

After the break, you can go up several stack frames to where g_error (or similar) is called.

By going up enough stack frames, you can usually work out what property or what FO experienced the error.

Note that you should disable the breakpoint on g_log if you are going to interactively call any functions that use g_log.

#### Functions useful when debugging interatively

fo_object_sprintf(object) | The 'nice' printout of the object.
fo_object_debug_sprintf(object) | The 'nice' printout of the object plus its adress and reference count.
fo_object_debug_dump(object,indent) | Dump everything about the object and its descendants (if it's part of a tree, that is).
fo_node_path_to_root_sprintf(node) | Print XPath-like locator for node.
fo_node_debug_dump_tree(node) | Dumps just the FoNode objects, not their properties, in the tree rooted at node.