论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
ToB企服应用市场:ToB评测及商务社交产业平台
»
论坛
›
运维.售后
›
运维.售后
›
【Linux】Linux环境基础开辟工具利用之Linux调试器-gdb ...
【Linux】Linux环境基础开辟工具利用之Linux调试器-gdb利用 ...
怀念夏天
金牌会员
|
2024-8-22 09:47:17
|
显示全部楼层
|
阅读模式
楼主
主题
676
|
帖子
676
|
积分
2028
一、程序发布模式
程序的发布方式有两种,debug模式和release模式
1.1 debug模式
目的:重要用于开辟和测试阶段,目的是让开辟者可以或许更容易地调试和跟踪程序中的错误(bugs),以确保软件在发布前无庞大错误。
特性
编译时不会举行过多的优化,以便更容易地通过调试工具(如GDB)查看程序的状态,包括变量值、函数调用栈等。
包罗详细的调试信息(如符号表),这些信息对于理解程序的行为和定位题目至关重要。
运行时可能包罗额外的查抄,如数组边界查抄、空指针查抄等,以帮助捕获潜在的错误。
通常实行速度较慢,因为缺少优化并且增加了额外的调试信息。
1.2 release模式
目的:用于将软件部署到生产环境,目的是提供稳定、高效的运行体验,将软件部署到生产环境,供最终用户利用。
特性
编译时会举行各种优化,如代码重排、循环展开、内联函数等,以提高程序的实行速度和服从。
不包罗调试信息(如符号表),以减少可实行文件的大小并提高加载速度。
移除所有运行时查抄(如数组边界查抄、空指针查抄等),以减少运行时开销。
举行了严格的代码查抄和测试,以确保程序的稳定性和安全性。
通常实行速度快,因为经过了优化并且去除了不须要的查抄。
二、默认发布模式
Linux gcc/g++出来的二进制程序,默认是release模式,在release模式下是无法举行调试的,要利用gdb调试,必须在源代码生成二进制程序的时候,加上 -g 选项。
那么要怎么才华证明上面的结论呢?
起首不带任何选项利用gcc编译Test.c文件生成可实行程序a.out,再利用gdb调试a.out,我们会发现没有调试信息。然后利用gcc带-g选项编译Test.c文件生成可实行程序a.out,再利用gdb调试a.out,会发现没有刚刚谁人提示。
分别利用gcc以不带选项和带-g选项分别生成可实行程序release版本和debug版本,我们可以发现debug版本的大小比release版本的大,因为debug版本的可实行程序中添加了调试信息
我们在Linux中形成的可实行程序的格式为可实行与可链接格式(ELF格式),在Linux中,readelf是一个用于显示ELF文件信息的工具,我们可以利用readelf指令通过管道筛选出调试信息。
我们发现release版本下并没有调试信息,而debug版本下有调试信息。
三、gdb的利用
gdb 文件名:进入调试
list/l 行号:从输入的换行处显示源文件的源代码,接着前次的位置往下列,每次列10行。若没有输入行号,那么gdb会根据上下文开始显示源代码。
list/l 函数名:显示函数的源代码。
break(b) 行号:在某一行设置断点
break 函数名:在某个函数开头设置断点
info(i) break(或breakpoints) :查看断点信息。
disable breakpoints n:禁用序号为n的断点
enable breakpoints n:启用序号为n的断点
delete(d) breakpoints n:删除序号为n的断点,断点的序号是线性增长的,只会越来越大,
不会
因为新添加的断点是前面删除的断点,导致新的断点的序号变为原来的序号。
delete(d) breakpoints:删除所有断点
r或run:当没有断点时运行程序,当有断点时运行到断点处。
n 或 next:
单步调试
,当利用n命令举行单步调试时,gdb会实行下一行代码。如果下一行代码是一个函数调用,它会将函数调用的结果一次性显示出来,但不会深入到函数内部去逐行实行。
s或step:
单步调试
,当利用s命令举行单步调试时,gdb同样会实行下一行代码。但是,如果下一行代码是一个函数调用,s命令会进入这个函数内部,并从函数的第一条语句开始逐行实行。这意。
finish:实行到当前函数返回,然后挺下来等待命令
print ( p ):打印表达式的值,通过表达式可以修改变量的值或者调用函数
p 变量:打印变量值。
set var:修改变量的值
continue(或c):继续实行被调试的程序,直到遇到下一个断点、程序结束或遇到其他导致程序停止的事件。
display 变量名:跟踪查看一个变量,每次停下来都显示它的值
undisplay n:取消对序号为n的变量的跟踪
until :重要作用是继续实行程序,直到当前栈帧(通常是当前函数)的返回点,或者遇到下一个断点。
until n:n为某一行代码的行号,该命令会使程序运行至第n行代码处停止。
breaktrace(或bt):查看各级函数调用及参数
info (i) locals:查看当前栈帧局部变量的值
quit (q):退出gdb
末端
如果有什么发起和疑问,或是有什么错误,各人可以在评论区中提出。
希望各人以后也能和我一起进步!!
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
怀念夏天
金牌会员
这个人很懒什么都没写!
楼主热帖
恭喜,成功入坑 GitHub 。。。 ...
程序员不撰写代码注释和文档的十大理由 ...
Redis 原理 - Set
EF Core从TPH迁移到TPT
【牛客】8 企业真题
CVE-2017-12635 Couchdb 垂直权限绕过 ...
LabVIEW+OpenVINO在CPU上部署新冠肺炎 ...
设计模式 -- Template Method(模板方 ...
IOS手机Charles抓包
图文结合带你搞懂MySQL日志之General Q ...
标签云
挺好的
服务器
快速回复
返回顶部
返回列表