调试利器GDB

Posted 阿弥陀佛.a

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了调试利器GDB相关的知识,希望对你有一定的参考价值。

(上)


程序运行的参数就是main函数的参数



GDB的使用需要可执行文件带调试信息(gcc -g)

崩溃时产生core文件:

运行test.out,会产生core文件

倒数第二行,func.c第七行有问题:
指向零地址初(野指针),有问题

静态分析工具和动态分析工具的差距就看出来了
add2line是前者,GDB是后者


软件断点适用于内存运行的程序,硬件断点适用于运行再flash中的程序
数据断点:监视内存

tbreak:一次有效断点,第二次就无效了
break:永久有效断点




接下来对这段代码进行GDB调试(前16行没截出来):


对test.out进行GDB调试:
设置两个main参数args D.T.Software,start命令代表开始,在最开始初会暂停
在test.c的37行打一个断点,info breakpoints:查看断点信息

continue:继续执行,执行到刚刚设置的断点处停止

查看i的值,设置i的值为100:


在43行设置零时断点,继续执行,报错

跳转到45行执行,正常结束

那么可以得到结论,func函数有问题

重新开始调试,在函数func处打断点:

continue后:

确认func函数出问题后,强制func返回:

continue后,程序正常结束

再次调试:

查看当前硬件断点可以打几个:1个
hbreak func:打一个硬件断点

打印g_pointer的值

给g_pointer赋值,让他指向一片内存
continue后,可以正常执行完这个程序

(下)


b:需要打印的单元的单位,byte。4b:四个字节




设置var的值为1, 打印var的地址,查看这个地址4个字节的内容,数据用十六进制显示
1在低字节处,那么这个系统为小端系统



由于是多线程代码,所以需要加上-lpthread命令


设置数据断点,监控g_var变量

继续执行后自动停止,说明执行到12行后,值被改写完了,说明11行被改写

查看g_var当前的值,查看g_var的地址,查看这个地址为起始点,后4个字节的内容,以十六进制显示数据





给函数打断点,n为0就停止:


从下往上读,因为这是函数调用栈


info locals:查看函数局部变量的值

当前esp的值,现在esp的值从上图可以看出,高亮是当前,光标处是以前



d:十进制
这和print命令啥区别?每次到达断点这一行,这些值都会打出来


GDB也可以当成shell来用:


设置每次显示20行

如何取消自动打印:(每次到这个断点时不要打印那些信息)

以上是关于调试利器GDB的主要内容,如果未能解决你的问题,请参考以下文章

调试利器GDB-上

调试利器GDB-上

调试利器GDB-下

调试利器GDB-下

调试利器GDB-中

调试利器GDB-中