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 ดีบักเกอร์ 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 อาจจะเป็นความลับนิด ๆ หน่อย ๆ 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 ถ้าคุณไม่ได้ใช้กราฟิก ดีบักซึ่งเพื่อนร่วมงานของฉันแดน 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 บางทีอาจจะใช้รุ่น ของ 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 แต่อีกครั้งถ้าคุณ โดยใช้ IDE CS50 คุณ 25 00:01:09,650 --> 00:01:15,400 สามารถใช้กราฟิกดีบัก ที่สร้างไว้ในการ 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 ดังนั้นสำหรับตัวอย่างเช่นถ้าโปรแกรมของคุณ สวัสดีคุณจะพิมพ์ GDB สวัสดี 30 00:01:28,620 --> 00:01:31,210 >> เมื่อคุณทำเช่นนั้นคุณจะ เพื่อดึงสภาพแวดล้อม GDB 31 00:01:31,210 --> 00:01:33,800 ให้คุณจะเปลี่ยนแปลงและ แทนที่จะเป็นสิ่งที่มันมักจะ 32 00:01:33,800 --> 00:01:35,841 คือเมื่อคุณพิมพ์สิ่งที่ ที่ line-- คำสั่งคำสั่ง 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 และหลังจากที่คุณพิมพ์ B, คุณมักจะ พิมพ์ชื่อของฟังก์ชั่น 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 สิ่ง B, หรือทำลายไม่ มันช่วยให้โปรแกรมของคุณ 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 โดยปกติแล้วคุณพิมพ์เฉือนจุดสิ่งที่ ชื่อของโปรแกรมของคุณคือกด 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 และจากนั้นแทน การดำน้ำในฟังก์ชั่นที่ 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 หรือถ้าคุณกำลังทำงานอยู่แล้วคุณสามารถ ใช้ที่จะก้าวไปข้างหน้าหนึ่งบรรทัดของรหัส 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 คุณสามารถพิมพ์พีหรือพิมพ์ แล้วชื่อตัวแปร 86 00:04:12,507 --> 00:04:15,090 และที่จะพิมพ์ออกมาให้คุณ ภายในสภาพแวดล้อม GDB, 87 00:04:15,090 --> 00:04:19,110 ชื่อของตัวแปรที่ you-- แก้ตัว me-- ค่าของตัวแปรที่ 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 มันมากเร็วกว่า พิมพ์หน้าแล้วอะไรก็ตาม 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 ถัดลงมาเป็นบาทซึ่งเป็น สั้นกลับ Trace 95 00:04:37,770 --> 00:04:41,680 ตอนนี้โดยทั่วไป โดยเฉพาะอย่างยิ่งในช่วงต้น CS50, 96 00:04:41,680 --> 00:04:44,450 คุณจะไม่ได้จริงๆมีโอกาส ใช้บาทหรือกลับติดตาม 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 ฉซึ่งเรียกฟังก์ชั่น กรัมซึ่งเรียกชั่วโมงฟังก์ชั่น 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-- คุณสามารถพิมพ์บาทหรือร่องรอยกลับ 111 00:05:27,210 --> 00:05:32,370 และมันจะพิมพ์ออกมาชมกรัมฉหลัก พร้อมกับบางส่วนข้อมูลอื่น ๆ ซึ่ง 112 00:05:32,370 --> 00:05:35,984 ช่วยให้คุณมีเบาะแสว่าหลักตกลง เรียกฉฉเรียกกรัมกรัมเรียกว่าเอช 113 00:05:35,984 --> 00:05:37,900 และนั่นคือสิ่งที่ฉัน ขณะนี้ผมอยู่ในโปรแกรมของฉัน 114 00:05:37,900 --> 00:05:41,380 ดังนั้นจึงจะมีประโยชน์จริงๆ โดยเฉพาะอย่างยิ่งเป็นความลับ-Ness ของ 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 คุณสามารถพิมพ์คิวหรือเลิกที่จะได้รับการออก 120 00:05:55,500 --> 00:05:59,220 ตอนนี้ก่อนที่วิดีโอวันนี้ ฉันเตรียมโปรแกรมรถม้าชนิดเล็ก 121 00:05:59,220 --> 00:06:03,900 เรียกว่า buggy1 ซึ่งผมรวบรวม จากไฟล์ที่เรียกว่า buggy1.c 122 00:06:03,900 --> 00:06:06,500 ในขณะที่คุณอาจคาดหวังนี้ โปรแกรมในความเป็นจริงรถ 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 ดังนั้นขอให้ตรงไปที่ IDE CS50 และได้ดู 131 00:06:30,740 --> 00:06:33,155 ตกลงดังนั้นเราอยู่ที่นี่ในของฉัน CS50 สภาพแวดล้อม IDE, 132 00:06:33,155 --> 00:06:35,697 และฉันจะซูมเข้านิด ๆ หน่อย ๆ เพื่อให้คุณสามารถมองเห็นน้อยมาก 133 00:06:35,697 --> 00:06:38,530 ในหน้าต่าง terminal ของฉันหากฉันรายการ เนื้อหาของกรรมการปัจจุบันของฉัน 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 ฉันพิมพ์เฉือนจุด รถและผมกด Enter 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 แล้วฉันแค่พยายาม และเรียกใช้โปรแกรมอาร์ 184 00:08:44,510 --> 00:08:45,360 โปรแกรมเริ่มต้น 185 00:08:45,360 --> 00:08:48,160 สิทธิทั้งหมดเพื่อให้ข้อความนี้ เป็นเพียงเล็กน้อยที่เป็นความลับ 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 >> ตกลงดังนั้นเรามาดูสิ่งที่ ฉันต้องการที่จะทำที่นี่? 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 >> ดังนั้นดูเหมือนว่าตัวเลือกเดียวของฉันเป็น ที่จะใช้หรือเพื่อให้ n และเริ่มที่จะดำน้ำใน 206 00:09:47,710 --> 00:09:49,630 ฉันจะใช้ n 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 และจากนั้นทั้งกลุ่มของสิ่งที่ 211 00:09:57,880 --> 00:09:58,880 ฉันจมอยู่แล้ว 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 ที่มีอยู่ในมาตรฐานซี library-- แต่พวกเขากำลังทั้งหมดที่มีให้คุณ 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 ส่วนหัวของสตริง ไฟล์ซึ่งเป็นส่วนหัว 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 คาดการณ์ว่าฉัน have-- อาจจะมีเป็น ตัวแปรทั่วโลกซึ่งอาจจะเป็นจริง 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 และฉันคิดว่าตกลงเพื่อให้มี ไม่มีตัวแปรท้องถิ่นในโปรแกรมของฉัน 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 มันก็บอกว่าฉันคิดออก 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 ดังนั้นตัวอย่างนี้อีกครั้งเหมือนที่ผมกล่าวว่า เป็นนิด ๆ หน่อย ๆ ที่วางแผนไว้ใช่มั้ย? 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 ที่ว่าเป็นโปรแกรมของฉัน ล้มเหลวในสิ่งที่บรรทัด 269 00:13:03,600 --> 00:13:05,240 ในสิ่งที่เรียกร้องให้ฟังก์ชั่นอะไร? 270 00:13:05,240 --> 00:13:06,952 ชนิดของปมที่ไม่ให้ฉัน? 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 >> ฉันลอยด์ดั๊ก 274 00:13:13,820 --> 00:13:16,140 นี่คือ CS50 275 00:13:16,140 --> 00:15:08,642