makefile和gdb的使用

时间:2022-08-18 00:17:48

一、make工具和makefile文件

 

1.显示规则

 

【语法】

target: prerequisites...

         [tab]command

Tips:可以有多行命令。同一行多命令需要用&&或者;连接,\续行。cd只影响所在的命令行。

依赖关系:

e.g:hello:hello.c

or:hello:hello.o

hello.o:hello.c

编译命令:

e.g:[tab]gcc hello.c -o hello

Tips:修改源文件后用make更新。

all: 依赖文件

Tips:makefile只执行第一个目标,所以将all设为第一个目标。

include包含文件。

 

命令:make

【功能】在当前文件夹下寻找“makefile”文件

【选项】-f:指定使用文件

命令:make clean

【功能】清除文件

clean:

         rm-f *~ ...

命令:make install

【功能】下载

动作:

install:

         mvxxx /bin

 

2.隐晦规则

 

后缀规则:

.c.o:

         gcc-c $<

模式规则:

%.o:%.c

         gcc$(CFLAGS) -c $<

 

3.变量定义

 

定义:object = filename.c/.o...

引用:$(object)访问

Tips:${}引用的是环境变量。

 

4.编写makefile进行编译

 

 

二、GDB调试

 

1. gdb命令

启动:gdb filename.out

run

运行

n/next

单步运行,到下一行

kill

停止调试

q/quit

退出调试

help

显示命令类别

list

显示源代码

b/break

设置断点

infobreak

显示当前断点

delete

删除所有断点

disable

禁用断点

enable

启用断点

clear

删除当前断点

where

查看错误的行号

step

跳入函数

finish

结束函数执行

shellcommand

执行shell命令

p/print

打印变量

c/continue

继续运行

return

强制函数返回

jump

跳到指定行

 

2.段错误

 

可能情况:

①访问的内存超出了系统给该程序所设定的内存空间

②访问了不存在的内存地址

③访问系统保护的内存地址

④访问只读的内存地址

⑤栈溢出

 

调试方式:

①ulimit -c1024

开辟1024Byte空间抓取段错误

②gdb ./filename

调试文件,抓取错误,生成core文件

③core-file core.xxxx

用gdb调试core文件

④bt

打印错误的堆栈信息

 

遇到问题:

错误:程序中有游离的'\302'

错误:程序中有游离的'\240'

使用命令:od -c filename.c

查看'\302'、'\240'出现的位置,进行清除。

 

错误:No symbol table is loaded. Use the "file" command.

原因:①可能是因为编译时未使用-g命令。

②可能是因为在makefile中将-g用于编译命令,使用一个变量object=-g代替。

③可能是因为gdb后未加上需要调试的文件名。


反思:实训第三天,学了makefile和gdb,linux系统下也可以调试代码了。明天就开始做项目了,抓紧时间再巩固一下linux的知识。