一次 界面无法启动的问题 的解决记录
背景:
要修复一个web端的问题,但是pc版本对应的这个功能没有问题,就需要通过调试代码来比对是哪里的逻辑处理有差异
编了代码,但编出来的始终无法启动界面。
1.不确定是否是 代码的问题
为了验证这个问题,我从编译平台下载了一个包,这个包是没有问题的
于是我把包里的东西都拷到代码编译后得到的执行目录
无法启动
其中还存在一个变量,就是编译类型(debug或者release)的差异,编出的包是release,代码编出来的是debug
在始终没有解决这个问题的情况下,我选择了继续排除这个变量—编release,并且让我愿意择编release的原因还有一个—release也有符号文件,也可以调试。。。(不知道为啥哈哈哈,都叫release了)
于是我选择了编一个release包,前前后后也快花了一天吧,打了个新包,又编译,然后左试右试—我想会不会缺库,把新包的东西都拷贝进去,不行,甚至把新包所有的文件替换进去也不行。我一度觉得是编译环境的差异,导致二者的库不兼容。
这里多说一句,一般怀疑这种比较大的环境,基本上都得及时警醒,不要怀疑这个(属于马后炮,也属于经验之谈)
(多来点马后炮,马后炮就是很好的经验啊!!!)
这个是最后手段
如果说二者的库是可以互用的,那么把这个包都考到代码编译得到的运行目录下,仍然启动不了,那绝对是因为一些比包多出来的库导致的(这个也属于马后炮,得思考一下当时为什么没有坚定地得出这个结论—因为当时处于对环境的怀疑而没有仔细思考?)
调试是最好的解药
启动问题,当然得调试启动啊
附加调试怎么调试启动问题???
刚好,一座大山就是环境里vscode的调试启动用不了,只能用附加。。。
用附加调试半天找不出问题来
今天的关键步骤来了!!!gdb,著名的gdb
为啥开始的时候没用gdb—不会用啊,下意识排斥。
后来决定用gdb一条路走到黑,一是因为没办法了啊,只能试试。二是突然想起来大佬们都是用的gdb
强大—那就说明功能多
生态好—可以搜到准确的用法
启动gdb的时候我看到了它成功加载了我想要的那个符合文件了!!!
再描述一下问题的现象
程序一直在启动状态,但界面一直没有,输出也没有增加,基本就是卡住了
卡住的调试方法:直接点调试的暂停就行了了了
看堆栈,一定要找到有项目代码的堆栈,还是那句话,不要一来就怀疑大环境的问题,再重复一遍,先找到有项目代码的堆栈
然后对着源代码文件和行号,发现了是加载某个具体的库卡住了
然后问了小爱同学,加载库为什么会卡住,回答总而言之就是库有问题或者缺少依赖。用ldd看了下,确实少了好多依赖,还有qt的也缺。。。缺少qt的一般不好办啊
然后突然来灵感了,对比一下包里的这个库,看看缺不缺依赖
(之所以是灵感,而不是顺理成章地到这里差不多看出问题了,就是之前没有注重分析,也没有注重分析得到的结论)
一看,没有这个库在包里没有
然后我就到代码编译的运行目录下把那个名字改了(养成一个习惯,是备份,改名,而不是直接删了)
然后,奇迹来了来了来了
真的激动啊
两天半!!!至少两天半啊
那个亲爱的界面终于出来了,我一开始要对比web的逻辑的那些代码也能调了