源代码使用gdb的源代码查看功能

查看源代码  时间:2021-03-06  阅读:()

在调试程序的过程中可以自由地查看相关的源代码如果有源代码的话是一项最基本的特性。

一些IDE在这方面做得相当好 GDB当然也提供了这项特性虽然不如IDE直观但在一定程度上要比IDE更加灵活和快捷。

GDB之所以能够知道对应的源代码是因为调试版的可执行程序中记录了源代码的位置因为源代码的位置在编译之后可能会移动到其它地方所以GDB还会在当前目录中查找源代码另外GDB也允许明确指定源代码的搜索位置。默认情况下 GDB在编译时目录中搜索如果失败则在当前目录中搜索 即$cdir:$cwd其中$cdir指的是编译时目录compi lation directory  $cwd指的是当前工作目录current working directory 。

在GDB中使用查看源代码相关的命令时有一个当前文件的概念当命令的位置参数没有限定一个文件的时候不论是明确限定还是隐含限定 将使用当前文件。当前文件默认是main函数所在文件如果程序当前正处于断点位置则断点所在文件即为当前文件。

与当前文件的概念类似还存在一个当前行的概念它默认为main函数的开始处。如果使用gdb载入一个可执行文件然后单单执行一条简单的l ist命令你会发现输出的源代码并非是从第一行开始的这是因为当前行默认在main函数附近处的缘故。

1.设置和获取源代码显示数量

默认情况下 GDB显示指定位置处以及其前后的10行代码但是这是一个可设置的值。set l istsize count设置l ist命令显示的源代码数量最多为count行 0表示不限制行数。show l istsize显示l istsize的值。

2.编辑源代码

在一些情况下我们希望在编辑器中显示或者编辑源代码 GDB允许我们使用自己喜欢的编辑器。

可在环境变量EDITOR中指定GDB使用的编辑器例如 EDITOR=/usr/bin/gedit;export EDITOR;gdbed it location在编辑器中编辑位置location处的源代码如果省略location则编辑当前位置。

3.搜索源代码

有的时候我们希望在当前文件中进行搜索 GDB提供了这样的命令。sea rch regexp从当前行的下一行开始向前搜索。rev regexp 从当前行的上一行开始向后搜索。

有的时候你会发现search命令总是提示“Expression not found”这是因为当前行可能已经是最后一行了特别是文件很短的时候。这里需要注意的是任何l ist命令都会影响当前行的位置并且由于每次都是多行输出所以对当前行的影响并非简单地向前一行或者向后一行。search命令本身也会影响当前行的位置。

4.源代码位置

GDB之所以可以查看到源代码是因为它知道源代码放在哪里。

在一个调试会话中 GDB维护了一个源代码查找目录列表默认值是编译目录和当前工作目录。当GDB需要一个源文件的时候它依次在这些目录中查找直到找到一个或者抛出错误。

GDB还维护了一个路径替换规则将要搜索的原始路径按照找到的第一个规则做前缀替换然后再在源码搜索目录中查找文件。

GDB允许明确指定源代码位置或者路径替换规则 以应付源代码位置迁移的情况。directory path-l ist将一个或者多个源代码搜索目录加入到当前源码搜索目录列表的前面 目录之间使用空格间隔。directory不带参数的directory将源码搜索目录恢复为默认值。set directories path-l ist将源码目录设置为path-l ist但是会补上默认目录。show directories显示源码搜索目录列表。set substitute-path from to设置目录替换规则放置在规则列表的末端。unset substitute-path [path]删除path对应的替换规则或者删除所有的替换规则。show substitute-path [path] 显示path对应的替换规则或者显示所有的替换规则。

5.查看机器码

在一些必要的时候我们需要查看汇编代码来诊断问题。GDB提供了这种可能。

