gcc命令
预处理阶段$ gcc -E hello.c -o hello.i
编译阶段$ gcc -S hello.i -o hello.s
汇编阶段$ gcc -c hello.s -o hello.o
链接阶段$ gcc hello.o -o hello
-g
生成调试信息,GNU调试器可以利用该信息。gcc编译器使用该选项进行编译时,将调试信息加入目标文件当中,这样GDB调试器就可以根据这些调试信息来跟踪程序的执行状态
编译多个头文件和源文件
方法一:分步处理
由c1.c生成目标文件c1.o$ gcc -c c1.c -o c1.o
由c2.c生成目标文件c2.o$ gcc -c c2.c -o c2.o
由两个目标文件生成程序$ gcc c1.o c2.o -o m1
方法二:同时处理
直接使用源代码来编译$ gcc c1.c c2.c -o m2
GDB调试
语法$ gdb [参数] filename
-symbols = file
-
-s file
:读出文件(file)的所有符号
-core
-
-c
:这里的core是程序非法执行后的core dump后产生的文件
-directory
-
-d
:加入一个源文件的搜索路径。默认搜索路径是环境变量中PATH所定义的路径
quiet
-
q
:使用该参数不显示gdb的介绍和版权信息等
- gdb命令
- file:指定要调试的可执行程序
- kill:终止正在调试的可执行程序
- next:执行一行源代码,但不进入函数内部
- list:部分列出源代码
- step:执行一行源代码,并不进入函数内部
- quit:结束gdb调试任务
- watch:可以检查一个变量的值,而不管他何时被改变
- print:打印表达式的值到标准输出
- break N:在指定的第N行源代码设置断点
- break funcname
- break filename:linenum
- break filename:funcname
- info break:显示当前的断点清单,包括到达断点处的次数等
- info files:显示被调试的详细信息
- info func:显示所有的函数名
- info local:显示当函数中的局部变量的信息
- info prog:显示被调试程序的执行状态
- info var:显示所有的全局和静态变量的名称
- make:在不退出gdb的情况下运行make工具
- shell:在不退出gdb的情况下运行shell命令
- continue:继续执行正在调试的程序
- r:运行被调试的程序。如果之前没有设过断点,则执行完整个程序;如果设过断点,则程序停在第一个断点处。
- c:继续执行被调试程序,直到到下一个断点,或程序整体结束。
- b:设置断点,包括以下几种:
- b <行号> // 停在程序的指定一行
- b <函数名称> // 停在程序的某个函数处
- b *<函数名称> // 停在编译器生成的prolog代码处。主要用于汇编调试
- b *<代码地址> // 停在代码的某个地址处
- d <编号> // 删除断点
- info b // 查看断点
- s:执行一行源程序的代码,如果此行代码中存在函数调用,则进入该函数。
- n:执行一行源程序的代码,此代码中的函数调用执行完成。
- si:类似于s命令,不同的是,si针对的是汇编指令,而s针对的是源代码。
- ni:类似于n命令,不同的是,ni针对的也是汇编指令,而n针对的是源代码。
- p/print:打印指定变量(临时变量和全局变量)、字符串、表达式等值。
- display …:设置程序中断后想显示的数据及其格式。如希望程序中断后显示即将被执行的下一条汇编指令,可使用如下命令:display /i pc,其中pc,其中pc指当前汇编指令,/i指十六进制显示。
- undisplay <编号>:取消先前的display设置,编号从1开始递增。
- i/info:显示各类信息。
- q:退出gdb调试环境。
- help [命令名称]:gdb帮助命令,提供对GDB各种命令的解释说明。如果指定了“命令名称”参数,则显示该命令的详细说明;若果没有指定参数,则分类显示所有GDB命令,共用户进一步浏览和查询。
- cd dir:运行GDB,使用dir作为gdb的工作目录。
- se File:从File读取符号表并把它作为可执行文件。
- -write:开通enable往可执行文件和核心文件写的权限。
- clear:删除一个断点,这个命令需指定代行或者函数名。
- set:设置变量的值。如set val = 2即为把2保存到val变量中;设置输入参数使用set args a b c(a,b,c分别为对应输入参数)。
- watch:监视一个变量的值,不管它何时被改变。
- rwatch:指定一个变量,如果这个变量被读,则暂停程序运行,在调试器中显示信息,并等待下一个命令调试。
- Ctrl + c:在当前位置停止执行正在执行的程序,断点在当前行。
- ptype:显示变量的类型
- return:强制从当前函数返回。
- whatis:显示变量的值和类型。
- xbreak:在当前函数的退出的点上设置一个断点。
- load:动态加载一个可执行文件到调试器。
- ignore:忽略某个断点指定的次数。
- finish:继续执行,直到当前函数返回。
- disable:禁止断点功能,这个命令需要禁止的断点在断点列表索引值作为参数。
- bt:显示程序堆栈信息。
- l:l相当于list,从第一行开始列出源码。