问题解决(一次进 “源码” 排错的经历,学到了)

知识养成了思想,思想同时又在融化知识。这篇文章主要讲述问题解决:一次进 “源码” 排错的经历,学到了相关的知识,希望能为你提供帮助。
【问题解决(一次进 “源码” 排错的经历,学到了)】

毕设用到了protobuf,所以花一天时间学了一下并上手使用。
一通操作下来,报了个错:expected unqualified-id before ‘(’ token。

问题解决(一次进 “源码” 排错的经历,学到了)

文章图片

定位在 XX.pb.h 文件中,心里发怵,这不是自动生成的吗?那个文件我去看过,有点乱,要我动手,有点。。。
在1.0版本向1.1版本进发的过程中,就是这个bug让我搁置了将JSON替换成PB的进度,那会儿急,现在无所谓,闲得很,干它!
于是我循迹找到那个报错的地方:
问题解决(一次进 “源码” 排错的经历,学到了)

文章图片

其实我很少使用 文本find功能(可能是以前遇到的bug不值得让我放这个大招吧),这次迫不得已,还是养成这个好习惯吧。
问题很明显了吧!!!明显就看不出有什么不对啊。。。
还好,前人已经踩过这个坑了,我顺着他的路子自己走了一遍,拿到这个经验。
1、把这个报错的代码删了,去 .cc 文件里面 find 一下就知道这个函数根本没有什么依赖性,直接删掉,编译,正常!!!
一般人到这一步就可以了,该干其他的事情,或者下班了。
2、恢复原样,将该函数名进行修改(第一步无奈之下很容易想到,第二步就需要经验了)。就不觉得这个函数名很常见吗?而且这个函数内容只不过是一个转调用,招谁惹谁了???如果是被转调的函数出问题,报错就不是在这个函数里了。最后,翻译一下那个报错,但凡英语好一点。
综上,决定修改一下函数名试一下看看能不能过。
修改函数名,这里有个细节,这里只是实现,前面还有声明,在 find 的时候会看到(果然不 find 不行啊)。
修改之后,编译,正常!!!
保守派到这里也就可以了,那个函数没有给 .cc文件使用,那可能就是要给开发者用的嘛。贸然删除了不好,这下就保有了代码原有的功能不残缺。
3、但是作为探索者,应该再往下一步。为什么使用 errno 这个名字会不行呢?不符合预期?怎么个不符合预期?想到这个errno,眼熟吧,
errno.h 里面也有。但是有又怎么了?
使用预编绎工具,把代码做下预编绎处理,使用g++ -E 的方法,把出问题的.cpp进行处理,看看里面长什么样子。
g++ -E prototest.pb.cc -lprotobuf > test.i

找到大致问题所在的地方,我们发现,在定义到errno()函数的地方,被动了手脚了。如下图所示:
问题解决(一次进 “源码” 排错的经历,学到了)

文章图片

问题解决(一次进 “源码” 排错的经历,学到了)

文章图片

究其原因,因为在编译的时候引入了 errno.h
问题解决(一次进 “源码” 排错的经历,学到了)

文章图片






    推荐阅读