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 但同样,如果你 使用CS50 IDE,你 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 >> 第一个是b,即 短暂的休息。 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 通常情况下,你键入点斜线什么 你的程序的名称,敲回车, 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 或者,如果你已经在运行,你可以 使用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 的变量的名称,即你 - 原谅我 - 的变量的值 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 接下来是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,这个调用一个函数 克,它调用一个函数h。 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 你知道你的内 h的,但你忘了 110 00:05:21,640 --> 00:05:27,210 关于什么让你到你 are--您可以键入BT或回溯追踪, 111 00:05:27,210 --> 00:05:32,370 它会打印出H,G,F为主, 沿着一些其它的信息,这 112 00:05:32,370 --> 00:05:35,984 为您提供了一个线索,确定主 所谓的F,F称为G,G称为H, 113 00:05:35,984 --> 00:05:37,900 而这也正是我 目前我在我的计划。 114 00:05:37,900 --> 00:05:41,380 因此,它可以是真正有用的, 尤其是在神秘的烦躁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 现在,今天的视频前 我准备了一个错误的程序 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 因此,让我们头以上 CS50 IDE,看一看。 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 在我的终端窗口中,如果我列出 我的现任董事的内容 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 I型点斜线, 越野车,和我打回车键。 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 再次,我可以只输入 打破代替b为主。 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 I型信息当地人,没有本地人。 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 它告诉我们的是,这个计划是 约而至,但还没有,赛格故障。 215 00:10:09,180 --> 00:10:12,550 特别是,我要去 放大甚至进一步这里, 216 00:10:12,550 --> 00:10:18,980 它是关于赛格故障有关 所谓的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标准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 该文件string.h头的 文件,这是一个标头 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 段故障。所以,现在 其实,我赛格故障, 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 而且我想,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 它只是告诉我,我想它了。 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