gcc,gdb,makefile

来源:互联网 发布:关于编程的电影 编辑:程序博客网 时间:2024/06/07 14:14

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

0 0