snifer

【原创】说说GCC 与GDB那些事

0
阅读(1926)

很多同学学嵌入式经常会遇到GDB与GCC的问题,我今天给大家谈谈GCC与GDB那些事。

一、gcc

gcc 是GNU 的C 和C++ 编译器,它是Linux 中最重要的软件开发工具。实际上,gcc 能够编译三种语言:C、C++ 和Object C(C 语言的一种面向对象扩展)。利用gcc 命令可同时编译并连接C 和C++ 源程序。汇编语言的编译器为as。编译器被成功的移植到不同的处理器平台上。标准PC LINUX 上的gcc 是FOR INTEL CPU 的,而ARM 系列开发套件使用的是FOR arm 系列处理器的gcc 编译器arm-elf-gcc 和arm-elf-as 及其相应的GNUBinutils 工具集(如ld 链接工具,objcopy、objdump 等工具)。

gcc 命令的常用选项有:

-ansi 只支持ANSI 标准的C 语法。这一选项将禁止GNU C 的某些特色,

例如asm 或typeof 关键词。

-c 只编译并生成目标文件。

-DMACRO 以字符串“1”定义MACRO 宏。

-DMACRO=DEFN 以字符串“DEFN”定义MACRO 宏。

-E 只运行C 预编译器。

-g 生成调试信息。GNU 调试器可利用该信息。

-IDIRECTORY 指定额外的头文件搜索路径DIRECTORY。

-LDIRECTORY 指定额外的函数库搜索路径DIRECTORY。

-lLIBRARY 连接时搜索指定的函数库LIBRARY。

-m486 针对486 进行代码优化。

-o FILE 生成指定的输出文件。用在生成可执行文件时。

-O0 不进行优化处理。

-O 或-O1 优化生成代码。

-O2 进一步优化。

-O3 比-O2 更进一步优化,包括inline 函数。

-shared 生成共享目标文件。通常用在建立共享库时。

-static 禁止使用共享连接。

-UMACRO 取消对MACRO 宏的定义。

-w 不生成任何警告信息。

-Wall 生成所有警告信息。

ld 文件

编译完成之后,就要执行ld 进行链接。ld 工具处理ld 文件。ld 文件采用AT&T 链

接命令语言写成,用于控制整个链接过程。

二、gdb

Linux 包含了一个叫gdb 的GNU 调试程序. gdb 是一个用来调试C 和C++ 程序的强力调试器. 它使你能在程序运行时观察程序的内部结构和内存的使用情况. Gdb 功能非常强大:

可监视程序中变量的值.

可设置断点以使程序在指定的代码行上停止执行.

支持单步执行等

在命令行上键入gdb 并按回车键就可以运行gdb 了, 如果一切正常的话, gdb 将被启动并且你将在屏幕上看到类似的内容:

GNU gdb Red Hat Linux 7.x (5.0rh-15) (MI_OUT)

Copyright 2001 Free Software Foundation, Inc.

GDB is free software, covered by the GNU General Public License, and

you are

welcome to change it and/or distribute copies of it under certain

conditions.

Type "show copying" to see the conditions.

There is absolutely no warranty for GDB. Type "show warranty" for

details.

This GDB was configured as "i386-redhat-linux".

(gdb)

当你启动gdb 后, 你能在命令行上指定很多的选项. 你也可以以下面的方式来运行gdb :

gdb

当你用这种方式运行gdb , 你能直接指定想要调试的程序. 这将告诉gdb 装入名为fname 的可执行文件. 你也可以用gdb 去检查一个因程序异常终止而产生的core 文件, 或者与一个正在运行的程序相连. 你可以参考gdb 指南页或在命令行上键入gdb -h 得到一个有关这些选项的说明的简单列表.

为了使gdb 正常工作, 你必须使你的程序在编译时包含调试信息. 调试信息包含你程序里的每个变量的类型和在可执行文件里的地址映射以及源代码的行号. gdb 利用这些信息使源代码和机器码相关联.

在编译时用-g 选项打开调试选项.gdb 支持很多的命令使你能实现不同的功能. 这些命令从简单的文件装入到允许你检查所调用的堆栈内容的复杂命令, 表27.1 列出了你在用gdb 调试时会用到的一些命令. 想了解gdb 的详细使用请参考gdb 的指南页.

gdb 的常用命令

break NUM 在指定的行上设置断点。

bt 显示所有的调用栈帧。该命令可用来显示函数的调用顺序。

clear 删除设置在特定源文件、特定行上的断点。其用法为:clear FILENAME:NUM。

continue 继续执行正在调试的程序。该命令用在程序由于处理信号或断点而

导致停止运行时。

display EXPR 每次程序停止后显示表达式的值。表达式由程序定义的变量组成。

file FILE 装载指定的可执行文件进行调试。

help NAME 显示指定命令的帮助信息。

info break 显示当前断点清单,包括到达断点处的次数等。

info files 显示被调试文件的详细信息。

info func 显示所有的函数名称。

info local 显示当函数中的局部变量信息。

info prog 显示被调试程序的执行状态。

info var 显示所有的全局和静态变量名称。

kill 终止正被调试的程序。

list 显示源代码段。

make 在不退出gdb 的情况下运行make 工具。

next 在不单步执行进入其他函数的情况下,向前执行一行源代码。

print EXPR 显示表达式EXPR 的值。

gdb 支持很多与UNIX shell 程序一样的命令编辑特征.

bash 或tcsh 里那样按Tab 键让gdb 帮你补齐一个唯一的命令, 如果不唯一的话gdb

会列出所有匹配的命令. 你也能用光标键上下翻动历史命令.

这些明白了这二者的区别了吧!