不要在一棵树上吊死。这个框架不行,就换一个。
一、崩溃
我们有个c++项目,需要对外提供接口。之前的办法是采用drogon框架作为支持,在x86机器下,不管是windows还是linux,一直运行得不错。但将这个程序移植到CPU为ARM架构的工控机中,如果访问其中的接口,程序就崩溃、退出了。
Segmentation fault (core dumped)
经调试,接口已经成功访问,里面的逻辑都执行完毕了。看上去就是系统在处理后续的工作出了问题。跟具体的接口没有关系,就算是访问一个最简单的,返回“Hello World!”信息的GET方式接口都会导致崩溃。观察了许久,程序也没有内存泄露的问题。
调试过程中,程序崩溃前,报这个信息:
Thread 3 "DrogonIoLoop" received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7ff66b5c40 (LWP 487506)]
__GI___libc_free (mem=0x13) at malloc.c:3102
Execute debugger commands using "-exec <command>", for example "-exec info registers" will list registers in use (when GDB is the debugger)
后来写了一个最简单的程序,最大限度减少干扰,报这样的信息:
free(): double free detected in tcache 2
Aborted (core dumped)
意思就是重复释放资源。那么到底是哪里出了问题?巨大的进度压力之下,我也崩溃了。
二、纠结
这个事处理起来有点纠结。原因是,drogon依赖openSSH,但运行我们程序的工控机,出厂时就预装了一个低版本的openSSH,drogon依赖的就是这个低版本。而我项目中用到了mysql connector,它也依赖openSSH,但依赖的版本比较高,并且它将这个高版本的openSSH跟它所用的类库放在一起。编译的时候,系统就警告说,可能会有冲突。但也能运行。AI就说,这个应该跟崩溃有关。
但也不好升级系统预装的openSSH吧,这是一个基础类库,升级了的话,万一整个工控机都不可用了咋办,指不定会出什么幺蛾子。所以我就一遍遍地问AI,一整天都耗在如何引导drogon去使用mysql自带的高版本openSSH了。AI的回答总是四平八稳,面面俱到。有些情况已经明确告诉它不用考虑了,但它还是一遍又一遍地提示这种可能性。好啰嗦啊,看着心累。
我钻进了牛角尖。一天下来,整个人都懵了,也没有解决问题。
三、醒悟
后来我想明白了。我问AI,除了drogon,还有别的框架能提供RESTful API吗?“太有了”,AI说,给我推荐了好几个。我找它要了一个最简单,最轻量的,结果运行起来,啥事没有。
#include "httplib.h"
int main() {
// 创建HTTP服务器对象
httplib::Server server;
// 定义路由处理函数
server.Get("/", [](const httplib::Request& req, httplib::Response& res) {
// 设置响应内容
res.set_content("Hello, World!", "text/plain");
});
// 启动服务器,监听指定端口
server.listen("localhost", 8080);
return 0;
}
四、总结
不要迷信AI。自从有了AI以后,我就很少上搜索引擎了。搜索引擎要自己搜,甄别,琢磨,AI直接给答案。万事通,啥都懂。但是,它也不是万能的。如果一个问题,重复问题问它几遍,都不能解决,我看就可以放弃了。它喜欢一本正经的胡说八道,不懂装懂。
另外就是不要在一棵树上吊死,既然代码没有问题,那应该就是框架的原因。换吧。