-
Notifications
You must be signed in to change notification settings - Fork 48
/
413.srt
4854 lines (3570 loc) · 106 KB
/
413.srt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
WEBVTT
X-TIMESTAMP-MAP=MPEGTS:181083,LOCAL:00:00:00.000
00:00:11.446 --> 00:00:15.166 A:middle
>> Good morning and welcome to
Advanced Debugging with LLDB.
00:00:15.976 --> 00:00:19.126 A:middle
[ Applause ]
00:00:19.626 --> 00:00:21.286 A:middle
I hope you're having
a great show so far,
00:00:21.326 --> 00:00:23.186 A:middle
we've got one last day
of content for you.
00:00:23.186 --> 00:00:25.706 A:middle
So let's make the most of
it by starting with one
00:00:25.706 --> 00:00:27.266 A:middle
of the more important
topics when it comes
00:00:27.266 --> 00:00:30.486 A:middle
to software development, making
sure that everything is clean
00:00:30.486 --> 00:00:32.726 A:middle
and polished in your
application before it goes live.
00:00:33.456 --> 00:00:36.216 A:middle
My name is Kate Stone I manage
the team responsible for LLDB.
00:00:36.216 --> 00:00:38.366 A:middle
I'm going to get things
going here, but I'm going
00:00:38.366 --> 00:00:41.256 A:middle
to spend most of the time in
the session turning things
00:00:41.256 --> 00:00:43.666 A:middle
over to my engineers who
walk you through some
00:00:43.666 --> 00:00:46.986 A:middle
of the exciting things
that we love about LLDB
00:00:46.986 --> 00:00:50.056 A:middle
that you deserve
to know about too.
00:00:50.286 --> 00:00:51.716 A:middle
So what should you
expect from this talk?
00:00:52.726 --> 00:00:55.456 A:middle
Well, the vast majority of
our time here is spent focused
00:00:55.456 --> 00:00:58.516 A:middle
on LLDB as the foundation
for the debugging experience.
00:00:59.386 --> 00:01:02.546 A:middle
LLDB is essentially a library
that knows how to do all kinds
WEBVTT
X-TIMESTAMP-MAP=MPEGTS:181083,LOCAL:00:00:00.000
00:00:59.386 --> 00:01:02.546 A:middle
LLDB is essentially a library
that knows how to do all kinds
00:01:02.546 --> 00:01:04.916 A:middle
of interesting things with
the running application.
00:01:05.676 --> 00:01:07.006 A:middle
It's a command line experience
00:01:07.316 --> 00:01:09.366 A:middle
but it's also the
foundation for Xcode.
00:01:09.936 --> 00:01:12.396 A:middle
So while we'll talk about how
to use it from a command line,
00:01:12.566 --> 00:01:14.226 A:middle
we'll talk about
the Xcode experience
00:01:14.616 --> 00:01:17.036 A:middle
to really understand
what Xcode adds on top
00:01:17.036 --> 00:01:19.426 A:middle
of our debugging
foundation, you should go back
00:01:19.426 --> 00:01:21.906 A:middle
and watch the video for the
debugging with Xcode session,
00:01:22.316 --> 00:01:23.916 A:middle
which unfortunately, it
was earlier this week,
00:01:23.916 --> 00:01:27.016 A:middle
but there's a lot
of good news there.
00:01:27.226 --> 00:01:29.146 A:middle
What we're going to
talk about here are tips
00:01:29.196 --> 00:01:30.946 A:middle
to streamline your
debugging experience.
00:01:31.366 --> 00:01:34.086 A:middle
So you've doubtless know a
lot about debugging already,
00:01:34.446 --> 00:01:36.446 A:middle
but if you haven't worked
with LLDB extensively,
00:01:36.446 --> 00:01:38.006 A:middle
you may not be aware
of everything
00:01:38.006 --> 00:01:39.116 A:middle
that you can do with
the product.
00:01:39.646 --> 00:01:42.426 A:middle
And specifically, we're going to
talk about it not just as a tool
00:01:42.426 --> 00:01:43.766 A:middle
for finding and fixing bugs.
00:01:43.766 --> 00:01:46.356 A:middle
But we're going to talk about,
it is an investigative tool
00:01:46.756 --> 00:01:49.516 A:middle
for looking at your application,
understanding what's going on,
00:01:49.586 --> 00:01:52.256 A:middle
perhaps when you've written a
new feature to walk through it
00:01:52.256 --> 00:01:54.286 A:middle
to make sure that it's working
the way you expect it to.
00:01:54.536 --> 00:01:56.196 A:middle
It's not always about going in
00:01:56.196 --> 00:02:00.016 A:middle
and finding a specific
defect in your code.
WEBVTT
X-TIMESTAMP-MAP=MPEGTS:181083,LOCAL:00:00:00.000
00:01:56.196 --> 00:02:00.016 A:middle
and finding a specific
defect in your code.
00:02:00.236 --> 00:02:01.846 A:middle
Because our collective
goal is to make sure
00:02:01.846 --> 00:02:04.826 A:middle
that your applications
are as reliable as solid
00:02:04.826 --> 00:02:07.976 A:middle
as they can possibly be by the
time they reach your end users.
00:02:09.106 --> 00:02:10.656 A:middle
So that's our focus
for the session.
00:02:10.916 --> 00:02:12.966 A:middle
Let's keep our eye in
your apps and making sure
00:02:12.966 --> 00:02:15.076 A:middle
that they can be the
best apps possible.
00:02:15.476 --> 00:02:18.976 A:middle
What does LLDB look like today?
00:02:19.596 --> 00:02:23.956 A:middle
Well, LLDB as you know is our
ground-up replacement for GDB.
00:02:23.956 --> 00:02:27.236 A:middle
We both-- from the ground-up
this tool, this is designed
00:02:27.236 --> 00:02:29.506 A:middle
to be incredibly
flexible, this is designed
00:02:29.596 --> 00:02:30.696 A:middle
to accommodate the needs
00:02:30.696 --> 00:02:33.776 A:middle
of applications looking
forward rather than backward.
00:02:34.536 --> 00:02:36.886 A:middle
So with that in mind, we
focused on making sure
00:02:36.886 --> 00:02:40.366 A:middle
that it is absolutely
rock solid, this release.
00:02:41.076 --> 00:02:43.086 A:middle
If you have any issues,
whatsoever,
00:02:43.296 --> 00:02:44.766 A:middle
make sure that we
hear about them
00:02:44.766 --> 00:02:48.186 A:middle
because when Xcode5
shifts LLDB will be your
00:02:48.186 --> 00:02:49.226 A:middle
debugging experience.
00:02:49.966 --> 00:02:52.506 A:middle
What have we done?
00:02:53.206 --> 00:02:56.016 A:middle
We've put in hundreds of
improvements this release.
00:02:56.216 --> 00:02:59.376 A:middle
A lot of them are relatively
subtle, you'll see a lot
00:02:59.376 --> 00:03:02.656 A:middle
of the old features working
faster, more predictably
WEBVTT
X-TIMESTAMP-MAP=MPEGTS:181083,LOCAL:00:00:00.000
00:02:59.376 --> 00:03:02.656 A:middle
of the old features working
faster, more predictably
00:03:02.916 --> 00:03:04.726 A:middle
with fewer edge cases
that you need to worry
00:03:04.726 --> 00:03:05.766 A:middle
about than never before.
00:03:06.326 --> 00:03:09.256 A:middle
But we've also focused on
data inspection in particular.
00:03:09.916 --> 00:03:12.346 A:middle
When you're looking at
standard system types,
00:03:12.556 --> 00:03:14.616 A:middle
when you're looking at
anything from foundation
00:03:14.866 --> 00:03:17.546 A:middle
or if you're looking for a
C++ standard library type,
00:03:17.766 --> 00:03:20.856 A:middle
you should get a more reasonable
summary now, you should be able
00:03:20.856 --> 00:03:23.816 A:middle
to get summaries for things
like NSErrors, for NSSets,
00:03:24.406 --> 00:03:27.096 A:middle
things that, again, you
could dig in to before
00:03:27.096 --> 00:03:28.716 A:middle
but now we'll tell
you the information
00:03:28.716 --> 00:03:30.456 A:middle
that you were looking for
right out of the gate.
00:03:30.456 --> 00:03:34.976 A:middle
Our expression parser
is always improving.
00:03:35.256 --> 00:03:37.906 A:middle
It's not necessarily something
that my team is responsible for,
00:03:38.196 --> 00:03:41.736 A:middle
more importantly because my team
took the idea that we wanted
00:03:41.736 --> 00:03:44.366 A:middle
to rely on clang as
our expression parser.
00:03:44.826 --> 00:03:48.666 A:middle
We have a full compiler built
into the product, any expression
00:03:48.666 --> 00:03:50.416 A:middle
that would normally
parse and run as part
00:03:50.416 --> 00:03:53.056 A:middle
of your source code will
work in LLDB as well.
00:03:53.516 --> 00:03:56.026 A:middle
So we're always up-to-date with
the latest language features.
00:03:56.396 --> 00:03:59.736 A:middle
When we added things along
the lines of the new syntax
00:03:59.736 --> 00:04:02.366 A:middle
for Objective-C,
Objective-Constants,
WEBVTT
X-TIMESTAMP-MAP=MPEGTS:181083,LOCAL:00:00:00.000
00:03:59.736 --> 00:04:02.366 A:middle
for Objective-C,
Objective-Constants,
00:04:02.956 --> 00:04:06.556 A:middle
they just showed up in LLDB and
that's through going forward
00:04:06.556 --> 00:04:09.056 A:middle
as well, every new language
feature should be part
00:04:09.056 --> 00:04:09.706 A:middle
of our debugger.
00:04:10.846 --> 00:04:11.976 A:middle
One of the things that's tricky
00:04:11.976 --> 00:04:14.686 A:middle
about this is while we pass
the text that you give us
00:04:14.686 --> 00:04:16.606 A:middle
for an expression
directly to the compiler,
00:04:17.716 --> 00:04:20.606 A:middle
the context that we set
up for, we have to infer
00:04:20.886 --> 00:04:22.086 A:middle
from looking at that code.
00:04:22.346 --> 00:04:24.436 A:middle
So as a result, you may
have found in the past
00:04:24.436 --> 00:04:26.286 A:middle
that you needed to
cast the result
00:04:26.406 --> 00:04:28.336 A:middle
so that we knew what
the result type was
00:04:28.596 --> 00:04:30.206 A:middle
and could explore
it appropriately.
00:04:30.626 --> 00:04:33.026 A:middle
You'll find that in most
cases, we can now infer that
00:04:33.026 --> 00:04:36.036 A:middle
and far fewer explicit
casts are required
00:04:36.036 --> 00:04:37.856 A:middle
for the expression evaluator.
00:04:38.516 --> 00:04:44.106 A:middle
[ Applause ]
00:04:44.606 --> 00:04:47.096 A:middle
So let's think a little bit
about the debugging experience.
00:04:47.206 --> 00:04:48.076 A:middle
What is it that you should do?
00:04:48.076 --> 00:04:50.106 A:middle
Well, to start with,
you should go
00:04:50.106 --> 00:04:51.856 A:middle
into debugging a
particular problem
00:04:51.856 --> 00:04:54.926 A:middle
or exploring something
really well-informed.
00:04:55.526 --> 00:04:56.976 A:middle
There are a bunch of
techniques for doing this
00:04:56.976 --> 00:04:58.336 A:middle
that we'll cover
in detail later.
00:04:58.596 --> 00:05:01.596 A:middle
They should be familiar
ideas, things like assertions
WEBVTT
X-TIMESTAMP-MAP=MPEGTS:181083,LOCAL:00:00:00.000
00:04:58.596 --> 00:05:01.596 A:middle
They should be familiar
ideas, things like assertions
00:05:01.596 --> 00:05:04.156 A:middle
and logging, static
analysis, and using some
00:05:04.156 --> 00:05:07.526 A:middle
of the runtime tools that
will watch your code for us
00:05:07.826 --> 00:05:09.386 A:middle
and tell you, here's
what's going
00:05:09.386 --> 00:05:10.906 A:middle
on that you might
need to be aware of.
00:05:11.536 --> 00:05:13.716 A:middle
But you should also
focus on unit tests.
00:05:14.536 --> 00:05:18.166 A:middle
A unit test will tell you that
this is the narrow situation
00:05:18.296 --> 00:05:20.116 A:middle
in which your code is
not behaving the way you
00:05:20.116 --> 00:05:20.836 A:middle
expected to.
00:05:21.166 --> 00:05:23.336 A:middle
So if you are already
writing a lot of unit test,
00:05:23.646 --> 00:05:26.746 A:middle
make sure you review the
unit testing in Xcode session
00:05:27.026 --> 00:05:31.106 A:middle
to get some idea
what that intends.
00:05:31.106 --> 00:05:34.696 A:middle
And lastly, we need to trust
the Xcode debug configuration.
00:05:35.056 --> 00:05:38.056 A:middle
Out of the box, a new project
in Xcode will be configured
00:05:38.316 --> 00:05:41.566 A:middle
to build debug information,
you need to make sure that,
00:05:41.566 --> 00:05:43.336 A:middle
that's what you're
feeding to the debugger
00:05:43.466 --> 00:05:44.826 A:middle
that you weren't
stripping that away
00:05:44.976 --> 00:05:46.606 A:middle
or else you won't be
able to find symbols.
00:05:47.136 --> 00:05:49.256 A:middle
You need to make sure that
optimization is disabled
00:05:49.256 --> 00:05:51.536 A:middle
which it is by default or
you'll find that stepping
00:05:51.536 --> 00:05:53.446 A:middle
through your code and
leads to surprises.
00:05:53.916 --> 00:05:56.766 A:middle
If you attach to a running
application, you may find
00:05:56.766 --> 00:06:00.156 A:middle
that these have not
been taken care of,
WEBVTT
X-TIMESTAMP-MAP=MPEGTS:181083,LOCAL:00:00:00.000
00:05:56.766 --> 00:06:00.156 A:middle
that these have not
been taken care of,
00:06:00.526 --> 00:06:02.306 A:middle
that's why you're not getting
the information you need
00:06:02.306 --> 00:06:03.396 A:middle
if that's why you're
not stepping
00:06:03.396 --> 00:06:04.906 A:middle
through code in a
logical fashion.
00:06:05.216 --> 00:06:07.996 A:middle
Going back in building with the
debug configuration is always a
00:06:07.996 --> 00:06:11.416 A:middle
good idea for debug session.
00:06:11.576 --> 00:06:14.536 A:middle
Secondly, we need to avoid
some of the common mistakes.
00:06:14.616 --> 00:06:17.156 A:middle
You can go and you can do
the brute-force debugging.
00:06:17.596 --> 00:06:20.676 A:middle
Everybody knows how to do
this, set a breakpoint right
00:06:20.676 --> 00:06:22.926 A:middle
at the beginning of our
code and step, step our way
00:06:22.926 --> 00:06:24.026 A:middle
to where we need to get to.
00:06:24.186 --> 00:06:26.736 A:middle
But in practice, that's
not the most efficient way
00:06:26.956 --> 00:06:28.506 A:middle
to take advantage of LLDB.
00:06:28.676 --> 00:06:31.556 A:middle
So during the session, we'll
talk about how to stop exactly
00:06:31.556 --> 00:06:35.676 A:middle
where you want to, not keep
running 20 times until you get
00:06:35.676 --> 00:06:38.186 A:middle
to the right pass,
how to stop actually
00:06:38.186 --> 00:06:39.716 A:middle
under the conditions
you're interested in.
00:06:40.836 --> 00:06:43.096 A:middle
How to then customize
what you're seeing
00:06:43.276 --> 00:06:45.596 A:middle
with custom formatters
and custom commands
00:06:45.906 --> 00:06:47.746 A:middle
because we're going to give
you a reasonable format
00:06:47.996 --> 00:06:50.866 A:middle
for system types, but we don't
know about your types yet.
00:06:51.226 --> 00:06:52.926 A:middle
We'll allow you to
introduce us to your types
00:06:53.176 --> 00:06:54.876 A:middle
and tell us what's
interesting about them.
00:06:55.726 --> 00:07:00.146 A:middle
And lastly, we want to focus
on how you can write debug code
WEBVTT
X-TIMESTAMP-MAP=MPEGTS:181083,LOCAL:00:00:00.000
00:06:55.726 --> 00:07:00.146 A:middle
And lastly, we want to focus
on how you can write debug code
00:07:00.386 --> 00:07:02.916 A:middle
without stopping your
project altering your source,
00:07:02.916 --> 00:07:04.846 A:middle
going through rebuild
cycle and then trying
00:07:04.846 --> 00:07:05.956 A:middle
to get back to that state.
00:07:06.476 --> 00:07:08.596 A:middle
Because again, we've got a
full expression evaluator,
00:07:08.816 --> 00:07:11.406 A:middle
you can write incredibly
sophisticated code right there
00:07:11.406 --> 00:07:14.376 A:middle
in the debugger to alter the way
your application is executing
00:07:14.466 --> 00:07:16.696 A:middle
and explore things that
your source may not
00:07:16.696 --> 00:07:20.316 A:middle
yet be set up for.
00:07:20.536 --> 00:07:23.086 A:middle
Along the way though, especially
when you're taking the advantage
00:07:23.086 --> 00:07:25.586 A:middle
of the expression evaluator, you
should watch out for the fact
00:07:25.586 --> 00:07:27.596 A:middle
that while the debugger
goes well out of its way
00:07:27.596 --> 00:07:28.896 A:middle
to avoid side effects.
00:07:29.626 --> 00:07:33.366 A:middle
If you're telling us explicitly
to run some code, we are running
00:07:33.366 --> 00:07:34.926 A:middle
that code in your
live application,
00:07:34.926 --> 00:07:38.596 A:middle
it can change the state of
things that can be a good thing
00:07:38.826 --> 00:07:40.466 A:middle
if your intent is to try to work
00:07:40.466 --> 00:07:43.376 A:middle
around an issue during the
debug session or a bad thing
00:07:43.376 --> 00:07:45.566 A:middle
if you're trying to see exactly
what your application is going
00:07:45.566 --> 00:07:47.156 A:middle
to do without the
debugger attached.
00:07:49.556 --> 00:07:50.886 A:middle
So for the rest of this session,
00:07:51.296 --> 00:07:53.546 A:middle
the focus is this
canonical process
00:07:53.546 --> 00:07:55.816 A:middle
of how do I use the
debugger each and every time
00:07:56.046 --> 00:07:57.156 A:middle
to catch those tasty bugs?
00:07:58.946 --> 00:08:01.986 A:middle
The answer is step one we
need to pick our focus.
WEBVTT
X-TIMESTAMP-MAP=MPEGTS:181083,LOCAL:00:00:00.000
00:07:58.946 --> 00:08:01.986 A:middle
The answer is step one we
need to pick our focus.
00:08:02.506 --> 00:08:03.666 A:middle
We need to choose what it is
00:08:03.696 --> 00:08:04.906 A:middle
that we're trying
to investigate?
00:08:04.906 --> 00:08:06.926 A:middle
What's the question
that we have in mind
00:08:06.926 --> 00:08:08.146 A:middle
that the debugger
can help answer?
00:08:09.386 --> 00:08:13.546 A:middle
Step two, how do I stop right
before the interesting path
00:08:14.136 --> 00:08:17.616 A:middle
before the problem has
occurred but not so far from it
00:08:17.616 --> 00:08:21.236 A:middle
that we're going to be
stepping endlessly to get there.
00:08:21.456 --> 00:08:23.616 A:middle
Then we need to step
through our live code looking
00:08:23.616 --> 00:08:25.826 A:middle
at the interesting things
that are going on the path
00:08:25.926 --> 00:08:29.436 A:middle
that it's following, and
looking at data along the way.
00:08:29.876 --> 00:08:31.666 A:middle
So we understand the
state of our application
00:08:31.826 --> 00:08:33.336 A:middle
and the changes that
are being made.
00:08:33.796 --> 00:08:37.765 A:middle
So our focus here is to help you
be experts at all of the above.
00:08:39.155 --> 00:08:41.666 A:middle
To get it started, I'd like
to invite up Sean Callan,
00:08:41.866 --> 00:08:43.716 A:middle
one of my engineers
who will walk you
00:08:43.716 --> 00:08:46.866 A:middle
through a few incredibly
helpful tips at the start
00:08:46.866 --> 00:08:49.886 A:middle
of this process, but you should
also tackle them in the labs,
00:08:49.886 --> 00:08:52.346 A:middle
if you have any questions at all
about the expression evaluator
00:08:52.606 --> 00:08:54.186 A:middle
because he is our
expert on the subject.
00:08:54.726 --> 00:08:55.226 A:middle
Thank you, Sean.
00:08:59.186 --> 00:09:00.006 A:middle
>> Thank you very much, Kate.
WEBVTT
X-TIMESTAMP-MAP=MPEGTS:181083,LOCAL:00:00:00.000
00:08:59.186 --> 00:09:00.006 A:middle
>> Thank you very much, Kate.
00:09:00.756 --> 00:09:04.066 A:middle
I'm really excited to show you
all the great ways you can debug
00:09:04.066 --> 00:09:04.906 A:middle
with LLDB.
00:09:05.496 --> 00:09:07.706 A:middle
But I think one of the most
important things to understand
00:09:07.706 --> 00:09:11.466 A:middle
when you're debugging is when
to use LLDB and what sort
00:09:11.466 --> 00:09:13.746 A:middle
of information can help you
out when you're debugging.
00:09:16.296 --> 00:09:21.876 A:middle
So one situation where LLDB
might not be the first stop
00:09:21.876 --> 00:09:25.316 A:middle
for you is if you're not sure
whether your program has a bug
00:09:25.316 --> 00:09:27.896 A:middle
in the first place.
00:09:28.096 --> 00:09:32.566 A:middle
One way you can check, whether
what your assumptions are,
00:09:32.716 --> 00:09:34.196 A:middle
or actually what's happening
00:09:34.196 --> 00:09:36.486 A:middle
in your code is by
using assertions.
00:09:37.536 --> 00:09:40.416 A:middle
Now what assertions
let you do is express
00:09:40.716 --> 00:09:42.826 A:middle
that you make a particular
assumption
00:09:43.046 --> 00:09:45.396 A:middle
and you believe this
is not only unlikely
00:09:45.576 --> 00:09:47.006 A:middle
but it's actually impossible.
00:09:48.026 --> 00:09:51.836 A:middle
Now remember, as programmers, we
want to be using arrow handling
00:09:52.066 --> 00:09:53.736 A:middle
to count, to handle the cases
00:09:53.736 --> 00:09:56.656 A:middle
that we actually think are
possible just, you know,
00:09:56.656 --> 00:09:59.396 A:middle
that are, that where our
program won't work correctly.
00:09:59.906 --> 00:10:03.966 A:middle
So this is really for
cases where your app is,
WEBVTT
X-TIMESTAMP-MAP=MPEGTS:181083,LOCAL:00:00:00.000
00:09:59.906 --> 00:10:03.966 A:middle
So this is really for
cases where your app is,
00:10:04.306 --> 00:10:07.336 A:middle
has encountered something
that just can't be.
00:10:08.126 --> 00:10:11.096 A:middle
Now another case where
assertions can be handy is
00:10:11.096 --> 00:10:14.576 A:middle
if you have internal
APIs between components
00:10:15.196 --> 00:10:18.506 A:middle
and they have contract between
them that shouldn't be violated.
00:10:18.506 --> 00:10:21.116 A:middle
Now remember, that's
for internal APIs.
00:10:21.116 --> 00:10:23.226 A:middle
For external APIs,
you really want
00:10:23.226 --> 00:10:24.816 A:middle
to be using correct
error handling.
00:10:25.636 --> 00:10:28.796 A:middle
What an assertion will do is
if this contract is violated,
00:10:29.026 --> 00:10:33.056 A:middle
your application will
crash right then and there.
00:10:33.276 --> 00:10:37.886 A:middle
Now having your application
crash deliberately isn't exactly
00:10:37.886 --> 00:10:39.806 A:middle
a recipe for good
reviews on the App Store.
00:10:40.166 --> 00:10:44.226 A:middle
So you want to make sure that
the assertions are disabled
00:10:44.226 --> 00:10:45.066 A:middle
when you build release.
00:10:45.906 --> 00:10:49.126 A:middle
Xcode does that for you and
now default project templates,
00:10:49.406 --> 00:10:52.246 A:middle
we've disabled assertions
when you build release.
00:10:52.986 --> 00:10:55.046 A:middle
Now there's one other thing
00:10:55.046 --> 00:10:57.166 A:middle
about assertions you
have to be aware of.
00:10:58.076 --> 00:11:00.516 A:middle
When you've got an assertion
compiled into your code,
WEBVTT
X-TIMESTAMP-MAP=MPEGTS:181083,LOCAL:00:00:00.000
00:10:58.076 --> 00:11:00.516 A:middle
When you've got an assertion
compiled into your code,
00:11:01.646 --> 00:11:06.046 A:middle
the condition is evaluated
only if the assertion is there.
00:11:06.296 --> 00:11:09.416 A:middle
So your condition should
not do useful work otherwise