最近移植原有的代码到瑞芯微平台,记录几个小问题,这几个问题有编译器差异导致的问题,也有代码本身的问题,确实代码细节是关键,不能疏忽大意!
1、C++ 函数 void*返回值没有返回, 触发munmap_chunk:invalid pointer;
2、mqtt-paho库,异常分支情况下MQTTClient_subscribe主题为空,导致mqtt主动断连,出现lost connect现象;
3、void *payload数据直接复制给string,尾巴出现多余字符;
int msgarrvd(void* context, char* topic_name, int topicLen, MQTTClient_message* message) { if (topic_name == NULL || message == NULL) { return 0; } std::string str_topic = topic_name; char *data = (char *)malloc(message->payloadlen + 1); if (data == NULL){ return 0; } memcpy(data, message->payload, message->payloadlen); data[message->payloadlen] = '\0';//增加结束符是关键 std::string str_rcv = data; LOGD("Message arrived topic: %s\n, len:%d message:%s\n ", topic_name, message->payloadlen, str_rcv.c_str()); handler_message(str_topic, str_rcv); free(data); MQTTClient_freeMessage(&message); MQTTClient_free(topic_name); return 1; }
4、为了调试上面的问题,着实费了些功夫,工欲善其事必先利其器,毕竟是在新的平台上,一个是gdb工具,另一个是抓包工具tcpdump;
先编译termcap-1.3.1,编译完了,需要将.a放到arm-linux-gnueabihf命令所对应的libc.a的路径下 /home/abc/work/broadcast_app/gdb-7.8.1.tar/gdb-7.8.1 mkdir arm-gdb #./configure --target=arm-linux-gnueabihf --host=arm-linux-gnueabihf --program-prefix=arm-linux-gnueabihf- CC=arm-linux-gnueabihf-gcc --prefix=$PWD/tmp # make && make install alientek@ubuntu:~/broadcast_app/app/thirds_libs_src/mqtt_prj/build$ cmake ../ -DCMAKE_TOOLCHAIN_FILE= ../cmake/arm-linux-setup.cmake #openh264等其他编译 make OS=linux CC=arm-linux-gnueabihf-gcc CXX=arm-linux-gnueabihf-g++ ARCH=arm /home/alientek/broadcast_app/app/thirds_libs_src/pjproject-2.12.1/third_party/openh264-2.3.1 #curl编译完了,需要将curl-config和curl同时放到/usr/sbin路径下,否则不能正常运行。
-------------------广告线---------------
项目、合作,欢迎勾搭,邮箱:promall@qq.com
本文为呱牛笔记原创文章,转载无需和我联系,但请注明来自呱牛笔记 ,it3q.com