From c349a72b82c40a00993aca391737d93b4de1da7a Mon Sep 17 00:00:00 2001 From: zhangbo <1224680008@qq.com> Date: Sun, 22 Jan 2017 22:32:52 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AF=91=E8=80=85=E6=A0=A1=E6=AD=A3=E5=AE=8C?= =?UTF-8?q?=E6=AF=95=EF=BC=8C=E5=BE=85=E6=A0=A1=E5=AF=B9=E4=BA=BA=E6=A0=A1?= =?UTF-8?q?=E5=AF=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ... to debug C programs in Linux using gdb.md | 29 +++++++++---------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/translated/tech/20170116 How to debug C programs in Linux using gdb.md b/translated/tech/20170116 How to debug C programs in Linux using gdb.md index 11be8608ac..79d1f510d2 100644 --- a/translated/tech/20170116 How to debug C programs in Linux using gdb.md +++ b/translated/tech/20170116 How to debug C programs in Linux using gdb.md @@ -1,5 +1,3 @@ -Translating by zhb127 -How to debug C programs in Linux using gdb 在 Linux 中如何使用 gdb 调试 C 程序 ============================================================ @@ -9,15 +7,15 @@ How to debug C programs in Linux using gdb 2. [GDB 调试器用例][2] 3. [总结][3] -无论你是一名多么有经验的程序员,你开发的任何软件都不可能完全没有 bug。因此,排查及修复 bug 成为软件开发周期中最重要的任务之一。虽然,有许多办法可以排查 bug(测试、代码自审等等),但是有一些专用软件(称为调试器)可以帮你清楚了解问题的所在,以便你可以轻松解决问题。 +无论你是多么有经验的程序员,你开发的任何软件都不可能完全没有 bug。因此,排查及修复 bug 成为软件开发周期中最重要的任务之一。虽然,有许多办法可以排查 bug(测试、代码自审等等),但是有一些专用软件(称为调试器)可以帮你准确定位问题的所在,以便你轻松解决问题。 -如果你是一名 C/C++ 程序员或者你使用 Fortran 和 Modula-2 编程语言开发软件,那么你将会很乐意知道有这么一款优秀的调试器 -[GDB][4]- 可以帮你轻松调试代码 bug 及其他问题。在这篇文章中,我们将讨论一下 GDB 调试器的基础知识,包括它提供的一些有用的特性/选项。 +如果你是 C/C++ 程序员或者你使用 Fortran 和 Modula-2 编程语言开发软件,那么你将会很乐意知道有这么一款优秀的调试器 -[GDB][4]- 可以帮你更轻松地调试代码 bug 以及其它问题。在这篇文章中,我们将讨论一下 GDB 调试器的基础知识,包括它提供的一些有用的功能/选项。 -在我们开始之前,值得一提的是,文章中的所有说明和示例都已经在 Ubuntu 14.04LTS 中测试过。教程中的示例代码都是 C 语言编写的;使用的 shell 为 bash(4.3.11);GDB 版本为 7.7.1。 +在我们开始之前,值得一提的是,文章中的所有说明和示例都已经在 Ubuntu 14.04LTS 中测试过。教程中的示例代码都是 C 语言写的;使用的 shell 为 bash(4.3.11);GDB 版本为 7.7.1。 ### GDB 调试器基础 -通俗的讲,GDB 可以让你看到程序在执行时的内部过程,并帮你明确问题的所在。我们将在下一节通过一个有效的示例来讨论 GDB 调试器的用法,但在此之前,我们先来探讨一些之后对你有帮助的基本要点。 +通俗的讲,GDB 可以让你看到程序在执行过程时的内部流程,并帮你明确问题的所在。我们将在下一节通过一个有效的示例来讨论 GDB 调试器的用法,但在此之前,我们先来探讨一些之后对你有帮助的基本要点。 首先,为了能够顺利使用类似 GDB 这样的调试器,你必须以指定的方式编译程序,让编译器产生调试器所需的调试信息。例如,在使用 gcc 编译器(我们将在本教程之后的章节用它来编译 C 程序示例)编译代码的时候,你需要使用 -g 命令行选项。 @@ -32,13 +30,13 @@ sudo apt-get install gdb 在其他发行版上的安装方法,请看[这里][6]。 -现在,当你按照上述的方式编译完程序(gcc -g 命令行选项),同时也已经安装了 GDB 调试器,那么你就可以使用以下命令让程序在调试模式中运行: +现在,当你按照上述的方式编译完程序(gcc -g 命令行选项),同时也已经安装好 GDB 调试器,那么你就可以使用以下命令让程序在调试模式中运行: ``` gdb [prog-executable-name] ``` -虽然这样做会初始化 GDB 调试器,但你的可执行程序还不会被启动。在这个时候你就可以定义调试相关的设置。例如,你可以在特定行或函数中设置一个断点让 GDB 暂停程序的执行。 +虽然,这样做会初始化 GDB 调试器,但你的可执行程序还不会被启动。在这个时候你就可以定义调试相关的设置。例如,你可以在特定行或函数中设置一个断点让 GDB 暂停程序的执行。 接着,为了启动你的程序,你必须执行以下 gdb 命令: @@ -56,7 +54,7 @@ GDB 提供了很多有用的命令,在调试的时候总是能派的上用场 ### GDB 调试器用例 -现在我们对 GDB 及其用法有了基本的概念。因此,让我们举例来应用所学的知识。这是一个示例代码: +现在我们对 GDB 及其用法有了基本的概念。因此,让我们举例来应用所学的知识。这是一段示例代码: ``` #include @@ -99,8 +97,7 @@ gcc -g -Wall gdb-test.c -o gdb-test gdb ./gdb-test  ``` -Now, the error I am getting is 'floating point exception,' and as most of you might already know, it's caused by n % x, when x is 0\. So, with that in mind, I put a break point at line number 11, where the division is taking place. This was done in the following way: -现在,我刚才得到的错误是 `Floating point exception`,大部分人可能已经知道,这是因为 n%x,当 x 为 0 时导致的错误。所以,考虑到这一点,我在 11 行代码除法运算位置处添加了一个断点。如下: +现在,因为我刚才得到的错误是 `Floating point exception`,大部分人可能已经知道,这是因为 n%x,当 x 为 0 时导致的错误。所以,考虑到这一点,我在 11 行代码除法运算的位置处添加了一个断点。如下: ``` (gdb) **break 11** @@ -108,7 +105,7 @@ Now, the error I am getting is 'floating point exception,' and as most of you mi 注意 `(gdb)` 是调试器的提示信息,我只输入了 `break 11` 命令。 -现在,让 GDB 开始执行程序: +现在,让 GDB 开始运行程序: ``` run @@ -122,7 +119,7 @@ Breakpoint 1, main () at gdb-test.c:11 (gdb) ``` -正如你所看到的,调试器会显示断点所在的行代码。现在,让我们打印出此时 `out` 的值。如下: +正如你所看到的那样,调试器会显示断点所在的行代码。现在,让我们打印出此时 `out` 的值。如下: ``` (gdb)** print out** @@ -130,7 +127,7 @@ Breakpoint 1, main () at gdb-test.c:11 (gdb) ``` -如上所示,值 `5` 被打印出来了。所以,这个时候一切还是正常的。让调试器继续执行程序直到命中下一个断点,可以通过使用 `c` 命令来完成: +如上所示,值 `5` 被打印出来了。这个时候一切都还是正常的。让调试器继续执行程序直到命中下一个断点,可以通过使用 `c` 命令来完成: ``` c   @@ -156,7 +153,7 @@ $3 = 0 (gdb) ``` -现在,为了进一步确认问题,我使用 GDB 的 `s`(或 `step`) 命令代替 `c` 命令。因为,我只想让当前程序一直执行到第 11 行之后暂停,再执行,看看这个时候是否发生崩溃。 +现在,为了进一步确认问题,我使用 GDB 的 `s`(或 `step`) 命令代替 `c` 命令。因为,我只想让当前程序在第 11 行之后暂停,再一步步执行,看看这个时候是否会发生崩溃。 以下是执行之后输出信息: @@ -168,7 +165,7 @@ Program received signal SIGFPE, Arithmetic exception. 11 tot = tot + 0xffffffff/out; ``` -是的,如上高亮输出的内容所示,这就是抛出异常的地方。当我再次尝试运行 `s` 命令时,问题最终也得到确认: +是的,如上高亮输出的内容所示,这就是抛出异常的地方。当我再次尝试运行 `s` 命令时,问题最终也得到了确认: ``` (gdb) s