Gcc编译程序
Gdb--程序调试工具,调试有问题的程序
开源哲学之一:只要眼球足够多,所有的BUG都好捕捉。
1、Gcc编译流程
预处理 //展开预编译的宏
->编译 //高级语言->汇编语言
->汇编 //汇编语言->机器语言
->链接 //把.o文件连接起来
2、Gcc编译器常用选项
1、总体选项
-o 输出文件名 (不加-o选项默认为a.out)
2、编译过程选项
-E 只进行预处理
-S 编译到汇编语言,不进行汇编和连接
-c 编译为目标文件,不进行连接
3、警告和出错选项
-wall
4、优化选项
-O2
-O
//g++ -c -fPIC test.cpp àtest.o
//g++ -fPIC -shared -o libtest.so test.o
Position Independent Code 位置无关代码
//编译步骤和操作
创建文件student.c
编译文件gcc student.c //会生成一个a.out的文件,如果不想生成的文件名是a.out
运行源码程序 ./a.out //就使用gcc -ostudent(指定的文件名) student.c
//一步一步编译到可执行文件
预处理阶段:gcc -E student.c
gcc -E student.c -o student.i
vim student.i
编译阶段: gcc -S student.i -o student.S
vim student.S
汇编阶段: gcc -c student.S -ostudent.o
vim student.o //这时候生成的.o文件不是文本文件,而是一个二进制文件
链接阶段: gcc -o student student.o //这时候生成可执行文件student
链接: gcc -c main.c -omain.o
gcc -c sum.c -o sum.o
gcc -o sum_1_to_n main.o sum.o
执行: ./sum_1_to_n
3、Gdb常用基本命令
//csdngdb调试大门,大牛写的高质量指南
gdb attach pid——调试进程(pid是进程号)
r/b breakpoints
info b //查看所有断点
break (b) //设置一个断点
delete (d)断点编号 //删除一个断点
clear 断点行号 //清除指定行或函数处的断点
disable 断点编号 //禁用断点,缩写为dis
enable 断点编号 //启用断点
continue (c) //继续运行程序,直到再次遇到断点或程序结束
step (s) //进入一个函数内部执行
next (n) //仅执行一步,执行下一条指令
bt //查看堆栈
where
f 1 //显示栈帧,后面跟栈帧的编号
info——搭配选项获取各种信息
info f //查看当前栈帧的详细信息
info source //查看源程序的信息
info registers //查看寄存器信息
info stack //查看栈
info threads //查看线程
info locals
info args //栈当前参数
attach 线程号 //运行线程
detach 线程号 //取消调试该线程
disassemble printinfo //显示程序的汇编代码
finish //执行到此函数返回
printf (p) //显示一个变量的值,p 变量名 显示变量的值
info line_number/函数名/文件名:行号/文件名:函数名
display (p) //将一个变量或者表达式的值设置为自动显示,p是表达式
info display //查看当前所有自动显示的变量或表达式
undisplay //删除一个自动显示的变量或表达式,命令后面跟的编号
disable display//禁用一个自动显示的变量或表达式
enable display//恢复一个自动显示的变量或表达式
up/down 跳转到上下层调用函数
ptype (p) //查看变量的数据类型
set p= 100 //设置一个变量的值
jump 15 //跳转到指定的语句
call printf(“a\n”) //强行调用和执行一个函数,显示被调用函数的返回值,以及输出
list(l) //显示当前正在执行的源码(查看源代码)
file //载入程序
quit(q) //退出
//调试......
1#gcc -c main.c -g -o main.o //1和2是一样的,-o、-g、-c可以互换位置
2# gcc -o main.o -c main.c -g //要调试、设置断点,必须加上-g
3# gcc -c sum.c -g -o sum.o
4# gcc -o sum_1_to_n sum.o main.o
ulimit -c n
ulimit -c unlimited
echo "ulimit -c unlimited" >> /etc/profile
echo "/tmp/core-%e-%p-%t" >> /proc/sys/kernel/core_pattern
gdb调试corefile:gdb exe corefile
//Gdb的用法
#gdb sum_1_to_n //即gdb后面跟上可执行文件,会出现(gdb),即可使用gdb命令
#(gdb) break main.c :8 //在main.c文件的第8行设置断点
#(gdb) info b //查看断点
#(gdb) b sum_1_to_n //也可以根据函数名设置断点
#(gdb) delete 1 //1为断点号,通过info b查看断点号,用断点号删除
//运行命令 run (r)
//进行调试
//调试完毕后,quit(q) 退出
#(gdb) watch value //查看变量value的信息
export LD_LIBRARY_PATH=/usr/lib64/perl5/CORE
Valgrind——寻找程序漏洞和改进程序
Memcheck 寻找c/c++程序中内存管理错误
Cachegrind 用于检查缓存使用的工具,cache剖析工具
Callgrind 收集程序运行的数据
Helgrind 用于检测多线程竞争资源的工具
Massif 堆栈分析工具
#valgrind [options] exe_file arg…
参数选项 可执行程序程序参数
使用内存检测,option参数必须加上–leak-check=yes
例如:
#valgrind –leak-check=yes ./test
#valgrind --tool=memcheck --leak-check=full –show-reachable=yes 可执行文件