Hisi 使用GDB调试(远程调试)

环境

宿主机:ubuntu 18.04 x86_64
海思SDK版本:Hi3516EV200_SDK_V1.0.1.2

说明文档:Hi3516EV200_SDK_V1.0.1.2/osdrv/tools/board/gdb/readme.txt

!!! 不知道是否操作有误,测试时发现 7.9.1 版本 gdbserver 调试 next 不进入内部无断点的 if\while\for 等表达式,因此这里重新下载一个高版本的gdb来重新编译。

编译 gdb

tar xvf gdb-8.1.1.tar.gz
cd gdb-8.1.1/
./configure --target=arm-himix100-linux --prefix=/opt/gdb.8.1/ -v
make -j8
make install

重置软连接

rm /opt/hisi-linux/x86-arm/arm-himix100-linux/bin/arm-himix100-linux-gdb
ln -s /opt/gdb.8.1/bin/arm-himix100-linux-gdb /opt/hisi-linux/x86-arm/arm-himix100-linux/bin/arm-himix100-linux-gdb

注意

如果在x86_64平台上使用,需要修改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->pnum == -1)
            continue;
        if (rsa->regs->offset >= rsa->sizeof_g_packet)
            rsa->regs->in_g_packet = 0;
        else
            rsa->regs->in_g_packet = 1;
    }
}
  • 重新编译

编译 gdbserver

cd gdb-8.1.1/gdb/gdbserver/
./configure --target=arm-himix100-linux --host=arm-himix100-linux
make -j8 CC=arm-himix100-linux-gcc
file gdbserver

说明

gdbserver是在板端使用的需要把它拷贝到开发板上,与电脑端的gdb通过网络交互

开始调试

准备测试文件

vi main.c #写一个简单的测试代码
arm-himix100-linux-gcc main.c -o main -g #编译DEBUG版本

把调试文件和 gdbserver 下载到板端,假设宿主机IP:192.168.1.66,板端IP:192.168.1.127,测试端口5000

board

./gdbserver 192.168.1.66:5000 main

ubuntu

./arm-himix100-linux-gdb ./main
(gdb) target remote 192.168.1.127:5000    #连接板端gdbserve
(gdb) set solib-search-path /lib          #指定库搜索路径

调试 SDK

sample/venc为例,需要修改Makefile添加

CFLAGS += -g
CFLAGS := $(filter-out -O2,$(CFLAGS))
posted @ 2021-03-05 20:29  派大海星  阅读(511)  评论(0编辑  收藏  举报