1.问题
CG03 运行vehicle就退出,但是vehicle在别的车上运行良好
2分析
利用gdb调试,发现在#1 0x00027d1c in HAL_SetDeviceName (device_name=0x0) 设备名称为0导致mqtt库链接溢出导致段错误。
Type "apropos word" to search for commands related to "word".
(gdb) target remote:1234
Remote debugging using :1234
Reading /data/vehicle from remote target...
warning: File transfers from remote targets can be slow. Use "set sysroot" to access files locally instead.
Reading /data/vehicle from remote target...
Reading symbols from target:/data/vehicle...done.
0x00010360 in _start ()
(gdb) c
Continuing.
[New Thread 1976.2289]
[New Thread 1976.2288]
[New Thread 1976.2290]
[New Thread 1976.2291]
[New Thread 1976.2292]
[New Thread 1976.2293]
[New Thread 1976.2294]
Thread 2 "vehicle" received signal SIGSEGV, Segmentation fault.
[Switching to Thread 1976.2289]
0x0007e9e4 in strlen ()
(gdb) bt
#0 0x0007e9e4 in strlen ()
#1 0x00027d1c in HAL_SetDeviceName (device_name=0x0)
at /home/code/LinkKitSDK/c-sdk-v2.3.0-fc20ef7e6d00b8e3a1a33b732f2effd5447a26b8c-sdk.git/src/ref-impl/hal/os/ubuntu/HAL_OS_linux.c:255
#2 0xf784000e in ?? ()
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
(gdb) f 1
#1 0x00027d1c in HAL_SetDeviceName (device_name=0x0)
at /home/code/LinkKitSDK/c-sdk-v2.3.0-fc20ef7e6d00b8e3a1a33b732f2effd5447a26b8c-sdk.git/src/ref-impl/hal/os/ubuntu/HAL_OS_linux.c:255
255 /home/code/LinkKitSDK/c-sdk-v2.3.0-fc20ef7e6d00b8e3a1a33b732f2effd5447a26b8c-sdk.git/src/ref-impl/hal/os/ubuntu/HAL_OS_linux.c: No such file or directory.
(gdb) f 1
#1 0x00027d1c in HAL_SetDeviceName (device_name=0x0)
at /home/code/LinkKitSDK/c-sdk-v2.3.0-fc20ef7e6d00b8e3a1a33b732f2effd5447a26b8c-sdk.git/src/ref-impl/hal/os/ubuntu/HAL_OS_linux.c:255
255 in /home/code/LinkKitSDK/c-sdk-v2.3.0-fc20ef7e6d00b8e3a1a33b732f2effd5447a26b8c-sdk.git/src/ref-impl/hal/os/ubuntu/HAL_OS_linux.c
(gdb) f 0
#0 0x0007e9e4 in strlen ()
(gdb) f 1
#1 0x00027d1c in HAL_SetDeviceName (device_name=0x0)
at /home/code/LinkKitSDK/c-sdk-v2.3.0-fc20ef7e6d00b8e3a1a33b732f2effd5447a26b8c-sdk.git/src/ref-impl/hal/os/ubuntu/HAL_OS_linux.c:255
255 in /home/code/LinkKitSDK/c-sdk-v2.3.0-fc20ef7e6d00b8e3a1a33b732f2effd5447a26b8c-sdk.git/src/ref-impl/hal/os/ubuntu/HAL_OS_linux.c
(gdb) bt
#0 0x0007e9e4 in strlen ()
#1 0x00027d1c in HAL_SetDeviceName (device_name=0x0)
at /home/code/LinkKitSDK/c-sdk-v2.3.0-fc20ef7e6d00b8e3a1a33b732f2effd5447a26b8c-sdk.git/src/ref-impl/hal/os/ubuntu/HAL_OS_linux.c:255
#2 0xf784000e in ?? ()
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
(gdb)
后来查看 mqtt_client_info.txt 里面的内容,发现缺少两个字段DeviceName和 DeviceSecret
Android Download Music Notifications Pictures Ringtones neolixmqtt ping.txt videoRecorder
sabresd_6dq:/sdcard # cd neolixmqtt/
sabresd_6dq:/sdcard/neolixmqtt # ls
mqtt_client_info.txt
sabresd_6dq:/sdcard/neolixmqtt # cat mqtt_client_info.txt
{"product_key":"a1kYolDPGoj","product_secret":"m6qS9W5zaF62c851"}sabresd_6dq:/sdcard/neolixmqtt #
sabresd_6dq:/sdcard/neolixmqtt # exit
jiange@ubuntu:/home/code/test/6.9.1/6.9.1.1/pduVehicle$ adb disconnect
这个文件是云龙视频的进程创建的
3.解决
云龙那里加上这两个字段,但是暴漏出一个问,vehicle代码不够健壮,还存在问题。应该在找不到相应的字段后要防止再进行mqtt的线程链接,要把错误记录在日志中,这样vehicle不会退出啦,但是要把错误记录到日志中。