用gdb来调试C/C++程序以及用Valgrind寻找程序漏洞和改进程序

Gcc编译程序

Gdb--程序调试工具,调试有问题的程序

开源哲学之一:只要眼球足够多,所有的BUG都好捕捉。

 

1Gcc编译流程

预处理    //展开预编译的宏

->编译     //高级语言->汇编语言

->汇编     //汇编语言->机器语言

->链接     //把.o文件连接起来

2Gcc编译器常用选项

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

 

3Gdb常用基本命令

//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  可执行文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值