您的位置:首页 > 其它

gcc,gdb,makefile

2016-03-31 01:41 253 查看

gcc

1.gcc 编译时加入调试信息

gcc -g


2.c++编译

gcc -lstdc++ xxx.cpp


或:

g++ xxx.cpp


3.静态库 和 动态库

这段转自这里

1,如何生成静态库

静态库只是一堆object对象的集合,使用ar命令可以将.o文件打包成.a静态库。

假设gcc已经生成了a.o, b.o, c.o,使用下面的命令即可生成libmylib.a

$ar rcs libmylib.a a.o b.o c.o


2,如何生成动态库

动态库的生成由gcc直接生成。

假设a.c, b.c两个文件,通过下面的命令可生成libmylib.so

$gcc a.c b.c -o libmylib.so --shared


3,如何使用库

gcc中关于库的参数有:

-L 指定搜寻库的目录

如指定当前目录 gcc -L .

-l 指定要链接的库的名称

加入库的名称是libmylib.a,则gcc -l mylib,即去头去尾。

–static 组织在链接时使用动态库

–shared 生成动态库

–static-libgcc 链接静态libgcc库

–shared-libgcc 链接动态libgcc库

可见对动态库和静态库的使用方法是一样的,同一个库如果同时存在动态库和静态库,优先链接动态库,除非使用–static强制使用静态库。

gcc 编译动态库时有人用-fpic,不知道有什么用

gcc -c -fpic hello1.c hello2.c


ldd
查看程序需要的动态连接库

gdb

0.运行和命令行参数

start


r
=
run


c
=
continue


n
=
next


finish
返回当前函数

until
直到循环结束

run arg1 arg2 arg3
=
set args arg1 arg2 arg3
+
run


k
=
kill


show args


show paths


show environment


info program


调试已运行进程:

gdb [program] [pid]


或者:

gdb [program]


然后 ,
attach [pid]


1.查看代码

l
=
list


搜索

search [regexp]


forward-search [regexp]


reverse-search [regexp]


查看汇编

disaaaemble [function name]


2.断点

break [line number]


break [function name]


i breakpoints
=
info breakpoints


delete breakpoint [number]


disable breakpoint [number]


enable breakpoint [number]


3.查看变量x

p x
=
print x


print
=
inspect
?

display x


undisplay x


display/i $pc
???

数组:

malloc的指针
print *array@len


静态数组
print array


格式:

x 按十六进制格式显示变量。

d 按十进制格式显示变量。

u 按十六进制格式显示无符号整型。

o 按八进制格式显示变量。

t 按二进制格式显示变量。

a 按十六进制格式显示变量。

c 按字符格式显示变量。

f 按浮点数格式显示变量。

(gdb) p i
$21 = 101

(gdb) p/a i
$22 = 0x65

(gdb) p/c i
$23 = 101 'e'

(gdb) p/f i
$24 = 1.41531145e-43

(gdb) p/x i
$25 = 0x65

(gdb) p/t i
$26 = 1100101


当变量改变是停住程序

变化时停住:
watch x


被读时停住:
rwatch x


被读写停住:
awatch x


info watchpoints


4.查看内存

examine
=
x


x/<n/f/u> [addr]


n、f、u是可选的参数。

n 是一个正整数,表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容。
f 表示显示的格式,参见上面。如果地址所指的是字符串,那么格式可以是s,如果地十是指令地址,那么格式可以是i。
u 表示从当前地址往后请求的字节数,如果不指定的话,GDB默认是4个bytes。u参数可以用下面的字符来代替,b表示单字节,h表示双字节,w表示四字节,g表示八字节。当我们指定了字节长度后,GDB会从指内存定的内存地址开始,读写指定字节,并把其当作一个值取出来。

<addr>表示一个内存地址。

n/f/u三个参数可以一起使用。例如:

命令:x/3uh 0x54320 表示,从内存地址0x54320读取内容,h表示以双字节为一个单位,3表示三个单位,u表示按十六进制显示。


5.查看寄存器

info registers


info all-registers
包括浮点寄存器

info register eax


print $esp


6.查看堆栈

bt
=
backtrace


makefile

陈皓的教程太长了,而且一些东西用不到,看完之后就很快会忘掉

推荐阮一峰的这篇

几个例子:

多个文件目录下Makefile的写法

最后,
vpath
VPATH
好像是和
%.c
%.h
这类搭配使用的

还有一篇关于cmake的:

http://www.leoox.com/?p=264

参考:

0.1陈皓的blog(gdb):http://blog.csdn.net/haoel/article/category/9197

0.2陈皓的blog(makefile):http://blog.csdn.net/haoel/article/category/9198/1

1.http://www.cnblogs.com/bubbler/p/3915931.html

2.gdb: http://www.2cto.com/os/201303/194230.html

3.gdb: http://blog.csdn.net/mifan88/article/details/7301973

4.gcc: http://www.cnblogs.com/iloveyoucc/archive/2012/08/29/2661851.html

5.makefile: http://www.cnblogs.com/little221/archive/2012/12/02/2798401.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: