hisi芯片gdp调试

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啦
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值