今天下午就qt程序使用post访问cgi程序出错的问题向好帅老师请教,在观看他调试的过程中我学到了很多东西,现大致记录老师的调试过程如下:
0.“queryplay”这个cgi程序无法被qt调用后返回正确信息,于是在queryplay的源码中不同加入了许多的“printf”进行测试,发现qt端无法接受到任何一个添加的“printf”所输出的信息,只有系统本身返回的错误信息,这证明该cgi程序根本没有被调用,那是不是这段qt代码的问题呢,于是继续往下。
1.测试一个很简单的cgi程序:“hello”,可以接收到该cgi小程序中输出的信息,证明至少调用“hello”的qt代码是正确的,或者说是可用的
2.将访问hello的qt代码 复制,然后注释掉,再在同样的位置粘贴,将“hello”改成调用时出错的cgi程序的名字“queryplay”,即用调用hello的代码调用“queryplay”测试发现出错,仍然无法调用该cgi,证明错不在qt,或者说qt之外的部分是有错误的
3.仔细对比“hello”与“query”的不同,发现如下信息:
(1)代码不同,这里的源码包括“.c”文件和“.h”文件
(2)编译方式不同,hello使用的简单的arm-linux-gcc -o hello hello.c,“queryplay”使用了makefile文件进行编译,makefile文件中有对库的引用
4.那么将“queryplay”中主函数代码注释掉,换成hello的,再编译,发现调用“queryplay”还是出错,这就说明错误还没找出来,还得继续
5.再将“queryplay”中的头文件都注释掉,只剩余一个和“hello”一样简单的“#include<stdio.h>”,编译,调用还是出错,错误没找出来,尽管这不能证明“queryplay”文件的源码是清白的,但显然其他地方还有错误,还得继续寻找
6.将目光放在编译方式,仔细观察makefile文件,发现编译时调用了“sqlite”库与“json”库,将调用库的信息去掉,编译,则调用“queryplay”不报错,那么现在就可以证明,凶手隐藏在对库的编译调用上
7.查看makefile中调用库的路径,发现调用路径正确;编写简单的小程序测试库,发现移植的这两个库是可用的,这证明库没有错
8.库没有错,但是编译时调用库就会导致调用CGI出错,于是推测boa服务器不支持编译时调用了库的cgi程序,回宿舍后咨询度娘,发现果然,boa不支持动态库编译的程序,将makefile文件中编译选项中加入静态编译选项“-static”就好了,这是才反应过来,原来第三步中的编译方式不同还隐含着动态编译与静态编译的区别。
9.以上