GDB提供了两种能力显示源代码位置与指令地址之间的映射显示指定位置的汇编代码。info l ine l inespec显示源代码l inespec处对应的汇编地址范围。info l ine *addr显示地址addr处对应的源代码位置。disassemble disassemble/m disassemble/r显示指定地址范围内的汇编代码有4种使用形式第一种不带参数显示当前正在执行的函数的汇编代码第二 种是一个参数显示该地址所在函数的汇编代码第三种是两个参数的disassemble start,end显示地址start end 内的汇编代码第四种是两个参数的 disassemble start,+length显示地址start start+length 内的汇编代码。参数可以是16进制的地址也可以是函数名。 /m表示混合输出源代码和汇编代码 /r表 示混合输出二进制和汇编代码。set disassembly-flavor instruction-set设置显示汇编代码时使用的风格 目前只针对intel x86系列可取的值为a tt和i n te l 默认是a tt。show disassem bly-flavor显示disassem bly-flavor设置set disassemble-next-l ine on|off|auto当程序停止下来的时候是否显示下一行源代码的汇编代码默认为off。show disassemble-next-l ine显示disassemble-next-line设置。

6.显示指定位置的源代码l ist命令可用于显示指定位置处的源代码。 l ist命令会影响当前行和当前文件。l ist命令有多种方式指定要显示的源代码范围可以是行号 函数名甚至是指令地址。

常用的如下l ist l inenum显示指定行数附近的代码。l ist function显示指定函数附近的代码。l ist addr显示指定地址附近的代码。

华圣云 HuaSaint-阿里云国际站一级分销商,只需一个邮箱即可注册国际账号,可代充值

简介华圣云 HuaSaint是阿里云国际版一级分销商(诚招募二级代理),专业为全球企业客户与个人开发者提供阿里云国际版开户注册、认证、充值等服务,通过HuaSaint开通阿里云国际版只需要一个邮箱,不需要PayPal信用卡,不需要买海外电话卡,绝对的零门槛,零风险官方网站:www.huasaint.com企业名:huaSaint Tech Limited阿里云国际版都有什么优势?阿里云国际版的产品...

GigsGigsCloud 春节优惠2022 指定云服务器VPS主机85折循环优惠码

GigsGigsCloud商家在之前介绍的还是比较多的,因为之前我一直有几台机器在使用,只是最近几年网站都陆续转型删除掉不少的网站和闲置域名,包括今年也都减少网站开始转型自媒体方向。GigsGigsCloud 商家产品还是比较有特色的,有提供香港、新加坡等亚洲机房的云服务器、VPS和独立服务器等。第一、新春优惠活动优惠码:CNY2022-15OFF截止到正月初二,我们可以使用上述优惠码在购买指定G...

触摸云 26元/月 ,美国200G高防云服务器

触摸云触摸云(cmzi.com),国人商家,有IDC/ISP正规资质,主营香港线路VPS、物理机等产品。本次为大家带上的是美国高防2区的套餐。去程普通线路,回程cn2 gia,均衡防御速度与防御,防御值为200G,无视UDP攻击,可选择性是否开启CC防御策略,超过峰值黑洞1-2小时。最低套餐20M起,多数套餐为50M,适合有防御型建站需求使用。美国高防2区 弹性云[大宽带]· 配置:1-16核· ...

查看源代码为你推荐
美国互联网瘫痪如果全球网络瘫痪3分钟会造成多少损失百度商城百度知道一般一天能挣多少钱?firetrap我发现好多外贸店都卖其乐的原单,有怎么多原单吗www.20ren.com求此欧美艳星名字http://www.sqsmm.com/index.php?album-read-id-1286.html百度关键词价格查询百度竞价关键词价格查询,帮忙查几个词儿点击一次多少钱,thanksxyq.163.cbg.com『梦幻西游』那藏宝阁怎么登录?javbibinobibi的中文意思是?lcoc.top服装英语中double topstitches什么意思99nets.com99nets网游模拟娱乐社区怎么打不开了?????????谁能告诉我 ???、66smsm.com【回家的欲望(回家的诱惑)大结局】 回家的诱惑全集66 67 68 69 70集QOVD快播观看地址??
北京vps主机 hostmaster 2014年感恩节 谷歌香港 台湾谷歌网址 灵动鬼影 警告本网站美国保护 网站卫士 adroit 免费活动 域名和空间 如何用qq邮箱发邮件 789电视剧 免费私人服务器 dnspod 浙江服务器 登陆qq空间 websitepanel 免费的加速器 认证机构 更多