|
1 lldb debugging functionality for Gecko |
|
2 ====================================== |
|
3 |
|
4 This directory contains a module, lldbutils, which is imported by the |
|
5 in-tree .lldbinit file. The lldbutil modules define some lldb commands |
|
6 that are handy for debugging Gecko. |
|
7 |
|
8 If you want to add a new command or Python-implemented type summary, either add |
|
9 it to one of the existing broad area Python files (such as lldbutils/layout.py |
|
10 for layout-related commands) or create a new file if none of the existing files |
|
11 is appropriate. If you add a new file, make sure you add it to __all__ in |
|
12 lldbutils/__init__.py. |
|
13 |
|
14 |
|
15 Supported commands |
|
16 ------------------ |
|
17 |
|
18 Most commands below that can take a pointer to an object also support being |
|
19 called with a smart pointer like nsRefPtr or nsCOMPtr. |
|
20 |
|
21 |
|
22 * frametree EXPR, ft EXPR |
|
23 frametreelimited EXPR, ftl EXPR |
|
24 |
|
25 Shows information about a frame tree. EXPR is an expression that |
|
26 is evaluated, and must be an nsIFrame*. frametree displays the |
|
27 entire frame tree that contains the given frame. frametreelimited |
|
28 displays a subtree of the frame tree rooted at the given frame. |
|
29 |
|
30 (lldb) p this |
|
31 (nsBlockFrame *) $4 = 0x000000011687fcb8 |
|
32 (lldb) ftl this |
|
33 Block(div)(-1)@0x11687fcb8 {0,0,7380,690} [state=0002100000d04601] [content=0x11688c0c0] [sc=0x11687f990:-moz-scrolled-content]< |
|
34 line 0x116899130: count=1 state=inline,clean,prevmarginclean,not impacted,not wrapped,before:nobr,after:nobr[0x100] {60,0,0,690} vis-overflow=60,510,0,0 scr-overflow=60,510,0,0 < |
|
35 Text(0)""@0x1168990c0 {60,510,0,0} [state=0001000020404000] [content=0x11687ca10] [sc=0x11687fd88:-moz-non-element,parent=0x11687eb00] [run=0x115115e80][0,0,T] |
|
36 > |
|
37 > |
|
38 (lldb) ft this |
|
39 Viewport(-1)@0x116017430 [view=0x115efe190] {0,0,60,60} [state=000b063000002623] [sc=0x1160170f8:-moz-viewport]< |
|
40 HTMLScroll(html)(-1)@0x1160180d0 {0,0,0,0} [state=000b020000000403] [content=0x115e4d640] [sc=0x116017768:-moz-viewport-scroll]< |
|
41 ... |
|
42 Canvas(html)(-1)@0x116017e08 {0,0,60,60} vis-overflow=0,0,8340,2196 scr-overflow=0,0,8220,2196 [state=000b002000000601] [content=0x115e4d640] [sc=0x11687e0f8:-moz-scrolled-canvas]< |
|
43 Block(html)(-1)@0x11687e578 {0,0,60,2196} vis-overflow=0,0,8340,2196 scr-overflow=0,0,8220,2196 [state=000b100000d00601] [content=0x115e4d640] [sc=0x11687e4b8,parent=0x0]< |
|
44 line 0x11687ec48: count=1 state=block,clean,prevmarginclean,not impacted,not wrapped,before:nobr,after:nobr[0x48] bm=480 {480,480,0,1236} vis-overflow=360,426,7980,1410 scr-overflow=480,480,7740,1236 < |
|
45 Block(body)(1)@0x11687ebb0 {480,480,0,1236} vis-overflow=-120,-54,7980,1410 scr-overflow=0,0,7740,1236 [state=000b120000100601] [content=0x115ed8980] [sc=0x11687e990]< |
|
46 line 0x116899170: count=1 state=inline,clean,prevmarginclean,not impacted,not wrapped,before:nobr,after:nobr[0x0] {0,0,7740,1236} vis-overflow=-120,-54,7980,1410 scr-overflow=0,0,7740,1236 < |
|
47 nsTextControlFrame@0x11687f068 {0,66,7740,1170} vis-overflow=-120,-120,7980,1410 scr-overflow=0,0,7740,1170 [state=0002000000004621] [content=0x115ca2c50] [sc=0x11687ea40]< |
|
48 HTMLScroll(div)(-1)@0x11687f6b0 {180,240,7380,690} [state=0002000000084409] [content=0x11688c0c0] [sc=0x11687eb00]< |
|
49 Block(div)(-1)@0x11687fcb8 {0,0,7380,690} [state=0002100000d04601] [content=0x11688c0c0] [sc=0x11687f990:-moz-scrolled-content]< |
|
50 line 0x116899130: count=1 state=inline,clean,prevmarginclean,not impacted,not wrapped,before:nobr,after:nobr[0x100] {60,0,0,690} vis-overflow=60,510,0,0 scr-overflow=60,510,0,0 < |
|
51 Text(0)""@0x1168990c0 {60,510,0,0} [state=0001000020404000] [content=0x11687ca10] [sc=0x11687fd88:-moz-non-element,parent=0x11687eb00] [run=0x115115e80][0,0,T] |
|
52 ... |
|
53 |
|
54 |
|
55 * js |
|
56 |
|
57 Dumps the current JS stack. |
|
58 |
|
59 (lldb) js |
|
60 0 anonymous(aForce = false) ["chrome://browser/content/browser.js":13414] |
|
61 this = [object Object] |
|
62 1 updateAppearance() ["chrome://browser/content/browser.js":13326] |
|
63 this = [object Object] |
|
64 2 handleEvent(aEvent = [object Event]) ["chrome://browser/content/tabbrowser.xml":3811] |
|
65 this = [object XULElement] |
|
66 |
|
67 |
|
68 * prefcnt EXPR |
|
69 |
|
70 Shows the refcount of a given object. EXPR is an expression that is |
|
71 evaluated, and can be either a pointer to or an actual refcounted |
|
72 object. The object can be a standard nsISupports-like refcounted |
|
73 object, a cycle-collected object or a mozilla::RefCounted<T> object. |
|
74 |
|
75 (lldb) p this |
|
76 (nsHTMLDocument *) $1 = 0x0000000116e9d800 |
|
77 (lldb) prefcnt this |
|
78 20 |
|
79 (lldb) p mDocumentURI |
|
80 (nsCOMPtr<nsIURI>) $3 = { |
|
81 mRawPtr = 0x0000000117163e50 |
|
82 } |
|
83 (lldb) prefcnt mDocumentURI |
|
84 11 |
|
85 |
|
86 |
|
87 * pstate EXPR |
|
88 |
|
89 Shows the frame state bits (using their symbolic names) of a given frame. |
|
90 EXPR is an expression that is evaluated, and must be an nsIFrame*. |
|
91 |
|
92 (lldb) p this |
|
93 (nsTextFrame *) $1 = 0x000000011f470b10 |
|
94 (lldb) p/x mState |
|
95 (nsFrameState) $2 = 0x0000004080604000 |
|
96 (lldb) pstate this |
|
97 TEXT_HAS_NONCOLLAPSED_CHARACTERS | TEXT_END_OF_LINE | TEXT_START_OF_LINE | NS_FRAME_PAINTED_THEBES | NS_FRAME_INDEPENDENT_SELECTION |
|
98 |
|
99 |
|
100 * ptag EXPR |
|
101 |
|
102 Shows the DOM tag name of a node. EXPR is an expression that is |
|
103 evaluated, and can be either an nsINode pointer or a concrete DOM |
|
104 object. |
|
105 |
|
106 (lldb) p this |
|
107 (nsHTMLDocument *) $0 = 0x0000000116e9d800 |
|
108 (lldb) ptag this |
|
109 (PermanentAtomImpl *) $1 = 0x0000000110133ac0 u"#document" |
|
110 (lldb) p this->GetRootElement() |
|
111 (mozilla::dom::HTMLSharedElement *) $2 = 0x0000000118429780 |
|
112 (lldb) ptag $2 |
|
113 (PermanentAtomImpl *) $3 = 0x0000000110123b80 u"html" |
|
114 |
|
115 |
|
116 Supported type summaries and synthetic children |
|
117 ----------------------------------------------- |
|
118 |
|
119 In lldb terminology, type summaries are rules for how to display a value |
|
120 when using the "expression" command (or its familiar-to-gdb-users "p" alias), |
|
121 and synthetic children are fake member variables or array elements also |
|
122 added by custom rules. |
|
123 |
|
124 For objects that do have synthetic children defined for them, like nsTArray, |
|
125 the "expr -R -- EXPR" command can be used to show its actual member variables. |
|
126 |
|
127 |
|
128 * nsAString, nsACString, |
|
129 nsFixedString, nsFixedCString, |
|
130 nsAutoString, nsAutoCString |
|
131 |
|
132 Strings have a type summary that shows the actual string. |
|
133 |
|
134 (lldb) frame info |
|
135 frame #0: 0x000000010400cfea XUL`nsCSSParser::ParseProperty(this=0x00007fff5fbf5248, aPropID=eCSSProperty_margin_top, aPropValue=0x00007fff5fbf53f8, aSheetURI=0x0000000115ae8c00, aBaseURI=0x0000000115ae8c00, aSheetPrincipal=0x000000010ff9e040, aDeclaration=0x00000001826fd580, aChanged=0x00007fff5fbf5247, aIsImportant=false, aIsSVGMode=false) + 74 at nsCSSParser.cpp:12851 |
|
136 (lldb) p aPropValue |
|
137 (const nsAString_internal) $16 = u"-25px" |
|
138 |
|
139 (lldb) p this |
|
140 (nsHTMLDocument *) $18 = 0x0000000115b56000 |
|
141 (lldb) p mContentType |
|
142 (nsCString) $19 = { |
|
143 nsACString_internal = "text/html" |
|
144 } |
|
145 |
|
146 * nscolor |
|
147 |
|
148 nscolors (32-bit RGBA colors) have a type summary that shows the color as |
|
149 one of the CSS 2.1 color keywords, a six digit hex color, an rgba() color, |
|
150 or the "transparent" keyword. |
|
151 |
|
152 (lldb) p this |
|
153 (nsTextFrame *) $0 = 0x00000001168245e0 |
|
154 (lldb) p *this->StyleColor() |
|
155 (const nsStyleColor) $1 = { |
|
156 mColor = lime |
|
157 } |
|
158 (lldb) expr -R -- *this->StyleColor() |
|
159 (const nsStyleColor) $2 = { |
|
160 mColor = 4278255360 |
|
161 } |
|
162 |
|
163 * nsIAtom |
|
164 |
|
165 Atoms have a type summary that shows the string value inside the atom. |
|
166 |
|
167 (lldb) frame info |
|
168 frame #0: 0x00000001028b8c49 XUL`mozilla::dom::Element::GetBoolAttr(this=0x0000000115ca1c50, aAttr=0x000000011012a640) const + 25 at Element.h:907 |
|
169 (lldb) p aAttr |
|
170 (PermanentAtomImpl *) $1 = 0x000000011012a640 u"readonly" |
|
171 |
|
172 * nsTArray and friends |
|
173 |
|
174 nsTArrays and their auto and fallible varieties have synthetic children |
|
175 for their elements. This means when displaying them with "expr" (or "p"), |
|
176 they will be shown like regular arrays, rather than showing the mHdr and |
|
177 other fields. |
|
178 |
|
179 (lldb) frame info |
|
180 frame #0: 0x00000001043eb8a8 XUL`SVGTextFrame::DoGlyphPositioning(this=0x000000012f3f8778) + 248 at SVGTextFrame.cpp:4940 |
|
181 (lldb) p charPositions |
|
182 (nsTArray<nsPoint>) $5 = { |
|
183 [0] = { |
|
184 mozilla::gfx::BasePoint<int, nsPoint> = { |
|
185 x = 0 |
|
186 y = 816 |
|
187 } |
|
188 } |
|
189 [1] = { |
|
190 mozilla::gfx::BasePoint<int, nsPoint> = { |
|
191 x = 426 |
|
192 y = 816 |
|
193 } |
|
194 } |
|
195 [2] = { |
|
196 mozilla::gfx::BasePoint<int, nsPoint> = { |
|
197 x = 906 |
|
198 y = 816 |
|
199 } |
|
200 } |
|
201 } |
|
202 (lldb) expr -R -- charPositions |
|
203 (nsTArray<nsPoint>) $4 = { |
|
204 nsTArray_Impl<nsPoint, nsTArrayInfallibleAllocator> = { |
|
205 nsTArray_base<nsTArrayInfallibleAllocator, nsTArray_CopyWithMemutils> = { |
|
206 mHdr = 0x000000012f3f1b80 |
|
207 } |
|
208 } |
|
209 } |
|
210 |
|
211 * nsTextNode, nsTextFragment |
|
212 |
|
213 Text nodes have a type summary that shows the nsTextFragment in the |
|
214 nsTextNode, which itself has a type summary that shows the text |
|
215 content. |
|
216 |
|
217 (lldb) p this |
|
218 (nsTextFrame *) $14 = 0x000000011811bb10 |
|
219 (lldb) p mContent |
|
220 (nsTextNode *) $15 = 0x0000000118130110 "Search or enter address" |
|
221 |