工程化编程实战callback接口学习笔记
工程化编程实战callback接口学习笔记
1.配置vscode c/c++调试编译环境,并运行lab5-1.tar.gz中的代码
按照老师上课所给出的vscode配置环境,但是我遇到了些问题,macOS下无法debug(通过clang++),在微软vscode也给出了解释,issue #3829 ,通过下载LLDB插件可以解决。
-
编译代码
-
运行代码
在执行quit命令,应该是执行退出程序,现在的结果和我们的预期不一样,所以对代码进行调试。
2.通过vscode+GDB调试程序,寻找quit的bug
调试前,先进行对代码的分析,大致定位代码bug的位置,那从main函数开始,main函数如下图:
![](https://img2020.cnblogs.com/blog/957240/202003/957240-20200316191557506-1020455129.png)
有main中可知到,程序在quit输出This is a wrong cmd!
,quit指令没有通过FindCmd
在存储的链表中找到。
在进入SearchLinkTableNode
中
![](https://img2020.cnblogs.com/blog/957240/202003/957240-20200316191721942-281304534.png)
这个函数的功能就是链表中是否有满足Condition
的命令,
![](https://img2020.cnblogs.com/blog/957240/202003/957240-20200316191740794-566708140.png)
这个conditon
就是SearchConditon
函数,完成的功能就是比对单个节点中保存的命令是否和我们要找的一致。
还有一个函数没有看就是在main
中的InitMenuData
![](https://img2020.cnblogs.com/blog/957240/202003/957240-20200316191750958-1123144675.png)
该函数实现链表的初始化,这里quit
链表的最后一个位置。有前面的分析大致可以猜到可能是quit
处于尾节点
,由SearchLinkTableNode
比对中没有比尾部节点,导致没有找到quit。
分析完后进入debug环节,
![](https://img2020.cnblogs.com/blog/957240/202003/957240-20200316191802571-1797171338.png)
pLinkTable
代表的就是链表数据结构,其中有三个节点,由InitMenuData
给出,可以知道0x000...0000即使quit节点,
pTail
也是指向该节点,那么就会导致存储quit
节点丢失。有debug的结果可以清晰看到pNode
和pTail
相等了。
![](https://img2020.cnblogs.com/blog/957240/202003/957240-20200316191809332-1956845122.png)
修改函数SearchLinkTableNode
为如下,就可以产生正确的结果了。
![](https://img2020.cnblogs.com/blog/957240/202003/957240-20200316191816319-313460666.png)
测试如下,
![](https://img2020.cnblogs.com/blog/957240/202003/957240-20200316191822241-1166665047.png)