调试利器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的主要内容,如果未能解决你的问题,请参考以下文章