hisi芯片gdp调试
最近买了一个华为SDC相机,想跑跑自己的深度学习模型。相机端调试bug可谓是非常的麻烦,自己也不是计算机出身,原来写的windows程序,通过vsstudio调试开发,非常的方便。第一次接触嵌入式开发,有点不习惯。看到网上有关于通过gpd远程调试的方法,在电脑端调试arm板载程序,所以自己试了一下,效果还算不错,记录一下;
参考1
参考2
环境
宿主机:Ubuntu 20.04 x86_64
相机:华为SDC相机 D2150
gdb版本:gdb8.2
编译gdb
下载 gdb-8.2
解压缩,输入指令解压 tar -vxzf gdb-8.2.tar.gz
进入解压后的目录中 cd gdb-8.2
修改gdb代码
修改gdb/remote.c ,否则运行调试时会出现Remote ‘g’ packet reply is too long错误。
if (buf_len > 2 * rsa->sizeof_g_packet)
error (_(“Remote ‘g’ packet reply is too long: %s”), rs->buf);
修改为:
if (buf_len > 2 * rsa->sizeof_g_packet) {
rsa->sizeof_g_packet = buf_len ;
for (i = 0; i < gdbarch_num_regs (gdbarch); i++) {
if (rsa->regs[i].num == -1)
continue;
if (rsa->regs[i].offset >= rsa->sizeof_g_packet)
rsa->regs[i].in_g_packet = 0;
else
rsa->regs[i].in_g_packet = 1;
}
}
安装交叉编译环境
安装arm-himix200-linux
编译gdb
这个过程有点长
cd gdb-8.2/
./configure --target=arm-himix200-linux --prefix=/opt/gdb.8.2/ -v
make -j8
make install
编译后,在目标路径下出现如下,就是安装成功了;
重置软链接
rm /opt/hisi-linux/x86-arm/arm-himix200-linux/bin/arm-himix200-linux-gdb
ln -s /opt/gdb.8.2/bin/arm-himix200-linux-gdb /opt/hisi-linux/x86-arm/arm-himix200-linux/bin/arm-himix200-linux-gdb
输入命令即可进入gdb调试
编译gdbserver
cd gdb-8.2/gdb/gdbserver/
./configure --target=arm-himix200-linux --host=arm-himix200-linux
make -j8 CC=arm-himix100-linux-gcc
file gdbserver
编译过程可能会出现
arm-himix200-linux-gcc: loadlocale.c:130: _nl_intern_locale_data: Assertion `cnt < (sizeof (_nl_value_type_LC_TIME) / sizeof (_nl_value_type_LC_TIME[0]))' failed.
Aborted (core dumped)
解决办法:
export LC_ALL=C
gdbserver编译也完成了;
使用GDB调试
准备测试文件
测试代码
#include <stdio.h>
int main(){
int times = 10;
while(times > 0){
printf("Hello word!\n");
printf("xixixi!\n");
times--;
}
return 0;
}
交叉编译
arm-himix100-linux-gcc main.c -o main -g #编译DEBUG版本
通过sftp下载到相机,相机ip:192.168.0.120,默认端口:20022
root@***# sftp -oPort=20022 admin@192.168.0.120
admin@192.168.0.120's password:
Connected to 192.168.0.120.
sftp> ls -l
-rwxrwxrwx 1 1000 1000 4719196 Apr 2 03:12 gdbserver // 写文章前上传过了
-rwxrwxrwx 1 1000 1000 74 Apr 2 01:57 main.c
sftp> put /home/**/Documents/test/main ./
Uploading /home/**/Documents/test/main to /home/admin/./main
/home/**/Documents/test/main 100% 14KB 421.2KB/s 00:00
sftp> ls -l
-rwxrwxrwx 1 1000 1000 4719196 Apr 2 03:12 gdbserver
-rwxr-xr-x 1 1000 1000 14032 Apr 2 22:22 main
-rwxrwxrwx 1 1000 1000 74 Apr 2 01:57 main.c
sftp> chmod 777 main
Changing mode on /home/admin/main
sftp> ls -l
-rwxrwxrwx 1 1000 1000 4719196 Apr 2 03:12 gdbserver
-rwxrwxrwx 1 1000 1000 14032 Apr 2 22:22 main
-rwxrwxrwx 1 1000 1000 74 Apr 2 01:57 main.c
进入相机,运行gdbserve程序,192.168.0.100是电脑端ip,5000是电脑端链接端口
root@Huawei:~# cd /home/sftp_admin/home/admin/
root@Huawei:/home/sftp_admin/home/admin# ls -l
-rwxrwxrwx 1 admin 1000 4719196 Apr 2 03:12 gdbserver
-rwxrwxrwx 1 admin 1000 14032 Apr 2 22:22 main
-rwxrwxrwx 1 admin 1000 74 Apr 2 01:57 main.c
root@Huawei:/home/sftp_admin/home/admin# ./gdbserver 192.168.0.100:5000 main
Process /home/sftp_admin/home/admin/main created; pid = 5715
Listening on port 5000
电脑端运行gdb
./arm-himix100-linux-gdb ./main
(gdb) target remote 192.168.1.127:5000 #连接板端gdbserve,192.168.1.127相机ip
(gdb) set solib-search-path /lib #指定库搜索路径
(gdb) continue #运行程序
结果:
电脑端设置断点:
(gdb) l # 查看程序行
1 #include <stdio.h>
2
3 int main(){
4 int times = 10;
5 while(times > 0){
6 printf("hello word!");
7 printf("xixixi\n");
8 times--;
9 }
10 return 0;
(gdb) b 5 # 在第五行设置断点
Breakpoint 1 at 0x10450: file main.c, line 5.
(gdb) target remote 192.168.0.120:5000
(gdb) continue # 运行程序
Continuing.
Reading /lib/a7_softfp_neon-vfpv4/libc.so.6 from remote target...
Breakpoint 1, main () at main.c:5
5 while(times > 0){
(gdb) c
Continuing.
[Inferior 1 (process 18717) exited normally]
到此,电脑端调试相机程序基本完成。
但是,人嘛,能偷懒就偷懒,通过命令进行调试还是不够方便,如果能通过图形用户界面调试就好了;
可以实现!上活!
当然这部分内容还是参看大佬的博客,再次感谢!
VScode 调试
配置lauch.json文件
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) ARM remote debug",
"type": "cppdbg",
"request": "launch",
"program": "/home/qqq/Documents/test/main", #运行程序地址
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": true,
"MIMode": "gdb",
"miDebuggerPath": "arm-himix200-linux-gdb", #调试用的gdb
"miDebuggerServerAddress": "192.168.0.120:5000", #远程相机ip:端口
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
}
]
}
相机端开启后,F5开始调试
继续:
总结
至此,通过vs调试相机端程序算是跑通了,但是实际程序比demo要复杂的多,要涉及库华为sdc服务化接口,实际开发能不能用还另说。只做记录。
追加1
今天测试了相机程序的调试,没有问题,能正常跑,但是makefile文件要增加编译选项-g
CFLAGS =-g
和关掉strip裁剪
# $(STRIP) $(PROGRAM)
通过下面5个窗口就可以debug啦