blob: a0d870723394e519a2d8a77039b956085aaf4c0a [file] [log] [blame]
Enrico Granataff782382011-07-08 02:51:01 +00001<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2<html xmlns="http://www.w3.org/1999/xhtml">
3 <head>
4 <meta http-equiv="Content-Type" content="text/html;
5 charset=ISO-8859-1">
6 <link href="style.css" rel="stylesheet" type="text/css">
7 <title>LLDB Homepage</title>
8 </head>
9 <body>
10 <div class="www_title"> The <strong>LLDB</strong> Debugger </div>
11 <div id="container">
12 <div id="content">
13 <!--#include virtual="sidebar.incl"-->
14 <div id="middle">
15 <div class="post">
16 <h1 class="postheader">Variable display</h1>
17 <div class="postcontent">
18
19 <p>LLDB was recently modified to allow users to define custom
20 formatting options for the variables display.</p>
21
22 <p>Usually, when you type <code>frame variable</code> or
23 run some <code>expression</code> LLDB will
24 automatically choose a format to display your results on
25 a per-type basis, as in the following example:</p>
26
27 <p> <code> <b>(lldb)</b> frame variable -T sp<br>
28 (SimpleWithPointers) sp = {<br>
29 &nbsp;&nbsp;&nbsp;&nbsp;(int *) x = 0x0000000100100120<br>
30 &nbsp;&nbsp;&nbsp;&nbsp;(float *) y =
31 0x0000000100100130<br>
32 &nbsp;&nbsp;&nbsp;&nbsp;(char *) z =
33 0x0000000100100140 "6"<br>
34 }<br>
35 </code> </p>
36
37 <p>However, in certain cases, you may want to associate a
38 different format to the display for certain datatypes.
39 To do so, you need to give hints to the debugger as to
40 how datatypes should be displayed.<br>
41 A new <b>type</b> command has been introduced in LLDB
42 which allows to do just that.<br>
43 </p>
44
45 <p>Using it you can obtain a format like this one for <code>sp</code>,
46 instead of the default shown above: </p>
47
48 <p> <code> <b>(lldb)</b> frame variable sp<br>
49 (SimpleWithPointers) sp =
50 (x=0x0000000100100120 -&gt; -1, y=0x0000000100100130
51 -&gt; -2, z="3")<br>
52 </code> </p>
53
54 <p>There are two kinds of printing options: <span
55 style="font-style: italic;">summary</span> and <span
56 style="font-style: italic;">format</span>. While a
57 detailed description of both will be given below, one
58 can briefly say that a summary is mainly used for
59 aggregate types, while a format is attached to primitive
60 types.</p>
61
62 <p>To reflect this, the the <b>type</b> command has two
63 subcommands:<br>
64 </p>
65
66 <p><code>type format</code></p>
67 <p><code>type summary</code></p>
68
69 <p>These commands are meant to bind printing options to
70 types. When variables are printed, LLDB will first check
71 if custom printing options have been associated to a
72 variable's type and, if so, use them instead of picking
73 the default choices.<br>
74 </p>
75
76 <p>The two commands <code>type format</code> and <code>type
77 summary</code> each have four subcommands:<br>
78 </p>
79 <p><code>add</code>: associates a new printing option to one
80 or more types</p>
81 <p><code>delete</code>: deletes an existing association</p>
82 <p><code>list</code>: provides a listing of all
83 associations</p>
84 <p><code>clear</code>: deletes all associations</p>
85 </div>
86 </div>
87
88 <div class="post">
89 <h1 class="postheader">type format</h1>
90 <div class="postcontent">
91
92 <p>Type formats enable you to quickly override the default
93 format for displaying primitive types (the usual basic
94 C/C++/ObjC types: int, float, char, ...).</p>
95
96 <p>If for some reason you want all <code>int</code>
97 variables in your program to print out as hex, you can add
98 a format to the <code>int</code> type.<br></p>
99
Enrico Granata86e7c3e2011-07-12 22:56:10 +0000100 <p>This is done by typing
101 <table class="stats" width="620" cellspacing="0">
102 <td class="content">
103 <b>(lldb)</b> type format add -f hex int
104 </td>
105 <table>
106 at the LLDB command line.</p>
Enrico Granataff782382011-07-08 02:51:01 +0000107
108 <p>The <code>-f</code> option accepts a <a
109 href="#formatstable">format name</a>, and a list of
110 types to which you want the new format applied.</p>
111
112 <p>A frequent scenario is that your program has a <code>typedef</code>
113 for a numeric type that you know represents something
114 that must be printed in a certain way. Again, you can
115 add a format just to that typedef by using <code>type
116 format add</code> with the name alias.</p>
117
118 <p>But things can quickly get hierarchical. Let's say you
119 have a situation like the following:</p>
120
121 <p><code>typedef int A;<br>
122 typedef A B;<br>
123 typedef B C;<br>
124 typedef C D;<br>
125 </code></p>
126
127 <p>and you want to show all <code>A</code>'s as hex, all
128 <code>C'</code>s as pointers and leave the defaults
129 untouched for other types.</p>
130
131 <p>If you simply type <br>
Enrico Granata86e7c3e2011-07-12 22:56:10 +0000132 <table class="stats" width="620" cellspacing="0">
133 <td class="content">
134 <b>(lldb)</b> type format add -f hex A<br>
135 <b>(lldb)</b> type format add -f pointer C
136 </td>
137 <table>
Enrico Granataff782382011-07-08 02:51:01 +0000138 <br>
139 values of type <code>B</code> will be shown as hex
140 and values of type <code>D</code> as pointers.</p>
141
142 <p>This is because by default LLDB <i>cascades</i>
143 formats through typedef chains. In order to avoid that
144 you can use the option <code>-C no</code> to prevent
145 cascading, thus making the two commands required to
146 achieve your goal:<br>
Enrico Granata86e7c3e2011-07-12 22:56:10 +0000147 <table class="stats" width="620" cellspacing="0">
148 <td class="content">
149 <b>(lldb)</b> type format add -C no -f hex A<br>
150 <b>(lldb)</b> type format add -C no -f pointer C
151 </td>
152 <table>
Enrico Granataff782382011-07-08 02:51:01 +0000153
154 <p>Two additional options that you will want to look at
155 are <code>-p</code> and <code>-r</code>. These two
156 options prevent LLDB from applying a format for type <code>T</code>
157 to values of type <code>T*</code> and <code>T&amp;</code>
158 respectively.</p>
159
160 <p> <code> <b>(lldb)</b> type format add -f float32[]
161 int<br>
162 <b>(lldb)</b> fr var pointer *pointer -T<br>
163 (int *) pointer = {1.46991e-39 1.4013e-45}<br>
164 (int) *pointer = {1.53302e-42}<br>
165 <b>(lldb)</b> type format add -f float32[] int -p<br>
166 <b>(lldb)</b> fr var pointer *pointer -T<br>
167 (int *) pointer = 0x0000000100100180<br>
168 (int) *pointer = {1.53302e-42}<br>
169 </code> </p>
170
171 <p>As the previous example highlights, you will most
172 probably want to use <code>-p</code> for your formats.</p>
173
174 <p>If you need to delete a custom format simply type <code>type
175 format delete</code> followed by the name of the type
176 to which the format applies. To delete ALL formats, use
177 <code>type format clear</code>. To see all the formats
178 defined, type <code>type format list</code>.<br>
179 </p>
180
181 <p>If all you need to do, however, is display one variable
182 in a custom format, while leaving the others of the same
183 type untouched, you can simply type:<br>
184 <br>
Enrico Granata86e7c3e2011-07-12 22:56:10 +0000185 <table class="stats" width="620" cellspacing="0">
186 <td class="content">
187 <b>(lldb)</b> frame variable counter -f hex
188 </td>
189 <table>
Enrico Granataff782382011-07-08 02:51:01 +0000190
191 <p>This has the effect of displaying the value of <code>counter</code>
192 as an hexadecimal number, and will keep showing it this
193 way until you either pick a different format or till you
194 let your program run again.</p>
195
196 <p>Finally, this is a list of formatting options available
197 out of
198 which you can pick:</p><a name="formatstable"></a>
199 <table border="1">
200 <tbody>
201 <tr valign="top">
202 <td width="23%"><b>Format name</b></td>
203 <td><b>Abbreviation</b></td>
204 <td><b>Description</b></td>
205 </tr>
206 <tr valign="top">
207 <td><b>default</b></td>
208 <td><br>
209 </td>
210 <td>the default LLDB algorithm is used to pick a
211 format</td>
212 </tr>
213 <tr valign="top">
214 <td><b>boolean</b></td>
215 <td>B</td>
216 <td>show this as a true/false boolean, using the
217 customary rule that 0 is false and everything else
218 is true</td>
219 </tr>
220 <tr valign="top">
221 <td><b>binary</b></td>
222 <td>b</td>
223 <td>show this as a sequence of bits</td>
224 </tr>
225 <tr valign="top">
226 <td><b>bytes</b></td>
227 <td>y</td>
228 <td>show the bytes one after the other<br>
229 e.g. <code>(int) s.x = 07 00 00 00</code></td>
230 </tr>
231 <tr valign="top">
232 <td><b>bytes with ASCII</b></td>
233 <td>Y</td>
234 <td>show the bytes, but try to print them as ASCII
235 characters<br>
236 e.g. <code>(int *) c.sp.x = 50 f8 bf 5f ff 7f 00
237 00 P.._....</code></td>
238 </tr>
239 <tr valign="top">
240 <td><b>character</b></td>
241 <td>c</td>
242 <td>show the bytes printed as ASCII characters<br>
243 e.g. <code>(int *) c.sp.x =
244 P\xf8\xbf_\xff\x7f\0\0</code></td>
245 </tr>
246 <tr valign="top">
247 <td><b>printable character</b></td>
248 <td>C</td>
249 <td>show the bytes printed as printable ASCII
250 characters<br>
251 e.g. <code>(int *) c.sp.x = P.._....</code></td>
252 </tr>
253 <tr valign="top">
254 <td><b>complex float</b></td>
255 <td>F</td>
256 <td>interpret this value as the real and imaginary
257 part of a complex floating-point number<br>
258 e.g. <code>(int *) c.sp.x = 2.76658e+19 +
259 4.59163e-41i</code></td>
260 </tr>
261 <tr valign="top">
262 <td><b>c-string</b></td>
263 <td>s</td>
264 <td>show this as a 0-terminated C string</td>
265 </tr>
266 <tr valign="top">
267 <td><b>signed decimal</b></td>
268 <td>i</td>
269 <td>show this as a signed integer number (this does
270 not perform a cast, it simply shows the bytes as
271 signed integer)</td>
272 </tr>
273 <tr valign="top">
274 <td><b>enumeration</b></td>
275 <td>E</td>
276 <td>show this as an enumeration, printing the
277 value's name if available or the integer value
278 otherwise<br>
279 e.g. <code>(enum enumType) val_type = eValue2</code></td>
280 </tr>
281 <tr valign="top">
282 <td><b>hex</b></td>
283 <td>x</td>
284 <td>show this as in hexadecimal notation (this does
285 not perform a cast, it simply shows the bytes as
286 hex)</td>
287 </tr>
288 <tr valign="top">
289 <td><b>float</b></td>
290 <td>f</td>
291 <td>show this as a floating-point number (this does
292 not perform a cast, it simply interprets the bytes
293 as an IEEE754 floating-point value)</td>
294 </tr>
295 <tr valign="top">
296 <td><b>octal</b></td>
297 <td>o</td>
298 <td>show this in octal notation</td>
299 </tr>
300 <tr valign="top">
301 <td><b>OSType</b></td>
302 <td>O</td>
303 <td>show this as a MacOS OSType<br>
304 e.g. <code>(float) *c.sp.y = '\n\x1f\xd7\n'</code></td>
305 </tr>
306 <tr valign="top">
307 <td><b>unicode16</b></td>
308 <td>U</td>
309 <td>show this as UTF-16 characters<br>
310 e.g. <code>(float) *c.sp.y = 0xd70a 0x411f</code></td>
311 </tr>
312 <tr valign="top">
313 <td><b>unicode32</b></td>
314 <td><br>
315 </td>
316 <td>show this as UTF-32 characters<br>
317 e.g. <code>(float) *c.sp.y = 0x411fd70a</code></td>
318 </tr>
319 <tr valign="top">
320 <td><b>unsigned decimal</b></td>
321 <td>u</td>
322 <td>show this as an unsigned integer number (this
323 does not perform a cast, it simply shows the bytes
324 as unsigned integer)</td>
325 </tr>
326 <tr valign="top">
327 <td><b>pointer</b></td>
328 <td>p</td>
329 <td>show this as a native pointer (unless this is
330 really a pointer, the resulting address will
331 probably be invalid)</td>
332 </tr>
333 <tr valign="top">
334 <td><b>char[]</b></td>
335 <td><br>
336 </td>
337 <td>show this as an array of characters<br>
338 e.g. <code>(char) *c.sp.z = {X}</code></td>
339 </tr>
340 <tr valign="top">
341 <td><b>int8_t[], uint8_t[]<br>
342 int16_t[], uint16_t[]<br>
343 int32_t[], uint32_t[]<br>
344 int64_t[], uint64_t[]<br>
345 uint128_t[]</b></td>
346 <td><br>
347 </td>
348 <td>show this as an array of the corresponding
349 integer type<br>
350 e.g.<br>
351 <code>(int) sarray[0].x = {1 0 0 0}</code><br>
352 <code>(int) sarray[0].x = {0x00000001}</code></td>
353 </tr>
354 <tr valign="top">
355 <td><b>float32[], float64[]</b></td>
356 <td><br>
357 </td>
358 <td>show this as an array of the corresponding
359 floating-point type<br>
360 e.g. <code>(int *) pointer = {1.46991e-39
361 1.4013e-45}</code></td>
362 </tr>
363 <tr valign="top">
364 <td><b>complex integer</b></td>
365 <td>I</td>
366 <td>interpret this value as the real and imaginary
367 part of a complex integer number<br>
368 e.g. <code>(int *) pointer = 1048960 + 1i</code></td>
369 </tr>
370 <tr valign="top">
371 <td><b>character array</b></td>
372 <td>a</td>
373 <td>show this as a character array<br>
374 e.g. <code>(int *) pointer =
375 \x80\x01\x10\0\x01\0\0\0</code></td>
376 </tr>
377 </tbody>
378 </table>
379 </div>
380 </div>
381
382 <div class="post">
383 <h1 class="postheader">type summary</h1>
384 <div class="postcontent">
Enrico Granata86e7c3e2011-07-12 22:56:10 +0000385 <p>Type formats work by showing a different kind of display for
386 the value of a variable. However, they only work for basic types.
387 When you want to display a class or struct in a custom format, you
388 cannot do that using formats.</p>
389 <p>A different feature, type summaries, works by extracting
390 information from classes, structures, ... (<i>aggregate types</i>)
391 and arranging it in a user-defined format, as in the following example:</p>
Enrico Granataff782382011-07-08 02:51:01 +0000392 <p> <i>before adding a summary...</i><br>
393 <code> <b>(lldb)</b> fr var -T one<br>
394 (i_am_cool) one = {<br>
Enrico Granata86e7c3e2011-07-12 22:56:10 +0000395 &nbsp;&nbsp;&nbsp;&nbsp;(int) integer = 3<br>
396 &nbsp;&nbsp;&nbsp;&nbsp;(float) floating = 3.14159<br>
397 &nbsp;&nbsp;&nbsp;&nbsp;(char) character = 'E'<br>
Enrico Granataff782382011-07-08 02:51:01 +0000398 }<br>
399 </code> <br>
400 <i>after adding a summary...</i><br>
401 <code> <b>(lldb)</b> fr var one<br>
402 (i_am_cool) one = int = 3, float = 3.14159, char = 69<br>
403 </code> </p>
Enrico Granata86e7c3e2011-07-12 22:56:10 +0000404 <p>The way to obtain this effect is to bind a <i>summary string</i> to
Enrico Granataff782382011-07-08 02:51:01 +0000405 the datatype using the <code>type summary add</code>
406 command.</p>
Enrico Granata86e7c3e2011-07-12 22:56:10 +0000407 <p>In the example, the command we type was:</p>
408 <table class="stats" width="620" cellspacing="0">
409 <td class="content">
410 <b>(lldb)</b> frame variable counter -f hex
411 </td>
412 <table>
Enrico Granataff782382011-07-08 02:51:01 +0000413 </div>
414 </div>
415 <div class="post">
416 <h1 class="postheader">Summary Strings</h1>
417 <div class="postcontent">
418 <p>So what is the format of the summary strings? Summary
419 strings can contain plain text, control characters and
420 special symbols that have access to information about
421 the current object and the overall program state.</p>
422 <p>Normal characters are any text that doesn't contain a <code><b>'{'</b></code>,
423 <code><b>'}'</b></code>, <code><b>'$'</b></code>, or <code><b>'\'</b></code>
424 character.</p>
425 <p>Variable names are found in between a <code><b>"${"</b></code>
426 prefix, and end with a <code><b>"}"</b></code> suffix.
427 In other words, a variable looks like <code>"<b>${frame.pc}</b>"</code>.</p>
428 <p>Basically, all the variables described in <a
429 href="formats.html">Frame and Thread Formatting</a>
430 are accepted. Also acceptable are the control characters
431 and scoping features described in that page.
432 Additionally, <code>${var</code> and <code>${*var</code>
433 become acceptable symbols in this scenario.</p>
434 <p>The simplest thing you can do is grab a member variable
435 of a class or structure by typing its <i>expression
436 path</i>. In the previous example, the expression path
437 for the floating member is simply <code>.floating</code>,
438 because all you have to do to get at it given an object
439 of type <code>i_am_cool</code> is access it straight
440 away. Thus, to ask the summary string to display <code>floating</code>
441 you would type <code>${var.floating}</code> (<code>${var</code>
442 is a placeholder token replaced with whatever variable
443 is being displayed).</p>
444 <p>If you have code like the following: <br>
445 <code> struct A {<br>
446 int x;<br>
447 int y;<br>
448 };<br>
449 struct B {<br>
450 A x;<br>
451 A y;<br>
452 int z;<br>
453 };<br>
454 </code> the expression path for the <code>y</code>
455 member of the <code>x</code> member of an object of
456 type <code>B</code> would be <code>.x.y</code> and you
457 would type <code>${var.x.y}</code> to display it in a
458 summary string for type <code>B</code>. </p>
459 <p>As you could be using a summary string for both
460 displaying objects of type <code>T</code> or <code>T*</code>
461 (unless <code>-p</code> is used to prevent this), the
462 expression paths do not differentiate between <code>.</code>
463 and <code>-&gt;</code>, and the above expression path <code>.x.y</code>
464 would be just as good if you were displaying a <code>B*</code>,
465 or even if the actual definition of <code>B</code>
466 were: <code><br>
467 struct B {<br>
468 A *x;<br>
469 A y;<br>
470 int z;<br>
471 };<br>
472 </code> </p>
473 <p>This is unlike the behaviour of <code>frame variable</code>
474 which, on the contrary, will enforce the distinction. As
475 hinted above, the rationale for this choice is that
476 waiving this distinction enables one to write a summary
477 string once for type <code>T</code> and use it for both
478 <code>T</code> and <code>T*</code> instances. As a
479 summary string is mostly about extracting nested
480 members' information, a pointer to an object is just as
481 good as the object itself for the purpose.</p>
482 <p>Of course, you can have multiple entries in one summary
483 string. For instance, the command used to produce the
484 above summary string for i_am_cool was: <br>
485 <code>type summary add -f "int = ${var.integer}, float =
486 ${var.floating}, char = ${var.character%u}" i_am_cool
487 </code> </p>
488 <p>As you can see, the last expression path also contains
489 a <code>%u</code> symbol which is nowhere to be found
490 in the actual member variable name. The symbol is
491 reminding of a <code>printf()</code> format symbol, and
492 in fact it has a similar effect. If you add a % sign
493 followed by any one format name or abbreviation from the
494 above table after an expression path, the resulting
495 object will be displyed using exactly that format
496 instead of the LLDB default one. </p>
497 <p>There are two more special format symbols that you can
498 use only as part of a summary string: <code>%V</code>
499 and <code>%@</code>. The first one tells LLDB to ignore
500 summary strings for the type of the object referred by
501 the expression path and instead print the object's
502 value. The second is only applicable to Objective-C
503 classes, and tells LLDB to get the object's description
504 from the Objective-C runtime. By default, if no format
505 is provided, LLDB will try to get the object's summary,
506 and if empty the object's value. If neither can be
507 obtained, nothing will be displayed.</p>
508 <p>As previously said, pointers and values are treated the
509 same way when getting to their members in an expression
510 path. However, if your expression path leads to a
511 pointer, LLDB will not automatically dereference it. In
512 order to obtain The deferenced value for a pointer, your
513 expression path must start with <code>${*var</code>
514 instead of <code>${var</code>. Because there is no need
515 to dereference pointers along your way, the
516 dereferencing symbol only applies to the result of the
517 whole expression path traversing. <br>
518 e.g. <code> <br>
519 <b>(lldb)</b> fr var -T c<br>
520 (Couple) c = {<br>
521 (SimpleWithPointers) sp = {<br>
522 (int *) x = 0x00000001001000b0<br>
523 (float *) y = 0x00000001001000c0<br>
524 (char *) z = 0x00000001001000d0 "X"<br>
525 }<br>
526 (Simple *) s = 0x00000001001000e0<br>
527 }<br>
528 <b>(lldb)</b> type summary add -f "int = ${*var.sp.x},
529 float = ${*var.sp.y}, char = ${*var.sp.z%u}, Simple =
530 ${*var.s}" Couple<br>
531 <b>(lldb)</b> type summary add -c -p Simple<br>
532 <b>(lldb)</b> fr var c<br>
533 (Couple) c = int = 9, float = 9.99, char = 88, Simple
534 = (x=9, y=9.99, z='X')<br>
535 </code> </p>
536 <p>Option <code>-c</code> to <code>type summary add</code>
537 tells LLDB not to look for a summary string, but instead
538 to just print a listing of all the object's children on
539 one line, lay out as in the previous example. The <code>-p</code>
540 flag is used as a trick to show that aggregate types can
541 be dereferenced as well as primitive ones. The above
542 output would be shown even by typing <code>type summary
543 add -f "int = ${*var.sp.x}, float = ${*var.sp.y}, char
544 = ${*var.sp.z%u}, Simple = ${var.s}" Couple</code> if
545 one took away the <code>-p</code> flag from the summary
546 for type <code>Simple</code>. </p>
547 </div>
548 </div>
549 <div class="post">
550 <h1 class="postheader">More on summary strings</h1>
551 <div class="postcontent">
552 <p>What was described above are the main features that you
553 can use in summary strings. However, there are three
554 more features to them.</p>
555 <p>Sometimes, a basic type's value actually represents
556 several different values packed together in a bitfield.
557 With the classical view, there is no way to look at
558 them. Hexadecimal display can help, but if the bits
559 actually span byte boundaries, the help is limited.
560 Binary view would show it all without ambiguity, but is
561 often too detailed and hard to read for real-life
562 scenarios. To cope with the issue, LLDB supports native
563 bitfield formatting in summary strings. If your
564 expression paths leads to a so-called <i>scalar type</i>
565 (the usual int, float, char, double, short, long, long
566 long, double, long double and unsigned variants), you
567 can ask LLDB to only grab some bits out of the value and
568 display them in any format you like. The syntax is
569 similar to that used for arrays, just you can also give
570 a pair of indices separated by a <code>-</code>. <br>
571 e.g. <br>
572 <code> <b>(lldb)</b> fr var float_point<br>
573 (float) float_point = -3.14159<br>
574 <b>(lldb)</b> type summary add -f "Sign: ${var[31]%B}
575 Exponent: ${var[30-23]%x} Mantissa: ${var[0-22]%u}"
576 float<br>
577 <b>(lldb)</b> fr var float_point<br>
578 (float) float_point = -3.14159 Sign: true Exponent:
579 0x00000080 Mantissa: 4788184<br>
580 </code> In this example, LLDB shows the internal
581 representation of a <code>float</code> variable by
582 extracting bitfields out of a float object. If you give
583 a single index, only that one bit will be extracted. If
584 you give a pair of indices, all the bits in the range
585 (extremes included) will be extracted. Ranges can be
586 specified either by giving the lower index first, or
587 higher index first (as is often customary in describing
588 packed data-type formats). </p>
589 <p>The second additional feature allows you to display
590 array members inside a summary string. For instance, you
591 may want to display all arrays of a given type using a
592 more compact notation than the default, and then just
593 delve into individual array members that prove
594 interesting to your debugging task. You can use a
595 similar syntax to the one used for bitfields to tell
596 LLDB to format arrays in special ways. <br>
597 e.g. <br>
598 <code> <b>(lldb)</b> fr var sarray<br>
599 (Simple [3]) sarray = {<br>
600 [0] = {<br>
601 x = 1<br>
602 y = 2<br>
603 z = '\x03'<br>
604 }<br>
605 [1] = {<br>
606 x = 4<br>
607 y = 5<br>
608 z = '\x06'<br>
609 }<br>
610 [2] = {<br>
611 x = 7<br>
612 y = 8<br>
613 z = '\t'<br>
614 }<br>
615 }<br>
616 <b>(lldb)</b> type summary add -f "${var[].x}" "Simple
617 [3]"<br>
618 <b>(lldb)</b> fr var sarray<br>
619 (Simple [3]) sarray = [1,4,7]<br>
620 </code> The <code>[]</code> symbol amounts to: <i>if <code>var</code>
621 is an array and I knows its size, apply this summary
622 string to every element of the array</i>. Here, we are
623 asking LLDB to display <code>.x</code> for every
624 element of the array, and in fact this is what happens.
625 If you find some of those integers anomalous, you can
626 then inspect that one item in greater detail, without
627 the array format getting in the way: <br>
628 <code> <b>(lldb)</b> fr var sarray[1]<br>
629 (Simple) sarray[1] = {<br>
630 x = 4<br>
631 y = 5<br>
632 z = '\x06'<br>
633 }<br>
634 </code> </p>
635 <p>You can also ask LLDB to only print a subset of the
636 array range by using the same syntax used to extract bit
637 for bitfields.</p>
638 <p>The same logic works if you are printing a pointer
639 instead of an array, however in this latter case, <code>[]</code>
640 cannot be used and you need to give exact range limits.</p>
641 <p>The third, and last, additional feature does not
642 directly apply to the summary strings themselves, but is
643 an additional option to the <code>type summary add</code>
644 command: <code>-x</code></p>
645 <p>As you noticed, in order to associate the custom
646 summary string to the array types, one must give the
647 array size as part of the typename. This can long become
648 tiresome when using arrays of different sizes, <code>Simple
649
650 [3]</code>, <code>Simple [9]</code>, <code>Simple
651 [12]</code>, ...</p>
652 <p>If you use the <code>-x</code> option, type names are
653 treated as regular expressions instead of type names.
654 This would let you rephrase the above example as: <br>
655 <code> <b>(lldb)</b> type summary add -f "${var[].x}"
656 -x "Simple \[[0-9]+\]"<br>
657 <b>(lldb)</b> fr var sarray<br>
658 (Simple [3]) sarray = [1,4,7]<br>
659 </code> The above scenario works for <code>Simple [3]</code>
660 as well as for any other array of <code>Simple</code>
661 objects. </p>
662 <p>While this feature is mostly useful for arrays, you
663 could also use regular expressions to catch other type
664 sets grouped by name. However, as regular expression
665 matching is slower than normal name matching, LLDB will
666 first try to match by name in any way it can, and only
667 when this fails, will it resort to regular expression
668 matching. Thus, if your type has a base class with a
669 cascading summary, this will be preferred over any
670 regular expression match for your type itself.</p>
671 </div>
672 </div>
673 <div class="post">
674 <h1 class="postheader">Finding summaries 101</h1>
675 <div class="postcontent">
676 <p>While the rules for finding an appropriate format for a
677 type are relatively simple (just go through typedef
678 hierarchies), summaries follow a more complicated
679 process in finding the right summary string for a
680 variable. Namely, what happens is:</p>
681 <ul>
682 <li>If there is a summary for the type of the variable,
683 use it</li>
684 <li>If this object is a pointer, and there is a summary
685 for the pointee type that does not skip pointers, use
686 it</li>
687 <li>If this object is a reference, and there is a
688 summary for the pointee type that does not skip
689 references, use it</li>
690 <li>If this object is an Objective-C class with a parent
691 class, look at the parent class (and parent of parent,
692 ...)</li>
693 <li>If this object is a C++ class with base classes,
694 look at base classes (and bases of bases, ...)</li>
695 <li>If this object is a C++ class with virtual base
696 classes, look at the virtual base classes (and bases
697 of bases, ...)</li>
698 <li>If this object's type is a typedef, go through
Enrico Granata86e7c3e2011-07-12 22:56:10 +0000699 typedef hierarchy (LLDB might not be able to do this if
700 the compiler has not emitted enough information. If the
701 required information to traverse typedef hierarchies is
702 missing, type cascading will not work. The
703 <a href="http://clang.llvm.org/">clang compiler</a>,
704 part of the LLVM project, emits the correct debugging
705 information for LLDB to cascade)</li>
Enrico Granataff782382011-07-08 02:51:01 +0000706 <li>If everything has failed, repeat the above search,
707 looking for regular expressions instead of exact
708 matches</li>
709 </ul>
710 </div>
711 </div>
712 <div class="post">
713 <h1 class="postheader">TODOs</h1>
714 <div class="postcontent">
715 <ul>
716 <li>There's no way to do multiple dereferencing, and you
717 need to be careful what the dereferencing operation is
718 binding to in complicated scenarios</li>
719 <li>There is no way to call functions inside summary
720 strings, not even <code>const</code> ones</li>
721 <li><code>type format add</code> does not support the <code>-x</code>
722 option</li>
723 <li>Object location cannot be printed in the summary
724 string</li>
725 </ul>
726 </div>
727 </div>
728 </div>
729 </div>
730 </div>
731 </body>
732</html>