linux、GCC、GDB学习总结

  • 格式:doc
  • 大小:544.00 KB
  • 文档页数:7

下载文档原格式

  / 7
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1 虚拟机VMware6.5、RedHat安装及Linux基本命令

1.1 GCC、GDB的安装

虚拟将上安装RedHat后,在Linux环境下编辑和编译C\C++需要GCC、GDB编译,调试,Linux环境下输入gcc -v于gdb –v可以查看所装系统是否装有gcc与gdb。如果没有显示其所装版本,可以在Redhat 的RPMs包中找到相应版本的gcc与gdb的rmp安装文件。具体方法是vm->Removable Devices->CD\DVD->Connect.

把RedHat的镜像文件添加到use iso image file:下,点击OK,在VMware界面上出现以个光盘的标志双击后RedHat->RAMPS,选择要安装的GCC、与GDB文件。

注:不能直接用GCC变异C++文件,最好使用G++编译。

1.2 Linux基本命令

Linux常用命令全集:/special/linuxcom/

2 GCC、GDB的使用及基本指令

2.1 Linux环境下vi编辑器的基本使用方法

VMware界面上右键->open terminal

界面中输入vi 回车([jkl@localhost ~]$ vi)

在vi编辑器下输入要编辑的程序:

#include

int wib(int no1, int no2)

{

int result, diff;

diff = no1 - no2;

result = no1 / diff;

return result;

}

int main(int argc, char *argv[])

{

int value, div, result, i, total;

value = 10;

div = 6;

total = 0;

for(i = 0; i < 10; i++)

{

result = wib(value, div);

total += result;

div++;

value--;

}

printf("%d wibed by %d equals %d\n", value, div, total);

return 0;

vi环境下输入模式与指令模式的切换键是Esc,当左下角出现--INSERT--时可以对程序进行编辑。按下Esc后,可以输入vi指令,会在窗口最下一行显示,

在指令模式下输入“:wq eg.c”保存并退出

Vi编辑器的常用命令:/view/42fb3fc69ec3d5bbfd0a74fa.html

2.2 GDB的使用

在保存eg.c的目录下输入ls ([jkl@localhost test]$ ls) 会看见目录下的所有文件,此时会看见文件”eg.c”输入gcc -g -o eg eg.c ([jkl@localhost test]$ gcc -g -o eg eg.c)生成目标文件

再次输入ls ([jkl@localhost test]$ ls)此时会看见文件”eg”

输入gdb eg 启动gdb

可以对程序进行调试

输入list 1开始从第一行开始打印程序列表

使用'run' 运行程序可能会产生以下消息:

Program received signal SIGFPE, Arithmetic exception.

0x80483ea in wib (no1=8, no2=8) at eg1.c:7

7 result = no1 / diff;

(gdb)

gdb 指出在程序第 7 行发生一个算术异常,通常它会打印这一行以及 wib() 函数的自变量值。要查看第7 行前后的源代码,请使用 'list' 命令,它通常会打印 10 行。再次输入 'list'(或者按回车重复上一条命令)将列出程序的下 10 行。从 gdb 消息中可以看出,第 7 行中的除法运算出了错,程序在这一行中将变量 "no1" 除以 "diff"。

要查看变量的值,使用 gdb 'print' 命令并指定变量名。输入 'print no1' 和 'print diff',可以相应看到 "no1" 和 "diff" 的值,结果如下:

(gdb) print no1

$5 = 8

(gdb) print diff

$2 = 0

gdb 指出 "no1" 等于 8,"diff" 等于 0。根据这些值和第 7 行中的语句,我们可以推断出算术异常是由除数为 0 的除法运算造成的。清单显示了第 6 行计算的变量 "diff",我们可以打印 "diff" 表达式(使用 'print no1 - no2' 命令),来重新估计这个变量。gdb 告诉我们 wib 函数的这两个自变量都等于 8,于是我们要检查调用 wib() 函数的 main() 函数,以查看这是在什么时候发生的。在允许程序自然终止的同时,我们使用 'continue' 命令告诉 gdb 继续执行。

(gdb) continue

Continuing.

Program terminated with signal SIGFPE, Arithmetic exception.

The program no longer exists.

可以在程序代码中的某一特定行或函数中设置断点,这样 gdb 会在遇到断点时中断执行。可以使用命令'break main' 在进入 main() 函数时设置断点,或者可以指定其它任何感兴趣的函数名来设置断点。然而,我们只希望在调用 wib() 函数之前中断执行。输入 'list main' 将打印从 main() 函数开始的源码清单,再次按回车将显示第 21 行上的 wib() 函数调用。要在那一行上设置断点,只需输入 'break 21'。gdb 将发出以下响应:

(gdb) break 21

Breakpoint 1 at 0x8048428: file eg1.c, line 21.

以显示它已在我们请求的行上设置了 1 号断点。'run' 命令将从头重新运行程序,直到 gdb 中断为止。发生这种情况时,gdb 会生成一条消息,指出它在哪个断点上中断,以及程序运行到何处:

Breakpoint 1, main (argc=1, argv=0xbffff954) at eg1.c:21

21 result = wib(value, div);

发出 'print value' 和 'print div' 将会显示在第一次调用 wib() 时,变量分别等于 10 和 6,而

'print i' 将会显示 0。幸好,gdb 将显示所有局部变量的值,并使用 'info locals' 命令保存大量输入信息。

现在已完成了调试,可以使用 'quit' 命令退出 gdb。由于程序仍在运行,这个操作会终止它,gdb 将提示您确认。

●更多断点和观察点

由于我们想要知道在调用 wib() 函数之前 "value" 什么时候等于 "div",因此在上一示例中我们在第

21 行中设置断点。我们必须继续执行两次程序才会发生这种情况,但是只要在断点上设置一个条件就可以使 gdb 只在 "value" 与 "div" 真正相等时暂停。要设置条件,可以在定义断点时指定 "break if "。将 eg1 再次装入 gdb,并输入:

(gdb) break 21 if value==div

Breakpoint 1 at 0x8048428: file eg1.c, line 21.

如果已经在第 21 行中设置了断点,如 1 号断点,则可以使用 'condition' 命令来代替在断点上设置条件: