游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

比GDB更方便的代码调试工具CGDB

  CGDB是GDB的前端,在终端窗口中意图形化的形式来调试代码(基于ncurse),非常方便。相对于GDB来说,可以很大的提高效率。
  这篇文章就来分享一下CGDB的最基本使用方法,如果是第一次听说,强烈建议您体验一下,一定会爱上它的!有bug的示例代码includeunistd。hincludestdlib。hincludestdio。hincludestring。hincludetypedefstructUSERDATA{chardata〔32〕;unsignedshortdatalen;unsignedintflag;}attribute((packed));constunsignedchargdatahello;功能:加载一段数据参数1:data〔OUT〕:数据被加载的缓冲区参数2:len〔OUT〕:实际被加载的数据的长度返回值:0成功,else失败staticintgetdata(unsignedchardata,unsignedintlen){assert(datalen);memcpy((void)data,(void)gdata,strlen(gdata));lenstrlen(gdata);return0;}intmain(intargc,charargv〔〕){创建结构体变量structUSERDATAuserdata;userdata。flag0xA5;往结构体变量中加载数据if(0getdata(userdata。data,userdata。datalen)){printf(getdataok!);printf(datalend,datas,userdata。datalen,userdata。data);printf(userdata。flag0xx,userdata。flag);期望值:0xA5}else{printf(getdatafailed!);}return0;}
  在编译之前,先看一下代码,你能发现其中的bug吗?
  当然了,在编译的时候,编译器以Warning的方式给出了风险提示。因为示例代码很简单,所以很容易发现。
  但是在一个项目中,如果不喜欢消除编译Warning警告的话,这个bug还是比较隐蔽的。
  编译测试代码:gccgtest。cotest
  因为要使用GDB调试,所以别忘了加上g选项。GDB调试操作gdb。test(gdb)r直接全速执行一次(gdb)rStartingprogram:homecaptaindemos2022cgdbtestteststart。。。getdataok!datalen5,datahellouserdata。flag0x0〔Inferior1(process9933)exitednormally〕
  发现userdata。flag的值不对,决定在调用getdata之前的那行下一个断点,然后从头开始执行:
  嵌入式物联网需要学的东西真的非常多,千万不要学错了路线和内容,导致工资要不上去!
  无偿分享大家一个资料包,差不多150多G。里面学习内容、面经、项目都比较新也比较全!某鱼上买估计至少要好几十。
  点击这里找小助理0元领取:嵌入式物联网学习资料(头条)
  查看代码行号:(gdb)lmain18lenstrlen(gdata);19return0;20}2122intmain(intargc,charargv〔〕)23{24structUSERDATAuserdata;25userdata。flag0xA5;26if(0getdata(userdata。data,userdata。datalen))27{
  下断点在25行:(gdb)b25Breakpoint1at0x400771:filetest。c,line25。
  开始运行:(gdb)rStartingprogram:homecaptaindemos2022cgdbtestBreakpoint1,main(argc1,argv0x7fffffffdc58)attest。c:2525userdata。flag0xA5;
  在断点处停了下来,此时该赋值语句还没有执行,所以先单步执行一次:(gdb)step26if(0getdata(userdata。data,userdata。datalen))
  此时,打印一下这个变量userdata。flag的值和地址:
  因为待会进入被调用函数,这个变量就不可见了,所以需要通过地址来打印。(gdb)printuserdata。flag1(unsignedint)0x7fffffffdb62(gdb)printxuserdata。flag20xa5
  此时赋值是正确的,再接着往下执行,进入被调用函数getdata()了,(gdb)stepgetdata(data0x7fffffffdb40n333377377377177,len0x7fffffffdb60)attest。c:1616assert(datalen);
  这个函数一共就4行代码,我们每单步执行一句,就打印一下userdata。flag变量的内容。
  单步执行下一行memcpy处,并且看一下userdata。flag变量地址处的内容是否仍然为:0xa5:(gdb)step17memcpy((void)data,(void)gdata,strlen(gdata));(gdb)printx0x7fffffffdb6230xa5
  继续单步执行(因为不需要跟进memcpy、strlen的内部,所以使用next命令),并打印:(gdb)next18lenstrlen(gdata);这一句即将被执行(gdb)printx0x7fffffffdb6240xa5(gdb)next19return0;(gdb)printx0x7fffffffdb6250x0
  发现问题了:在执行lenstrlen(gdata)语句之后,变量userdata。flag地址中的内容就被改变了。
  再仔细检查一下代码,就可以诊断出是数据类型使用错了。
  解决bug:getdata()函数的最后一个参数,应该是unsignedshort型指针才正确。
  问题是解决了,但是回过头来看一下gdb的调试过程,还是比较繁琐的:调试指令和代码显示夹杂在一起,需要敲很多指令。CGDB调试操作
  启动CGDB之后,终端窗口被评分为上下两部分:上面是代码窗口,下面是调试窗口。
  按下ESC键进入代码窗口,此时可以上下浏览代码,并且可以进行一系列的操作:空格键:设置或者取消断点;
  o:查看代码所在的文件;
  或者?:在代码中搜索字符串;
  还有很多方便的快捷键::缩小代码窗口;
  :扩大代码窗口;
  gg:光标移动到文件头部;
  GG:光标移动到文件尾部;
  ctrlb:代码向上翻一页;
  ctrlu:代码向上翻半页;
  ctrlf:代码向下翻一页;
  ctrld:代码向下翻半页;
  按下i键回到调试窗口,进入调试模式,使用的调试指令与GDB几乎一样!
  也就是说:可以在实时查看代码的情况下进行调试操作,大大提高了效率。
  我们按照上面GDB的调试过程走一遍:
  按下ESC键进入代码窗口,此时代码前面的行号如果是白色的,表示所在的当前行。
  按下j键,向下移动高亮的当前行。当移动到25行时,如下:
  按下空格键,表示在此行设置一个断点,此时行号变成红色的:
  并且在调试窗口打印一行信息:(gdb)Breakpoint1at0x400771:filetest。c,line25。
  按下i键回到调试操作窗口,然后输入运行指令r,会在第25行停下来的,如下绿色的箭头所示:
  当然了,调试窗口也会打印出相关信息:(gdb)rStartingprogram:homecaptaindemos2022cgdbtestBreakpoint1,main(argc1,argv0x7fffffffdc58)attest。c:25
  单步step执行这条赋值语句,然后打印一下userdata。flag的值和地址:(gdb)printxuserdata。flag1:xuserdata。flag0xa5(gdb)printuserdata。flag2:userdata。flag(unsignedint)0x7fffffffdb62
  此时,赋值语句正确执行,打印的值也是符合预期的。
  再执行单步指令,进入函数getdata()内部:(gdb)stepgetdata(data0x7fffffffdb40n333377377377177,len0x7fffffffdb60)attest。c:16
  此时,上面的代码窗口自动进入getdata()相关的代码,如下所示:
  继续单步,在执行赋值语句lenstrlen(gdata);之前打印一下变量userdata。flag地址中的内容:(gdb)printx0x7fffffffdb6220xa5
  正确!然后执行赋值语句之后,再次打印:(gdb)next(gdb)printx0x7fffffffdb6230x0
  发现问题:在执行lenstrlen(gdata)语句之后,变量userdata。flag地址中的内容就被改变了。
  小结:
  CGDB的操作过程,虽然我写的比较啰嗦,但是实际使用起来,真的是非常的丝滑,就像巧克力一样!
  原文链接:https:mp。weixin。qq。comsemJWAkbIxPTLzdvKYaE1eA
  转载自:嵌入式大杂烩
  原文链接:比GDB更方便的代码调试工具:CGDB
  本文来源网络,免费传达知识,版权归原作者所有。如涉及作品版权问题,请联系我进行删除。

夜读丨善待慢慢老去的自己,别太在意他人的眼光作者:北叔来源:北叔有约(ID:beishu2016)都说,余生太快,还没来得及对昨天说再见,就被时光推着向前,还没来得及好好年轻就老了。是啊,时间不停留,岁……相识百人,不如知己一人人这一生,遇人无数,朋友一群,虽然认识的人很多,但是真心的却没有几个。有时候满腹心事,心存苦楚,却找不到一个可以倾诉的人。只能藏着,装……索要5年1。8亿顶薪!维金斯将勇士逼上绝路金州1换3交易方案如今的勇士可谓是满面春光,在经历了夺冠的赛季后,球员的身价都迎来了暴涨,尤其维金斯和普洱两名大将,在季后赛以及总决赛的表现,大家都有目共睹,可以说没有他们浴血奋战,勇士就很难夺……夏天如何选择高质量T恤夏天怎么可以少的了T恤,但怎样才能从网上购买到便宜高质量的T恤呢?小编不才,从多年在网上买东西的经验,在踩过的坑里总结了以下几个小贴士:一、看做工(一)领口细节处理……混搭玩法的胜利,这次是跑酷RoguelikeRPG东南亚出海整理时间:8月2日下午5点整理范围:越南AppStore畅销榜、泰国AppStore畅销榜前50名上榜国产游戏如下:海彼游戏新游在越南4天下载量破50万……关于人生的名人名言生如夏花之绚烂,死如秋叶之静美。泰戈尔时光静好,与君语;细水流年,与君同;繁华落尽,与君老。仙枫红叶只有经历过地狱般的磨砺,才能练就创造天堂的力量;只有……你以为变天了,其实一切都没变四年来,快船到底有多倒霉?101105,快船在最后一场附加赛中不敌鹈鹕,最终还是没能打进季后赛。但我们依然要向卢指导、和在场上拼搏的快船战士们脱帽致敬,因为这一场他们又没有保罗乔治。就……米家冰箱610L墨羽岩变频压缩机质保十年一天不到一度电,真的看到米家冰箱对开门610L墨羽岩618预售价2499,是不是有换冰箱的想法?反正我是心动了,是时候换掉家里那台用了二十年,冷藏室都结冰的两门了。特别是它22L的冷冻室,383L……教你4个简单小妙招,缓解冬季干皮状况,让皮肤白皙嫩滑天气愈来愈冷,很多人皮肤干痒的情况就会出现。那么在干燥的冬季,我们应该怎样做好肌肤补水、保湿的工作呢?当然是要找到缺水的原因,才能全面补水,并且减少肌肤水分流失啦。尤其需要学习……负责人因诈骗100亿被判无期,你手上可能也有他的产品上海斐讯数据通信技术有限公司负责人顾国平被上海市第一中级人民法院判处无期徒刑,剥夺政治权利终身,并处没收个人全部财产。这个东西,你家里有吗?作为极客一份子的橙色派,在折腾……这是一种极具魅力的画面在别人吃饭时也爱上了用雪水煮玉米饭,以及第二天已经腌好的玉米面;在冬天里,每一场雪天早上都会开始滴汤清汤。而且,这些东西常常是在冬天,可能是家里最好的好事,家里的顶梁柱也……初入学的妈妈们,你们最关心的几个午觉问题都在这里了很多时候家长会担心孩子午觉不够睡,会影响幼儿长高,其实不是,很多时候,午觉睡得好,下午有精神,但是如果睡的时间太长,也不是特别好。需要具体问题具体分析哦。问:幼儿园午觉时……
靴子落地,坐等反转的时刻来临这颗悬在空中的巨石终于落地了!今日凌晨(11月4日)两点半,美联储结束会议之后,公布了维持基准利率不变,明年再考虑加息,也正式宣布缩减购债计划。每月缩减购债150亿美元,……医生建议中老年人若想要改善失眠,做好这4件事,也许会有帮助失眠几乎成为了一种普遍的社会现象,尤其是对于一些上了年纪的中老年人来说,一个好的睡眠几乎已经成为了奢望。而造成中老年人失眠的因素,有很多除了平日的饮食习惯会对我们的睡眠产生影响……秋萍退休后一人一车自驾游第57天,女司机是一个幸福的小女人今天是我一人一车自驾游第57天。很多朋友问我,你是单身吗?我现在统一回复,我不仅不是单身,我拥有一个温暖的家,孩子爱我,老公宠我。我告诉他们,爱我,就给我我想要的生活,而……小米上架120W氮化镓充电器套装USBC接口,售价299元10月29日消息,小米今天上架了一款120W氮化镓充电套装。它能够搭配昨天发布的RedmiNote11Pro实现120W快充,而且换成了USBC接口。它采用第三代半导体氮……哈登11投2988仍无缘今日最佳!对不起!你碰到NBA大杀器今日NBA赛场有7组对决,不少球员打出了优异表现,赛后NBAFantasy根据球员表现评选出了今日五佳球员,篮网球员哈登名列其中,哈登新赛季开打后受到NBA新规则的影响一直状态……夏季吃莴笋正当时,教你6种家常莴笋的做法,经济实惠美味又下饭没了烟火气,人生就是一段孤独的旅程。今天给大家分享夏季吃莴笋正当时,教你6种家常莴笋的做法,经济实惠美味又下饭,快快收藏吧!莴笋炒肉食材准备主料:猪肉300克……一颗肉眼可见的巨大小行星正朝着地球而来,或擦肩而过请记住NASA的OSIRISREx航天器,该航天器于2020年10月访问了遥远的Bennu小行星并采集了一个样本。它将在2023年9月24日将样本交付给NASA,现在它在地球上……SpaceX使用一枚四手火箭将美意宇航员送往国际空间站在佛罗里达州卡角36A发射台,SpaceX公司一枚四手猎鹰9号火箭托举着四名宇航员以及自由号龙飞船前往国际空间站。执飞此次Crew4任务的四名宇航员包括三名NASA宇航员以及一……朋友结婚文案短句结婚朋友圈文案创意一、朋友圈结婚文案短句1、我陪你到婚纱,他陪你的即将是整个人生,一路上虽然我们感情不会改变,但是婚后的你相信更多的时间是在他的身上,以及你们的家庭方面,祝愿今天的你幸福美……奔跑805天,华为鸿蒙改变了什么?在一个普通消费者看来,华为最强的是什么?我觉得应该是执行力和组织能力,有点像兵法中的风林火山,这些决定了华为更上层的技术研发能力,以及产品能力。在HDC2021开幕之际,……辽宁名帅再次下课!连续盲目接手鱼腩想再次出山难了?90100四川男篮,福建男篮又吃到一场败仗。这场输球和崔万军已经没有关系,因为福建男篮本场的主教练是朱世龙。朱世龙再次救火,虽然没有官宣,但崔万军下课已成定局。在仅打了1……中国神秘4大财团,总资产超160000亿,阿里腾讯都得靠边站随着经济的发展,也诞生了一批优秀的企业。众所周知,大家耳熟能详的阿里巴巴和腾讯是两大超级巨无霸互联网企业。马云和马化腾也是极为著名的富豪,然而阿里和腾讯却不是最牛的财团!面对真……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网