1 00:00:00,000 --> 00:00:05,640 2 00:00:05,640 --> 00:00:06,830 >> DOUG LLOYD ყველა უფლება GDB. 3 00:00:06,830 --> 00:00:08,480 რა არის ზუსტად? 4 00:00:08,480 --> 00:00:11,310 ასე რომ, GDB, რომელიც დგას იმ GNU Debugger, 5 00:00:11,310 --> 00:00:15,040 მართლაც გასაოცარია ინსტრუმენტი, რომელიც ჩვენ შეგვიძლია გამოიყენოთ დაგვეხმარება გამართვის ჩვენი პროგრამების, 6 00:00:15,040 --> 00:00:18,210 ან გაირკვეს, სადაც ყველაფერი მიდის არასწორი ჩვენი პროგრამების. 7 00:00:18,210 --> 00:00:22,590 GDB არის საოცრად ძლიერი, მაგრამ გამომავალი და ურთიერთქმედება ის 8 00:00:22,590 --> 00:00:23,830 შეიძლება ცოტა cryptic. 9 00:00:23,830 --> 00:00:28,210 ეს, როგორც წესი ბრძანების ინსტრუმენტი, და მას შეუძლია ჩააგდოს ბევრი შეტყობინებები თქვენ. 10 00:00:28,210 --> 00:00:31,144 და მას შეუძლია სახის მძიმე გაურკვეველი ზუსტად რა ხდება. 11 00:00:31,144 --> 00:00:33,560 საბედნიეროდ, ჩვენ გადადგა ნაბიჯები, დაფიქსირება ამ პრობლემას თქვენთვის 12 00:00:33,560 --> 00:00:36,281 როგორც თქვენ მუშაობთ მეშვეობით CS50. 13 00:00:36,281 --> 00:00:39,030 თუ თქვენ არ იყენებთ გრაფიკული debugger, რომელიც ჩემს კოლეგას Dan 14 00:00:39,030 --> 00:00:41,570 Armandarse უკვე ვესაუბრე საკმაოდ ცოტა შესახებ ვიდეო რომ 15 00:00:41,570 --> 00:00:44,740 უნდა იყოს მეტი აქ ახლა, თქვენ უნდა 16 00:00:44,740 --> 00:00:48,270 გამოიყენოს ამ ბრძანების ინსტრუმენტები მუშაობა GDB. 17 00:00:48,270 --> 00:00:51,250 თუ თქვენ მომუშავე CS50 IDE, თქვენ არ უნდა გავაკეთოთ ეს. 18 00:00:51,250 --> 00:00:53,550 მაგრამ თუ თქვენ არ მომუშავე CS50 IDE, 19 00:00:53,550 --> 00:00:55,750 ალბათ გამოყენებით ვერსია of CS50 ელექტრო მოწყობილობების, 20 00:00:55,750 --> 00:00:58,860 ან სხვა Linux ოპერაციული სისტემის GDB დამონტაჟებული, 21 00:00:58,860 --> 00:01:00,980 თქვენ უნდა გამოვიყენოთ ამ ბრძანების ინსტრუმენტები. 22 00:01:00,980 --> 00:01:02,860 >> მას შემდეგ, რაც თქვენ შეიძლება უნდა გავაკეთოთ, რომ ეს 23 00:01:02,860 --> 00:01:06,280 სასარგებლო უბრალოდ უნდა გვესმოდეს, თუ როგორ GDB მუშაობს ბრძანების. 24 00:01:06,280 --> 00:01:09,650 თუმცა ისევ და ისევ, თუ თქვენ გამოყენებით CS50 IDE, თქვენ 25 00:01:09,650 --> 00:01:15,400 შეგიძლიათ გამოიყენოთ გრაფიკული debugger რომ არის ჩაშენებული IDE. 26 00:01:15,400 --> 00:01:18,750 ასე რომ მიიღოს რამ მიმდინარეობს GDB, დაიწყოს გამართვის 27 00:01:18,750 --> 00:01:21,220 პროცესში კონკრეტული პროგრამა, ყველა თქვენ უნდა გააკეთოთ 28 00:01:21,220 --> 00:01:23,810 არის ტიპის GDB მოჰყვა მიერ პროგრამის სახელი. 29 00:01:23,810 --> 00:01:28,620 ასე მაგალითად, თუ თქვენი პროგრამა Hello, თქვენ უნდა აკრიფოთ GDB hello. 30 00:01:28,620 --> 00:01:31,210 >> როდესაც თქვენ, რომ, თქვენ აპირებს დახევის up GDB გარემოში. 31 00:01:31,210 --> 00:01:33,800 თქვენი სწრაფი შეიცვლება, და ნაცვლად იმისა, რომ ის, რაც, როგორც წესი, 32 00:01:33,800 --> 00:01:35,841 არის, როდესაც თქვენ აკრიფოთ რამ ბრძანება ხაზი ls, 33 00:01:35,841 --> 00:01:38,115 cd-- ყველა თქვენი ტიპიური Linux ბრძანებები, დროული 34 00:01:38,115 --> 00:01:42,200 შეიცვლება, ალბათ, რაღაც ისევე როგორც ფრჩხილებში GDB ფრჩხილებში. 35 00:01:42,200 --> 00:01:46,630 ეს არის თქვენი ახალი GDB ზოლზე, რადგან თქვენ შიგნით GDB გარემოში. 36 00:01:46,630 --> 00:01:49,830 მას შემდეგ, რაც შიგნით, რომ გარემო, არსებობს ორი ძირითადი ბრძანებები 37 00:01:49,830 --> 00:01:52,290 რომ თქვენ ალბათ გამოიყენოთ შემდეგი თანმიმდევრობით. 38 00:01:52,290 --> 00:01:55,200 >> პირველი არის ის, ბ, რომელიც მოკლე შესვენება. 39 00:01:55,200 --> 00:01:58,690 მას შემდეგ, რაც თქვენ აკრიფოთ ბ, თქვენ, როგორც წესი, აკრიფოთ სახელით ფუნქცია, 40 00:01:58,690 --> 00:02:01,040 ან თუ მოხდება უნდა იცოდეს დაახლოებით რა ხაზის ნომერი 41 00:02:01,040 --> 00:02:04,100 თქვენი პროგრამა იწყება უნდა მოიქცეს ცოტა უცნაური, 42 00:02:04,100 --> 00:02:06,370 შეგიძლიათ ჩაწეროთ ხაზი ნომერი იქ. 43 00:02:06,370 --> 00:02:09,660 რა ბ, ან შესვენების აკეთებს არის ის საშუალებას თქვენი პროგრამა 44 00:02:09,660 --> 00:02:13,270 აწარმოებს წლამდე გარკვეული თვალსაზრისით, კერძოდ, სახელით ფუნქცია 45 00:02:13,270 --> 00:02:15,880 რომ თქვენს მიერ მითითებული და ხაზი ნომერი, რომელიც თქვენ დააკონკრეტა. 46 00:02:15,880 --> 00:02:18,590 >> და ამ ეტაპზე, გაყინვას აღსრულება. 47 00:02:18,590 --> 00:02:21,670 ეს არის მართლაც კარგია, რადგან ერთხელ შესრულების გაიყინა 48 00:02:21,670 --> 00:02:25,214 თქვენ შეგიძლიათ დაიწყოს ძალიან ნელა მიმართეთ თქვენი პროგრამა. 49 00:02:25,214 --> 00:02:28,130 როგორც წესი, თუ თქვენ უკვე გაშვებული თქვენი პროგრამების, ისინი საკმაოდ მოკლე. 50 00:02:28,130 --> 00:02:31,250 როგორც წესი, თქვენ ჩაწერეთ dot slash რასაც სახელი თქვენი პროგრამა, Enter, 51 00:02:31,250 --> 00:02:33,470 და სანამ თქვენ შეგიძლიათ დახუჭოს, თქვენი პროგრამა უკვე დასრულდა. 52 00:02:33,470 --> 00:02:36,620 ეს ნამდვილად არ არის ბევრი დრო ცდილობენ და გაერკვნენ, თუ რა ხდება არასწორი. 53 00:02:36,620 --> 00:02:40,920 ასე რომ, ეს ნამდვილად შეძლებს ნელი რამ ქვემოთ მიიღწევა შესვენების წერტილი b, 54 00:02:40,920 --> 00:02:43,040 და შემდეგ სტეპინგზე. 55 00:02:43,040 --> 00:02:46,169 >> მაშინ ერთხელ თქვენ მითითებული თქვენი შესვენების წერტილი, შეგიძლიათ პროგრამის გაშვება. 56 00:02:46,169 --> 00:02:47,960 და თუ თქვენ გაქვთ რაიმე ბრძანების ხაზი არგუმენტები, 57 00:02:47,960 --> 00:02:51,610 თქვენს მიერ მითითებული მათ აქ, არ არის, როდესაც თქვენ აკრიფოთ GDB თქვენი პროგრამის სახელი. 58 00:02:51,610 --> 00:02:55,980 თქვენ მიუთითოს ყველა ბრძანების ხაზი არგუმენტები აღების r, ან პერსპექტივაში, 59 00:02:55,980 --> 00:03:00,270 და შემდეგ რაც ბრძანების არგუმენტები შიგნით თქვენი პროგრამა. 60 00:03:00,270 --> 00:03:03,510 არსებობს მთელი რიგი სხვა ნამდვილად მნიშვნელოვანი და სასარგებლო ბრძანებები 61 00:03:03,510 --> 00:03:04,970 შიგნით მშპ-გარემო. 62 00:03:04,970 --> 00:03:07,540 ნება მომეცით, უბრალოდ სწრაფად წავიდეთ მეტი რამდენიმე მათგანი. 63 00:03:07,540 --> 00:03:11,320 >> პირველი არის ის, n, რომელიც მოკლე შემდეგი, და თქვენ შეგიძლიათ აკრიფოთ შემდეგი ნაცვლად n, 64 00:03:11,320 --> 00:03:12,304 ორივე იმუშავებს. 65 00:03:12,304 --> 00:03:13,470 და ეს მხოლოდ სტენოგრამის. 66 00:03:13,470 --> 00:03:17,540 და როგორც თქვენ ალბათ უკვე მიღებული გამოიყენება, რათა ჩაწეროთ რამ 67 00:03:17,540 --> 00:03:20,520 მოკლე ზოგადად უკეთესი. 68 00:03:20,520 --> 00:03:24,100 და რას გააკეთებს ის არის, რომ ყველაფერს წინ გადადგმული ნაბიჯია ერთი ბლოკი კოდი. 69 00:03:24,100 --> 00:03:26,170 ასე რომ, ეს წინსვლა სანამ ფუნქცია ზარი. 70 00:03:26,170 --> 00:03:28,350 და მაშინ ნაცვლად diving, რომ ფუნქცია 71 00:03:28,350 --> 00:03:33,130 და გადის ყველა, რომ ფუნქციები კოდი, ეს იქნება უბრალოდ ფუნქცია. 72 00:03:33,130 --> 00:03:34,400 >> ფუნქცია დაერქმევა. 73 00:03:34,400 --> 00:03:35,733 ის ყველაფერს გააკეთებს, რასაც მისი მუშაობა. 74 00:03:35,733 --> 00:03:38,870 იგი დაბრუნდება ღირებულება ფუნქცია, რომელიც მას. 75 00:03:38,870 --> 00:03:42,490 და მაშინ თქვენ გადაადგილება, რათა შემდეგი ხაზი, რომელიც მოუწოდებდა ფუნქცია. 76 00:03:42,490 --> 00:03:44,555 თუ გსურთ დახევას შიგნით ფუნქცია, 77 00:03:44,555 --> 00:03:46,430 ნაცვლად მხოლოდ მქონე იგი შეასრულოს, მით უმეტეს, 78 00:03:46,430 --> 00:03:50,004 თუ ფიქრობთ, რომ პრობლემა შეიძლება ტყუილი შიგნით რომ ფუნქცია, 79 00:03:50,004 --> 00:03:52,670 თქვენ შეიძლება, რა თქმა უნდა, მითითებული შესვენების მეტიც, შიგნით რომ ფუნქცია. 80 00:03:52,670 --> 00:03:57,820 ან თუ თქვენ უკვე ჩართულია, შეგიძლიათ გამოყენება s წინ გადადგმული ნაბიჯია ერთი ხაზი კოდი. 81 00:03:57,820 --> 00:04:01,170 >> ასე რომ, ეს იქნება გადადგას და ჩაყვინთვის შევიდა ფუნქციები, 82 00:04:01,170 --> 00:04:04,750 ნაცვლად უბრალოდ უნდა შეასრულოს და გრძელდება ფუნქცია 83 00:04:04,750 --> 00:04:07,380 რომ თქვენ გამართვის. 84 00:04:07,380 --> 00:04:09,870 თუ თქვენ ოდესმე გვინდა ვიცოდეთ ღირებულება ცვლადი, 85 00:04:09,870 --> 00:04:12,507 შეგიძლიათ ჩაწეროთ p, ან ბეჭდვა, და შემდეგ ცვლადის სახელი. 86 00:04:12,507 --> 00:04:15,090 და რომელიც ამობეჭდოთ თქვენ, შიგნით GDB გარემო, 87 00:04:15,090 --> 00:04:19,110 სახელი ცვლადი, რომელიც you-- ამართლებს ჩემთვის ღირებულება ცვლადი 88 00:04:19,110 --> 00:04:20,064 რომ თქვენ დაასახელა. 89 00:04:20,064 --> 00:04:23,230 თუ გსურთ იცოდეთ ღირებულებების ყოველ ადგილობრივი ცვლადი ხელმისაწვდომი, სადაც 90 00:04:23,230 --> 00:04:25,970 თქვენ ამჟამად არის თქვენი პროგრამა, შეგიძლიათ ჩაწეროთ ინფორმაცია ადგილობრივები. 91 00:04:25,970 --> 00:04:28,332 ეს არის ბევრი უფრო სწრაფად, ვიდრე აკრეფით P და მერე რასაც, 92 00:04:28,332 --> 00:04:30,540 ჩამონათვალია ყველა ცვლადები, რომ თქვენ იცით, თუ არსებობს. 93 00:04:30,540 --> 00:04:34,370 შეგიძლიათ აკრიფოთ ინფორმაცია ადგილობრივები, და ეს ამობეჭდოთ ყველაფერი თქვენთვის. 94 00:04:34,370 --> 00:04:37,770 შემდეგი up არის bt, რომელიც მოკლე უკან კვალი. 95 00:04:37,770 --> 00:04:41,680 ახლა, ზოგადად, განსაკუთრებით დასაწყისში CS50, 96 00:04:41,680 --> 00:04:44,450 თქვენ ნამდვილად არ გვაქვს შემთხვევა გამოიყენოთ bt, ან უკან კვალი, 97 00:04:44,450 --> 00:04:47,860 იმიტომ, რომ თქვენ არ მქონე ფუნქციები რომ მოვუწოდებთ სხვა ფუნქციები. 98 00:04:47,860 --> 00:04:50,450 >> ალბათ მთავარი ზარი ფუნქცია, მაგრამ ეს, ალბათ, მას. 99 00:04:50,450 --> 00:04:53,199 თქვენ არ გაქვთ, რომ სხვა ფუნქცია მოუწოდებს სხვა ფუნქცია, რომელიც 100 00:04:53,199 --> 00:04:54,880 მოუწოდებს სხვა ფუნქცია, და ასე შემდეგ. 101 00:04:54,880 --> 00:04:57,550 მაგრამ, როგორც თქვენი პროგრამების კიდევ უფრო რთული, და განსაკუთრებით 102 00:04:57,550 --> 00:05:00,290 როდესაც თქვენ დაიწყოს მუშაობა ერთად უკან, უკან კვალი 103 00:05:00,290 --> 00:05:05,150 შეიძლება მართლაც სასარგებლო გზა მოგცემთ სახის მისაღებად გარკვეული გარემოებების, სადაც 104 00:05:05,150 --> 00:05:06,460 მე ვარ ჩემი პროგრამა. 105 00:05:06,460 --> 00:05:10,590 ასე რომ ვთქვათ, თქვენ წერილობითი თქვენი კოდი და თქვენ იცით, რომ მთავარ მოუწოდებს ფუნქცია 106 00:05:10,590 --> 00:05:14,720 f, რომელიც მოუწოდებს ფუნქცია g, რომელიც მოუწოდებს ფუნქცია სთ. 107 00:05:14,720 --> 00:05:17,650 ასე რომ, ჩვენ გვაქვს რამდენიმე ფენა მობუდარი ხდება აქ. 108 00:05:17,650 --> 00:05:19,440 >> თუ თქვენ შიგნით თქვენი GDB გარემო, 109 00:05:19,440 --> 00:05:21,640 და თქვენ იცით თქვენი შიგნით თ, მაგრამ თქვენ დაგავიწყდებათ 110 00:05:21,640 --> 00:05:27,210 იმაზე, თუ რა მივიღე თქვენ სადაც are-- შეგიძლიათ აკრიფოთ BT, ან უკან კვალი, 111 00:05:27,210 --> 00:05:32,370 და ეს იქნება ამობეჭდოთ თ, გ, f მთავარი, ერთად რამდენიმე სხვა ინფორმაცია, რომელიც 112 00:05:32,370 --> 00:05:35,984 გაძლევთ ნახავ, რომ, OK მთავარი მოუწოდა ვ ვ მოუწოდა გ, ზ მოუწოდა h, 113 00:05:35,984 --> 00:05:37,900 და რომ სადაც მე გაკეთებული ვარ ჩემი პროგრამა. 114 00:05:37,900 --> 00:05:41,380 ასე რომ, ეს შეიძლება მართლაც სასარგებლო, მით უმეტეს, რომ cryptic-Ness of GDB 115 00:05:41,380 --> 00:05:45,667 ხდება ცოტა გადაჭარბებული, რომ გავარკვიოთ ზუსტად სადაც რამ. 116 00:05:45,667 --> 00:05:48,500 და ბოლოს, მაშინ, როდესაც კეთდება, ან როდესაც თქვენ გაკეთდეს გამართვის ეს 117 00:05:48,500 --> 00:05:50,125 და გსურთ დახევას დაშორებით საწყისი GDB გარემო, 118 00:05:50,125 --> 00:05:51,940 ეს ხელს უწყობს ვიცი როგორ უნდა გავიდნენ ეს. 119 00:05:51,940 --> 00:05:55,500 შეგიძლიათ აკრიფოთ q, ან გადადგომის გავიდნენ. 120 00:05:55,500 --> 00:05:59,220 ახლა, სანამ დღევანდელი ვიდეო მე მზად buggy პროგრამა 121 00:05:59,220 --> 00:06:03,900 მოუწოდა buggy1, რომელიც მე შედგენილი საწყისი ფაილი ცნობილია, როგორც buggy1.c. 122 00:06:03,900 --> 00:06:06,500 როგორც თქვენ შეიძლება ველოდოთ, ეს პროგრამა ფაქტობრივად buggy. 123 00:06:06,500 --> 00:06:08,990 რაღაც მიდის არასწორი როდესაც მე ვცდილობ და გაუშვით. 124 00:06:08,990 --> 00:06:13,014 ახლა, სამწუხაროდ, მე უნებლიედ ამოღებულია ჩემი buggy1.c ფაილი, 125 00:06:13,014 --> 00:06:15,930 ასე რომ, რათა ჩემთვის გაერკვნენ რა ხდება არასწორი ეს პროგრამა, 126 00:06:15,930 --> 00:06:18,770 მე ვაპირებ უნდა გამოვიყენოთ GDB სახის ბრმად, ცდილობს 127 00:06:18,770 --> 00:06:22,372 ნავიგაცია მეშვეობით ეს პროგრამა გაერკვნენ, თუ რა ხდება არასწორი. 128 00:06:22,372 --> 00:06:24,580 მაგრამ მხოლოდ გამოყენებით ინსტრუმენტები ჩვენ უკვე შეიტყო, 129 00:06:24,580 --> 00:06:27,700 ჩვენ შეიძლება საკმაოდ ბევრი ფიგურა ზუსტად ის, რაც არის. 130 00:06:27,700 --> 00:06:30,740 მოდით უხელმძღვანელებს გადასცა CS50 IDE და აქვს სახე. 131 00:06:30,740 --> 00:06:33,155 OK, ასე რომ, ჩვენ აქ ჩემი CS50 IDE გარემო, 132 00:06:33,155 --> 00:06:35,697 და მე მიუახლოვდით ცოტა ასე რომ თქვენ ხედავთ ცოტა მეტი. 133 00:06:35,697 --> 00:06:38,530 ჩემი ტერმინალის ფანჯარაში, თუ სიაში შინაარსი ჩემი ამჟამინდელი დირექტორი 134 00:06:38,530 --> 00:06:41,250 ერთად ls, ჩვენ დავინახავთ, რომ მე აქვს რამდენიმე წყარო 135 00:06:41,250 --> 00:06:44,982 აქ, მათ შორის ადრე განხილული buggy1. 136 00:06:44,982 --> 00:06:46,940 რა ხდება, როდესაც მე ვცდილობ და გაუშვით buggy1. 137 00:06:46,940 --> 00:06:47,773 კარგად მოდით გავარკვიოთ. 138 00:06:47,773 --> 00:06:52,510 მე აკრიფოთ dot ხაზი, buggy, და მე დააჭიროთ. 139 00:06:52,510 --> 00:06:53,670 >> სეგმენტაცია ხარვეზებით. 140 00:06:53,670 --> 00:06:55,000 ეს არ არის კარგი. 141 00:06:55,000 --> 00:06:57,180 თუ გავიხსენებთ, რომელიც სეგმენტაცია ბრალია, როგორც წესი, 142 00:06:57,180 --> 00:07:01,540 ხდება, როდესაც ჩვენ მეხსიერება რომ ჩვენ არ უშვებენ შეეხოთ. 143 00:07:01,540 --> 00:07:03,820 ჩვენ როგორღაც მიაღწია გარეთ საზღვრები 144 00:07:03,820 --> 00:07:05,995 რა პროგრამა, შემდგენელი, მოგვცა. 145 00:07:05,995 --> 00:07:08,310 ასე რომ, უკვე, რომ არის ნახავ შენარჩუნება ყუთისთვის 146 00:07:08,310 --> 00:07:10,660 როგორც ჩვენ ვიწყებთ გამართვის პროცესში. 147 00:07:10,660 --> 00:07:13,620 რაღაც წავიდა ცოტა არასწორია აქ. 148 00:07:13,620 --> 00:07:15,935 >> ყველა უფლება, მოდით დაწყება მდე GDB გარემო 149 00:07:15,935 --> 00:07:19,030 და თუ ჩვენ ვერ გაერკვნენ რა პრობლემა არის. 150 00:07:19,030 --> 00:07:21,674 მე ვაპირებ გარკვევას ჩემი ეკრანზე, და მე ვაპირებ აკრიფოთ GDB 151 00:07:21,674 --> 00:07:24,340 ერთხელ, შესვლის GDB გარემო, და პროგრამის სახელი 152 00:07:24,340 --> 00:07:27,450 რომ მე მინდა გამართვის, buggy1. 153 00:07:27,450 --> 00:07:30,182 ჩვენ კიდევ ცოტა გაგზავნა, კითხულობს სიმბოლოები buggy1, გაკეთდეს. 154 00:07:30,182 --> 00:07:32,390 ყველა ეს ნიშნავს, რომ იგი გამოყვანილია ერთად ყველა კოდი, 155 00:07:32,390 --> 00:07:35,570 და ახლა უკვე ჩაიტვირთება GDB, და ეს მზად ვართ წავიდეთ. 156 00:07:35,570 --> 00:07:37,140 >> ახლა, რა უნდა გავაკეთოთ? 157 00:07:37,140 --> 00:07:39,130 გახსოვთ, თუ რა პირველი ნაბიჯი, როგორც წესი, 158 00:07:39,130 --> 00:07:42,540 მას შემდეგ, რაც მე შიგნით ამ გარემოში? 159 00:07:42,540 --> 00:07:44,540 იმედია, თქვენ განაცხადა მითითებული შესვენების წერტილი, იმიტომ, რომ 160 00:07:44,540 --> 00:07:46,240 ის ფაქტი, რომ ის, რაც მე მინდა. 161 00:07:46,240 --> 00:07:47,990 ახლა, მე არ მაქვს კოდის ეს 162 00:07:47,990 --> 00:07:50,948 ჩემს წინ, რომელიც, სავარაუდოდ, არ არის ტიპიური გამოყენების შემთხვევაში, სხვათა შორის. 163 00:07:50,948 --> 00:07:52,055 თქვენ ალბათ. 164 00:07:52,055 --> 00:07:52,680 ასე რომ, კარგი. 165 00:07:52,680 --> 00:07:55,790 მაგრამ თუ გავითვალისწინებთ, არ, რა არის ერთი ფუნქცია, რომ თქვენ იცით, 166 00:07:55,790 --> 00:07:58,880 არსებობს თითოეული C პროგრამა? 167 00:07:58,880 --> 00:08:04,420 არ აქვს მნიშვნელობა, თუ რამდენად დიდი ან რთული ეს არის, ეს ფუნქცია ნამდვილად არსებობს. 168 00:08:04,420 --> 00:08:05,440 მთავარი, არა? 169 00:08:05,440 --> 00:08:08,870 >> ასე რომ, ვერ რიგში, ჩვენ შეგვიძლია მითითებული შესვენების დროს ძირითადი. 170 00:08:08,870 --> 00:08:12,200 და ისევ, მე შეიძლება მხოლოდ ჩაწერეთ შესვენება მთავარ, ნაცვლად ბ. 171 00:08:12,200 --> 00:08:14,650 და თუ აინტერესებს, თუ ოდესმე ტიპი გრძელი ბრძანება 172 00:08:14,650 --> 00:08:16,800 და მერე ხვდები, რომ თქვენ აკრეფილი არასწორი რამ, 173 00:08:16,800 --> 00:08:18,770 და გსურთ მოშორება ყველა, როგორც მე უბრალოდ გააკეთა, 174 00:08:18,770 --> 00:08:22,029 თქვენ შეგიძლიათ აღებას U, რომელიც წაშლა ყველაფერი და მოუტანს თქვენ უკან 175 00:08:22,029 --> 00:08:23,570 დასაწყისში კურსორი ხაზები. 176 00:08:23,570 --> 00:08:26,569 ბევრი უფრო სწრაფად, ვიდრე უბრალოდ გეჭიროთ წაშლა, ან დარტყმის რამოდენიმე ჯერ 177 00:08:26,569 --> 00:08:27,080 მეტი. 178 00:08:27,080 --> 00:08:28,740 >> ასე რომ, ჩვენ მითითებული შესვენების დროს ძირითადი. 179 00:08:28,740 --> 00:08:32,970 და როგორც ხედავთ, ის ამბობს, რომ ჩვენ მითითებული შესვენების დროს ფაილის buggy1.c, 180 00:08:32,970 --> 00:08:36,330 და როგორც ჩანს, პირველი ხაზი კოდი მთავარი არის ხაზი შვიდი. 181 00:08:36,330 --> 00:08:38,080 ისევ და ისევ, ჩვენ არ გვაქვს წყარო ფაილი აქ, 182 00:08:38,080 --> 00:08:40,429 მაგრამ მე ვივარაუდოთ, რომ ეს მეუბნებოდა სიმართლე. 183 00:08:40,429 --> 00:08:44,510 და მაშინ, მე უბრალოდ ცდილობს და პროგრამის გაშვება, r. 184 00:08:44,510 --> 00:08:45,360 დასაწყისი პროგრამა. 185 00:08:45,360 --> 00:08:48,160 ყველა უფლება, ასე რომ, ეს გაგზავნა ცოტა cryptic. 186 00:08:48,160 --> 00:08:50,160 მაგრამ, ძირითადად, რა არის ხდება აქ არის, ეს მხოლოდ 187 00:08:50,160 --> 00:08:53,350 მეუბნებოდა, მე მოხვდა ჩემი შესვენების წერტილი, შესვენების წერტილი ნომერი 1. 188 00:08:53,350 --> 00:08:55,877 >> და მაშინ, რომ ხაზი კოდი, არსებობს ასეთი ფაილი ან დირექტორია. 189 00:08:55,877 --> 00:08:57,710 ერთადერთი მიზეზი, რომ მე ვხედავ, რომ გაგზავნა 190 00:08:57,710 --> 00:09:00,800 იმიტომ, რომ მე უნებლიედ ამოღებულია ჩემი buggy.c ფაილი. 191 00:09:00,800 --> 00:09:04,050 თუ ჩემი buggy1.c ფაილი არსებობდა მიმდინარე მომსახურება, 192 00:09:04,050 --> 00:09:06,920 რომ ხაზი არ გვინდა რეალურად მეუბნებოდა, თუ რა ხაზი კოდი 193 00:09:06,920 --> 00:09:08,214 ფაქტიურად წერია. 194 00:09:08,214 --> 00:09:09,380 სამწუხაროდ, მე წაშალა ის. 195 00:09:09,380 --> 00:09:14,790 ჩვენ ვაპირებთ, რომ უნდა სახის ნავიგაცია მეშვეობით ეს ცოტა უფრო ბრმად. 196 00:09:14,790 --> 00:09:17,330 >> OK, ასე რომ, ვნახოთ, რა მინდა აქ? 197 00:09:17,330 --> 00:09:21,770 ისე, მინდა იცოდეს, თუ რა ადგილობრივი ცვლადები შესაძლოა ხელმისაწვდომია ჩემთვის. 198 00:09:21,770 --> 00:09:23,570 მე დავიწყე ჩემი პროგრამა. 199 00:09:23,570 --> 00:09:28,515 ვნახოთ, რა შეიძლება იყოს უკვე ინიციალიზაცია ჩვენთვის. 200 00:09:28,515 --> 00:09:31,430 მე აკრიფოთ ინფორმაცია ადგილობრივები, არც ადგილობრივები. 201 00:09:31,430 --> 00:09:33,960 ყველა უფლება, ისე, რომ არ მომეცი ტონა ინფორმაცია. 202 00:09:33,960 --> 00:09:37,600 მე ვერ შეეცდება და ამობეჭდოთ ცვლადი, მაგრამ მე არ ვიცი არც ერთი ცვლადი სახელები. 203 00:09:37,600 --> 00:09:39,930 მე ვერ შეეცდება უკან კვალი, მაგრამ მე შიგნით ძირითადი 204 00:09:39,930 --> 00:09:43,710 მე ვიცი, მე არ გააკეთა სხვა ფუნქცია დარეკეთ ახლავე. 205 00:09:43,710 --> 00:09:47,710 >> ასე რომ, როგორც ჩანს, ჩემი ერთადერთი ვარიანტი არის გამოიყენოს ო ან ასე და დაიწყოს ჩაყვინთვის. 206 00:09:47,710 --> 00:09:49,630 მე ვაპირებ გამოიყენოს ო. 207 00:09:49,630 --> 00:09:51,180 ასე რომ, მე აკრიფოთ n. 208 00:09:51,180 --> 00:09:53,060 ოჰ ღმერთო, რა ხდება აქ. 209 00:09:53,060 --> 00:09:56,260 პროგრამა მიღებული სიგნალების, SIGSEGV სეგმენტაცია ბრალია, 210 00:09:56,260 --> 00:09:57,880 და შემდეგ მთელი bunch of პერსონალი. 211 00:09:57,880 --> 00:09:58,880 მე უკვე overwhelmed. 212 00:09:58,880 --> 00:10:00,980 ისე, იქ ფაქტიურად ბევრი უნდა შეიტყო აქ. 213 00:10:00,980 --> 00:10:02,520 ასე რომ, რას გვეუბნება ეს? 214 00:10:02,520 --> 00:10:09,180 ის, რაც გვეუბნება, ეს პროგრამა შესახებ, მაგრამ ჯერ კიდევ არ არის seg ბრალია. 215 00:10:09,180 --> 00:10:12,550 კერძოდ, მე ვაპირებ მიუახლოვდით კიდევ უფრო აქ, 216 00:10:12,550 --> 00:10:18,980 ეს დაახლოებით seg ბრალია შესახებ რაღაც მოუწოდა strcmp. 217 00:10:18,980 --> 00:10:22,705 >> ახლა, ჩვენ შეიძლება არ განიხილა ამ ფუნქციის ინტენსიურად. 218 00:10:22,705 --> 00:10:25,580 მაგრამ ეს is-- იმიტომ, რომ ჩვენ არ ვაპირებთ ვისაუბროთ ყველა ფუნქცია, რომელიც 219 00:10:25,580 --> 00:10:28,610 არსებობს C სტანდარტული ბიბლიოთეკა მაგრამ ისინი ყველა ხელმისაწვდომი, 220 00:10:28,610 --> 00:10:32,110 კერძოდ, თუ თქვენ მიიღოს შევხედოთ reference.cs50.net. 221 00:10:32,110 --> 00:10:35,000 და strcmp არის მართლაც ძლიერი ფუნქცია, რომელიც არსებობს შიგნით 222 00:10:35,000 --> 00:10:38,070 საქართველოს string.h header ფაილი, რომელიც არის header 223 00:10:38,070 --> 00:10:41,970 ფაილი, რომელიც ეძღვნება ფუნქციების რომ მუშაობა და მანიპულირების სიმები. 224 00:10:41,970 --> 00:10:49,830 >> კერძოდ, რა strcmp არ არის ადარებს ფასეულობები ორი სიმები. 225 00:10:49,830 --> 00:10:54,160 ასე რომ, მე უნდა სეგმენტაცია ბრალია წლის ზარი strcmp ჩანს. 226 00:10:54,160 --> 00:10:58,530 მე მოხვდა n, და, ფაქტობრივად, მივიღებ გაგზავნა, პროგრამა წყდება ერთად სიგნალი SIGSEGV 227 00:10:58,530 --> 00:11:01,370 სეგმენტაცია ბრალია. ასე რომ, ახლა მე რეალურად არ seg გააკრიტიკა, 228 00:11:01,370 --> 00:11:06,479 და ჩემი პროგრამა აქვს საკმაოდ გაცილებით ეფექტურად დათმობა. 229 00:11:06,479 --> 00:11:07,770 ეს არის პროგრამის დასრულების შემდეგ. 230 00:11:07,770 --> 00:11:10,370 ეს ჩაშალეს დაეჯახა. 231 00:11:10,370 --> 00:11:14,740 ასე რომ, არ იყო ბევრი, მაგრამ მე რეალურად არ სწავლობენ საკმაოდ მწირი 232 00:11:14,740 --> 00:11:16,747 ამ პატარა გამოცდილება. 233 00:11:16,747 --> 00:11:17,580 რა ვისწავლე? 234 00:11:17,580 --> 00:11:22,020 ისე, ჩემი პროგრამა ავარია საკმაოდ ბევრი დაუყოვნებლივ. 235 00:11:22,020 --> 00:11:26,300 ჩემი პროგრამა დამსხვრევაზე ზარი stRCMP, მაგრამ მე 236 00:11:26,300 --> 00:11:30,560 არ აქვს რაიმე ადგილობრივი ცვლადები ჩემი პროგრამა იმ დროს, რომ ეს ავარია. 237 00:11:30,560 --> 00:11:37,320 ასე რომ, რა სიმებიანი, ან სიმები, შეიძლება მე შესაძლოა იყოს შედარებით. 238 00:11:37,320 --> 00:11:42,140 თუ მე არ მაქვს რაიმე ადგილობრივი ცვლადები, ალბათ 239 00:11:42,140 --> 00:11:45,520 ვივარაუდოთ, რომ მე ჰქონდეს იქ იქნებ არის გლობალური ცვლადი, რომელიც შეიძლება იყოს ჭეშმარიტი. 240 00:11:45,520 --> 00:11:47,670 >> მაგრამ ზოგადად, როგორც ჩანს, როგორც მე შედარებით 241 00:11:47,670 --> 00:11:52,070 რაღაც რომ არ არსებობს. 242 00:11:52,070 --> 00:11:54,130 მოდით გამოიძიოს რომ ცოტა უფრო. 243 00:11:54,130 --> 00:11:55,120 ამიტომ, მე ვაპირებ გარკვევას ჩემი ეკრანზე. 244 00:11:55,120 --> 00:11:57,536 მე ვაპირებ, რათა გარეთ GDB გარემოს მეორე. 245 00:11:57,536 --> 00:12:01,300 და მე ვფიქრობ, OK, ასე რომ, არსებობს ადგილობრივი ცვლადები ჩემი პროგრამა. 246 00:12:01,300 --> 00:12:06,444 მაინტერესებს, თუ იქნებ მე უნდა გაიაროს სიმებიანი, როგორც ბრძანების არგუმენტი. 247 00:12:06,444 --> 00:12:07,610 მოდით შეამოწმოთ ამ გარეთ. 248 00:12:07,610 --> 00:12:09,020 მე არ კეთდება ეს ადრე. 249 00:12:09,020 --> 00:12:14,244 >> მოდით ვნახოთ, თუ შესაძლოა, თუ მე აწარმოებს ამ პროგრამის ბრძანების არგუმენტი მუშაობს. 250 00:12:14,244 --> 00:12:16,140 არა, არ სეგმენტაცია ბრალია არსებობს. 251 00:12:16,140 --> 00:12:17,870 უბრალოდ მითხრა, რომ მე figured ის. 252 00:12:17,870 --> 00:12:19,170 ასე რომ, შესაძლოა, რომ გადავწყვიტოთ აქ. 253 00:12:19,170 --> 00:12:27,560 და მართლაც, თუ მე დაბრუნდეს და შევხედოთ ფაქტობრივი კოდის buggy1.c, 254 00:12:27,560 --> 00:12:31,180 როგორც ჩანს, თითქოს, რასაც მე ვაკეთებ არის მე მიღების ზარი strcmp გარეშე 255 00:12:31,180 --> 00:12:34,010 შემოწმების თუ არა სინამდვილეში argv [1] არსებობს. 256 00:12:34,010 --> 00:12:36,730 ეს არის რეალურად კოდის buggy1.c. 257 00:12:36,730 --> 00:12:38,855 ასე რომ, რაც მე ნამდვილად უნდა გავაკეთოთ აქ დაფიქსირება ჩემი პროგრამა, 258 00:12:38,855 --> 00:12:40,835 ვთქვათ, მე მაქვს შეიტანოს ჩემს წინ, არის 259 00:12:40,835 --> 00:12:44,740 უბრალოდ დაამატოთ გამშვები რათა დარწმუნებული ვარ, რომ argc უდრის 2. 260 00:12:44,740 --> 00:12:47,780 ასე რომ, ეს, მაგალითად, ერთხელ, როგორც ვთქვი, ცოტა contrived, არა? 261 00:12:47,780 --> 00:12:49,840 თქვენ ზოგადად არ აპირებს შემთხვევით წაშალოთ თქვენი კოდის 262 00:12:49,840 --> 00:12:51,820 და მაშინ უნდა ვეცადოთ და გამართვისა პროგრამა. 263 00:12:51,820 --> 00:12:53,120 მაგრამ იმედია, რომ მისცა თქვენ ილუსტრაცია 264 00:12:53,120 --> 00:12:55,120 სახის რამ, რომ თქვენ შეიძლება ფიქრი 265 00:12:55,120 --> 00:12:56,610 როგორც თქვენ გამართვის თქვენი პროგრამა. 266 00:12:56,610 --> 00:12:58,760 >> რა არის სახელმწიფოს საქმეებში აქ? 267 00:12:58,760 --> 00:13:00,510 რა ცვლადები მე გაქვთ ჩემთვის? 268 00:13:00,510 --> 00:13:03,600 სად არის ჩემი პროგრამა crashing, რა ხაზი, 269 00:13:03,600 --> 00:13:05,240 თუ რა ზარი რა ფუნქცია? 270 00:13:05,240 --> 00:13:06,952 რა სახის clues, რომ ჯერ მომეცი? 271 00:13:06,952 --> 00:13:08,910 და სწორედ სახის აზროვნების, რომ თქვენ 272 00:13:08,910 --> 00:13:12,820 უნდა მისაღებად შევიდა, როდესაც თქვენ ფიქრი გამართვის თქვენი პროგრამებს. 273 00:13:12,820 --> 00:13:13,820 >> მე Doug Lloyd. 274 00:13:13,820 --> 00:13:16,140 ეს არის CS50. 275 00:13:16,140 --> 00:15:08,642