范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

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

  CGDB 是  GDB  的前端,在终端窗口中意图形化的形式来调试代码(基于 ncurse  ),非常方便。相对于 GDB  来说,可以很大的提高效率。
  这篇文章就来分享一下 CGDB 的最基本使用方法,如果是第一次听说,强烈建议您体验一下,一定会爱上它的!有 bug 的示例代码#include #include #include #include #include typedef struct USER_DATA{char data[32];unsigned short data_len;unsigned int flag;}__attribute((packed))__;const unsigned char *g_data =  "hello";/*功能:加载一段数据参数1:  data[OUT]: 数据被加载的缓冲区参数2:  len [OUT]:实际被加载的数据的长度返回值: 0-成功,else-失败*/static int get_data(unsigned char *data, unsigned int *len){assert(data && len);memcpy((void *)data, (void *)g_data, strlen(g_data));*len = strlen(g_data);return 0;}int main(int argc, char *argv[]){    // 创建结构体变量struct USER_DATA user_data;user_data.flag = 0xA5;// 往结构体变量中加载数据if (0 == get_data(user_data.data, &user_data.data_len)){printf("get_data ok!  ");printf("data_len = %d, data = %s  ", user_data.data_len, user_data.data);printf("user_data.flag = 0x%x  ", user_data.flag);  // 期望值:0xA5}else{printf("get_data failed!  ");}return 0;}
  在编译之前,先看一下代码,你能发现其中的 bug 吗?
  当然了,在编译的时候,编译器以 Warning 的方式给出了风险提示。因为示例代码很简单,所以很容易发现。
  但是在一个项目中,如果不喜欢消除编译 Warning 警告的话,这个bug 还是比较隐蔽的。
  编译测试代码: gcc -g test.c -o test
  因为要使用 GDB 调试,所以别忘了加上-g 选项。GDB 调试操作$ gdb ./test(gdb) r   // 直接全速执行一次(gdb) rStarting program: /home/captain/demos_2022/cgdb/test test start... get_data ok! data_len = 5, data = hello user_data.flag = 0x0 [Inferior 1 (process 9933) exited normally]
  发现 user_data.flag 的值不对,决定在调用get_data 之前的那行下一个断点,然后从头开始执行:
  嵌入式物联网需要学的东西真的非常多,千万不要学错了路线和内容,导致工资要不上去!
  无偿分享大家一个资料包,差不多150多G。里面学习内容、面经、项目都比较新也比较全!某鱼上买估计至少要好几十。
  点击这里找小助理0元领取: 嵌入式物联网学习资料(头条)
  查看代码行号: (gdb) l main18*len = strlen(g_data);19return 0;20}2122int main(int argc, char *argv[])23{24struct USER_DATA user_data;25user_data.flag = 0xA5;26if (0 == get_data(user_data.data, &user_data.data_len))27{
  下断点在 25 行:(gdb) b 25Breakpoint 1 at 0x400771: file test.c, line 25.
  开始运行: (gdb) rStarting program: /home/captain/demos_2022/cgdb/test Breakpoint 1, main (argc=1, argv=0x7fffffffdc58) at test.c:2525user_data.flag = 0xA5;
  在断点处停了下来,此时该赋值语句还没有执行,所以先单步执行一次: (gdb) step26if (0 == get_data(user_data.data, &user_data.data_len))
  此时,打印一下这个变量 user_data.flag 的值和地址:
  因为待会进入被调用函数,这个变量就不可见了,所以需要通过地址来打印。  (gdb) print &user_data.flag$1 = (unsigned int *) 0x7fffffffdb62(gdb) print/x user_data.flag$2 = 0xa5
  此时赋值是正确的,再接着往下执行,进入被调用函数 get_data() 了,(gdb) stepget_data (data=0x7fffffffdb40 "n333377377377177", len=0x7fffffffdb60) at test.c:1616assert(data && len);
  这个函数一共就 4 行代码,我们每单步执行一句,就打印一下user_data.flag 变量的内容。
  单步执行下一行 memcpy 处,并且看一下user_data.flag 变量地址处的内容是否仍然为:0xa5 :(gdb) step17memcpy((void *)data, (void *)g_data, strlen(g_data));(gdb) print/x *0x7fffffffdb62$3 = 0xa5
  继续单步执行(因为不需要跟进 memcpy、strlen 的内部,所以使用next 命令),并打印:(gdb) next18*len = strlen(g_data);     // 这一句即将被执行(gdb) print/x *0x7fffffffdb62$4 = 0xa5(gdb) next19return 0;(gdb) print/x *0x7fffffffdb62$5 = 0x0
  发现问题了:在执行 *len = strlen(g_data) 语句之后,变量user_data.flag 地址中的内容就被改变了。
  再仔细检查一下代码,就可以诊断出是数据类型使用错了。
  解决bug:  get_data() 函数的最后一个参数,应该是unsigned short 型指针才正确。
  问题是解决了,但是回过头来看一下 gdb 的调试过程,还是比较繁琐的:调试指令和代码显示夹杂在一起,需要敲很多指令。CGDB 调试操作
  启动 CGDB 之后,终端窗口被评分为上下两部分:上面是代码窗口,下面是调试窗口。
  按下 ESC 键进入代码窗口,此时可以上下浏览代码,并且可以进行一系列的操作:空格键:设置或者取消断点;
  o:查看代码所在的文件;
  / 或者 ?:在代码中搜索字符串;
  …
  还有很多方便的快捷键: -:缩小代码窗口;
  +:扩大代码窗口;
  gg: 光标移动到文件头部;
  GG:光标移动到文件尾部;
  ctrl + b:代码向上翻一页;
  ctrl + u:代码向上翻半页;
  ctrl + f:代码向下翻一页;
  ctrl + d:代码向下翻半页;
  按下 i 键回到调试窗口,进入调试模式,使用的调试指令与GDB 几乎一样!
  也就是说:可以在实时查看代码的情况下进行调试操作,大大提高了效率。
  我们按照上面 GDB 的调试过程走一遍:
  按下 ESC 键进入代码窗口,此时代码前面的行号如果是白色的,表示所在的当前行。
  按下 j 键,向下移动高亮的当前行。当移动到25 行时,如下:
  按下空格键,表示在此行设置一个断点,此时行号变成红色的:
  并且在调试窗口打印一行信息: (gdb) Breakpoint 1 at 0x400771: file test.c, line 25.
  按下 i 键回到调试操作窗口,然后输入运行指令r ,会在第25 行停下来的,如下绿色的箭头所示:
  当然了,调试窗口也会打印出相关信息: (gdb) rStarting program: /home/captain/demos_2022/cgdb/test Breakpoint 1, main (argc=1, argv=0x7fffffffdc58) at test.c:25
  单步 step 执行这条赋值语句,然后打印一下user_data.flag 的值和地址:(gdb) print/x user_data.flag1: /x user_data.flag = 0xa5(gdb) print &user_data.flag2: &user_data.flag = (unsigned int *) 0x7fffffffdb62
  此时,赋值语句正确执行,打印的值也是符合预期的。
  再执行单步指令,进入函数 get_data() 内部:(gdb) stepget_data (data=0x7fffffffdb40 "n333377377377177", len=0x7fffffffdb60) at test.c:16
  此时,上面的代码窗口自动进入 get_data() 相关的代码,如下所示:
  继续单步,在执行赋值语句 *len = strlen(g_data); 之前打印一下变量user_data.flag 地址中的内容:(gdb) print/x *0x7fffffffdb62$2 = 0xa5
  正确!然后执行赋值语句之后,再次打印: (gdb) next(gdb) print/x *0x7fffffffdb62$3 = 0x0
  发现问题:在执行 *len = strlen(g_data) 语句之后,变量user_data.flag 地址中的内容就被改变了。
  小结:
  CGDB 的操作过程,虽然我写的比较啰嗦,但是实际使用起来,真的是非常的丝滑,就像巧克力一样!
  原文链接:https://mp.weixin.qq.com/s/emJWAkbIxPTLzdvKYaE1eA
  转载自:嵌入式大杂烩
  原文链接:比GDB更方便的代码调试工具:CGDB
  本文来源网络,免费传达知识,版权归原作者所有。如涉及作品版权问题,请联系我进行删除。

中国距离市中心最近的10座机场,有的仅有1公里,散步就能抵达随着中国交通的飞速发展,人们的出行越来越方便快捷,虽说出行最快捷的方式是坐飞机,但现在人们出门,越来越多选择高铁而不是坐飞机,因为花费都差不多,但机场距离远,要提前23个小时动身,杭州有条老街藏着800多岁的国保!市中心静谧文艺的好去处寻觅历史记忆,体味丰富文化,感受市井烟火。今天的杭州城市记忆专栏,跟着杭小微一起来走一走杭城的几条特色老街,这里不仅承载着人们对过往的怀念,也焕发着时代的新生大井巷吴山脚下静谧文艺五洲望乡动图概览侨乡汕头汕头市位于中国广东省东部,韩江三角洲南端,北接潮州,西邻揭阳,东南濒临南海。境内韩江榕江练江三江入海,大陆海岸线长217。7公里,海岛岸线长167。37公里,有大小岛屿82个。汕头东莞发布数字经济发展规划,滨海湾将在这些领域担起重任近日,东莞市数字经济发展规划(20222025年)(下称规划)印发。规划指出,东莞将抢抓数字经济和数字化发展新机遇,聚焦五大领域十大产业三大要素,建立东莞市数字经济发展体系。按照规一路走来大连港见识改装船,星海湾夜览大广场人来到这个世上,应该尽量多地欣赏体验品尝感悟,然后分享美,传递爱,留下思考或启示为此,笔者利用各种机会,走了很多路,赏了很多景,陆续分享给朋友们,让大家与我一起回顾旅途的愉悦或感动不要在囤酒了不要再囤酒了,不要再囤酒了,不管你是消费者酒水开发商,还是想投资白酒的行业外,老板还想着卖酒钱,想去开发代理或者投资小酒厂的。现在是行情不好,对?马上不久就要挨打了。为什么这么说?讨论哪些球队是时候按下重启键了?公牛森林狼ampampamp热火谁更绝望?(原文发表于12月2日,文章内容为体育画报专家ChrisMannix和HowardBeck的分析,不代表译者观点)体育画报的专家ChrisMannix和HowardBeck针对近期经历了上周海底捞一周大涨后,拿住的人相信已经笑得合不拢嘴了经历了上周海底捞一周大涨超过43之后,拿住的人相信已经笑得合不拢嘴了。预计消费股会持续活跃,受益于疫情管控的放松,类似于海底捞之类的餐饮股,以及上游的调味品如千禾味业,会有持续的表这双丑鞋在冬天又火了!明明看着又笨又土,可明星潮人都爱穿每年的流行单品总是会让人意想不到,在今年冬天又火了一双丑鞋,看上去毫无设计感,并且显得又笨又土,但是却深受明星和潮人的喜爱和追捧。有时候,时尚圈就是这么神奇,明明连普通人都看不上眼皖南的冬天,没有什么是一个火桶不能解决的,如果有,那就两个文清茶与田园原创这两天,我所在的城市气温骤降,冬天真的来临了。天气阴沉沉的,寒风刮得脸上的皮肤生疼生疼的,我赶紧把家里的神器火桶拿了出来。真是一瞬间就暖和了,你可以靠坐在沙发上,把冬天这样给娃喝牛奶,糟蹋营养还有毒,家里老人却很喜欢冬天你们家会热牛奶喝吗?很多长辈会觉得天冷喝常温牛奶,对宝宝娇弱的肠胃有伤害(其实肠胃健康的宝宝并不用担心),但有几种热牛奶的方式,不仅会让牛奶中的营养流失,还可能有危险。这些加热
孩子打喷嚏流鼻涕就一定是感冒吗摘要进入秋季,儿科门急诊的患者骤然增多,其中很多小患者,主要是来看所谓的感冒,询问症状和完善检查后发现元凶是过敏性鼻炎。7岁的小天天,因为反复流涕,鼻塞,喷嚏来医院已经无数趟了,说天下第一寺五台山佛光寺去年8月去晋北,我们走完朔州,往南去五台山。五台山所谓之四大佛教名山之一,供奉文殊菩萨,主要能看的是寺庙。细查五台情况,各种书籍和资料中介绍的现在有4050个寺庙。除了五台山里面台双11到底要不要买手机?刚花钱的机主现身说法实话说,今天双11的影响力比前两年稍大一些,之前很少人讨论双11买不买手机,但最近几天好多人问我怎么买优惠比较大。我感受下来,今年的福利力度还是可以的。就拿iPhone来说,即便P半步崩拳打天下清末武术家郭云深前辈初学长拳八极,后学形意,有半步崩拳打遍天下的美誉。崩拳应该算是形意门里最简单的招式了,如何能靠它打遍天下呢?除郭云深前辈自身体魄较好,练功刻苦外,他的崩拳变化多忙,是治愈一切的良药古人说人闲事非多,一忙解千愁。生活中,太忙的时候,我们都渴望清闲,想着什么时候能歇一歇该多好。但真的闲下来了,又扛不了多久。一久,就感觉百无聊赖,哪儿哪儿都不对。所以,人生最好的状绝了!姆巴佩抛弃女友,新欢身份遭曝光,薪水超梅西,球迷服了足球助力团巴黎的姆巴佩真的绝了,他已经抛弃了自己的变性女友,而他的新欢的身份也遭到了媒体曝光,不仅如此,姆巴佩和球队续约后,他的薪水也超越了球王梅西,他现在是足坛年薪第一人,不少球107联盟倒数第一!火箭榜眼秀怕是水了,16号秀才是休城的未来火箭新赛季取得1胜9负的战绩,这样的成绩虽然很让人失望,但是更让失望的是球队的核心基石怕是真的要水了。火箭休赛期进行了重大调整,几乎送走了球队所有即战力,也就留下了老将戈登,这些操杜峰世预赛之后离开国家队世预赛马上就要开打了,中国男篮这次的选人又让球迷们目瞪口呆,在联赛打得稀烂的球员都能进国家队,而表现优异的球员却视若无睹。国家队变成了一言堂,主教练想让谁上就让谁上,亚洲杯得到第八意甲女排斯坎迪奇31克升班马朱婷首发斩获16分央视网消息北京时间11月7日凌晨,20222023赛季意甲女排联赛常规赛第5轮争夺结束。朱婷效力的斯坎迪奇客场31击败升班马皮内罗洛,斩获第4胜后暂居第5,四局比分为25132517天内连破2世界纪录!美国游泳一姐再逆天大赛26冠4世界纪录莱德基,简直强得夸张!游泳世界杯印第安纳波利斯站(短池),这位美国游泳一姐7天内第二次打破了世界纪录!就在多伦多站世界杯的时候,莱德基就在1500米比赛中打破了世界纪录,当时成绩是姐姐168,妹妹154,一个爸一个妈,为什么差距那么大2个月前接诊一个家长,说小女儿最近长得有些慢,11岁半,身高143厘米,在班里是最矮的,本来活泼开朗的孩子变得有些自卑敏感了,妈妈不放心,就带孩子来看看。给女儿测了骨龄,有些偏大,