andybons | 22afb31 | 2015-08-31 02:24:51 | [diff] [blame] | 1 | # Graphical Debugging Aid for Chromium Views |
andybons | 3322f76 | 2015-08-24 21:37:09 | [diff] [blame] | 2 | |
andybons | 22afb31 | 2015-08-31 02:24:51 | [diff] [blame] | 3 | ## Introduction |
andybons | 3322f76 | 2015-08-24 21:37:09 | [diff] [blame] | 4 | |
andybons | 22afb31 | 2015-08-31 02:24:51 | [diff] [blame] | 5 | A simple debugging tool exists to help visualize the views tree during |
| 6 | debugging. It consists of 4 components: |
andybons | 3322f76 | 2015-08-24 21:37:09 | [diff] [blame] | 7 | |
andybons | 22afb31 | 2015-08-31 02:24:51 | [diff] [blame] | 8 | 1. The function `View::PrintViewGraph()` (already in the file `view.cc` if |
| 9 | you've sync'd recently), |
| 10 | 1. a gdb script file `viewg.gdb` (see below), |
| 11 | 1. the graphViz package (http://www.graphviz.org/ - downloadable for Linux, |
| 12 | Windows and Mac), and |
| 13 | 1. an SVG viewer (_e.g._ Chrome). |
| 14 | |
| 15 | ## Details |
andybons | 3322f76 | 2015-08-24 21:37:09 | [diff] [blame] | 16 | |
| 17 | To use the tool, |
| 18 | |
andybons | 22afb31 | 2015-08-31 02:24:51 | [diff] [blame] | 19 | 1. Make sure you have 'dot' installed (part of graphViz), |
| 20 | 1. define `TOUCH_DEBUG` and compile chrome with Views enabled, |
| 21 | 1. run gdb on your build and |
| 22 | 1. `source viewg.gdb` (this can be done automatically in `.gdbinit`), |
| 23 | 1. stop at any breakpoint inside class `View` (or any derived class), and |
| 24 | 1. type `viewg` at the gdb prompt. |
andybons | 3322f76 | 2015-08-24 21:37:09 | [diff] [blame] | 25 | |
andybons | 22afb31 | 2015-08-31 02:24:51 | [diff] [blame] | 26 | This will cause the current view, and any descendants, to be described in a |
| 27 | graph which is stored as `~/state.svg` (Windows users may need to modify the |
| 28 | script slightly to run under CygWin). If `state.svg` is kept open in a browser |
| 29 | window and refreshed each time `viewg` is run, then it provides a graphical |
| 30 | representation of the state of the views hierarchy that is always up to date. |
andybons | 3322f76 | 2015-08-24 21:37:09 | [diff] [blame] | 31 | |
andybons | 22afb31 | 2015-08-31 02:24:51 | [diff] [blame] | 32 | It is easy to modify the gdb script to generate PDF in case viewing with evince |
| 33 | (or other PDF viewer) is preferred. |
andybons | 3322f76 | 2015-08-24 21:37:09 | [diff] [blame] | 34 | |
andybons | 22afb31 | 2015-08-31 02:24:51 | [diff] [blame] | 35 | If you don't use gdb, you may be able to adapt the script to work with your |
| 36 | favorite debugger. The gdb script invokes |
andybons | 3322f76 | 2015-08-24 21:37:09 | [diff] [blame] | 37 | |
andybons | 22afb31 | 2015-08-31 02:24:51 | [diff] [blame] | 38 | this->PrintViewGraph(true) |
| 39 | |
| 40 | on the current object, returning `std::string`, whose contents must then be |
| 41 | saved to a file in order to be processed by dot. |
| 42 | |
| 43 | ## viewg.gdb |
andybons | 3322f76 | 2015-08-24 21:37:09 | [diff] [blame] | 44 | |
| 45 | ``` |
| 46 | define viewg |
| 47 | if $argc != 0 |
| 48 | echo Usage: viewg |
| 49 | else |
| 50 | set pagination off |
| 51 | set print elements 0 |
| 52 | set logging off |
| 53 | set logging file ~/state.dot |
| 54 | set logging overwrite on |
| 55 | set logging redirect on |
| 56 | set logging on |
| 57 | printf "%s\n", this->PrintViewGraph(true).c_str() |
| 58 | set logging off |
| 59 | shell dot -Tsvg -o ~/state.svg ~/state.dot |
| 60 | set pagination on |
| 61 | end |
| 62 | end |
andybons | 22afb31 | 2015-08-31 02:24:51 | [diff] [blame] | 63 | ``` |