gdb工具分享

现已直接提取了gdb工具。在下面git仓库"gdb_tool/"目录下,可以直接copy到bmc环境中使用。

感兴趣的伙伴可以往后看制作流程

相关的配置已放gitcode上,可以参考使用
gdb_related - AtomGit | GitCode

gdb_related

GDB、gdbserver、GMP、MPFR 的 Conan 配方,用于在 BMC 交叉编译环境构建。

本地源码包(离线构建)

若编译环境无法访问外网,可先将以下文件下载到能上网的机器,再拷贝到对应目录:

文件名 放置路径(相对 gdb_related
GMP gmp-6.3.0.tar.xz gmp/gmp-6.3.0.tar.xz
MPFR mpfr-4.2.2.tar.xz mpfr/mpfr-4.2.2.tar.xz
GDB gdb-16.2.tar.xz gdb/gdb-16.2.tar.xz

下载地址示例:

本地优先:若存在 <root>/gdb_related/<包>/<文件名>root 默认 /workdir,可通过 CONAN_GDB_RELATED_ROOT 覆盖),则使用本地文件,否则从网络下载。也可用 GMP_LOCAL_SOURCE / MPFR_LOCAL_SOURCE / GDB_LOCAL_SOURCE 指定绝对路径。

构建顺序

gdb_related 同级目录执行(或 -pr profile.ini 指向你的 profile):

# 0. 离线时:将 gmp/mpfr/gdb 的 tar.xz 放到 gdb_related 对应子目录,或设置 *_LOCAL_SOURCE

# 1. GMP(无依赖)
cd gdb_related/gmp/all
conan create . --version=6.3.0 --user=openubmc --channel=stable -pr profile.ini

# 2. MPFR(依赖 GMP)
cd ../../mpfr/all
conan create . --version=4.2.2 --user=openubmc --channel=stable -pr profile.ini

# 3. GDB(依赖 GMP、MPFR)
cd ../../gdb/all
conan create . --version=13.2 --user=openubmc --channel=stable -pr profile.ini

# 4. gdbserver(gdbserver,不依赖GMP/MPFR,可直接构建)
cd ../../gdbserver/all
conan create . --version=16.2 --user=openubmc --channel=stable -pr profile.ini

GCC 7 工具链说明

GDB 16.2GCC 7.x 存在兼容问题(std::optional + 非可拷贝类型,GCC#81190),构建时会报 dwarf2_queue_item 相关错误。

若使用 /opt/hcc_arm64le 等 GCC 7 工具链,请改用 GDB 13.2

GDB 16.2 需 GCC 8+ 方可顺利编译。

目录结构

gdb_related/
├── README.md
├── gmp/
│   ├── config.yml
│   ├── all/
│   │   ├── conanfile.py
│   │   └── conandata.yml
│   └── gmp-6.3.0.tar.xz
├── mpfr/
│   ├── config.yml
│   ├── all/
│   │   ├── conanfile.py
│   │   └── conandata.yml
│   └── mpfr-4.2.2.tar.xz
├── gdbserver/
│   ├── config.yml
│   └── all/
│       ├── conanfile.py
│       ├── conandata.yml
│       └── permissions.ini
└── gdb/
    ├── config.yml
    ├── all/
    │   ├── conanfile.py
    │   ├── conandata.yml
    │   └── permissions.ini
    └── gdb-13.2.tar.xz
    └── gdb-16.2.tar.xz

构建注意点

仓库中的脚本默认寻找本地"/workdir"下的软件包,使用时将conanfile.py中的目录改成自己对应目录即可

if not local_file:
            root = os.environ.get("CONAN_GDB_RELATED_ROOT", "/workdir")

mpfr依赖gmp,gdb又依赖前面两者,所以对应py下面的requires需要指定一下(如果构建时–user参数不同,或者用不同版本的软件包)

    requires = "gmp/6.3.0@openubmc/stable"

    requires = ("gmp/6.3.0@openubmc/stable", "mpfr/4.2.2@openubmc/stable")

如何使用

manifest带上这三个组件,编译即可

  - conan: gdb/13.2@openubmc.common/stable
  - conan: mpfr/4.2.2@openubmc.common/stable
  - conan: gmp/6.3.0@openubmc.common/stable

gdb默认放在了bmc的/opt/debug/gdb
/opt/debug/gdb /opt/bmc/apps/devmon/devmon /data/var/coredump/core-io-0-11-20260126032706

提取编译出的gdb执行文件

root@307af75910fa:/workdir# ls ~/.conan2/p/b/gdbd80ebf6e217a6/p/opt/debug/ -al
total 172552
drwxr-xr-x 2 root root      4096 Jan 30 03:20 .
drwxr-xr-x 3 root root      4096 Jan 29 07:18 ..
-rwxr-xr-x 1 root root 166781312 Jan 29 07:18 gdb

conan构建的目录下会有一个比较大的gdb,这是带符号的版本,用下面命令剥离就可以拿到我们要的gdb了

/opt/hcc_arm64le/bin/aarch64-target-linux-gnu-strip gdb -o gdb-strip

root@307af75910fa:/workdir# ls ~/.conan2/p/b/gdbd80ebf6e217a6/p/opt/debug/ -al
total 172552
drwxr-xr-x 2 root root      4096 Jan 30 03:20 .
drwxr-xr-x 3 root root      4096 Jan 29 07:18 ..
-rwxr-xr-x 1 root root 166781312 Jan 29 07:18 gdb
-rwxr-xr-x 1 root root   9894344 Jan 30 03:20 gdb-strip

参考文档

openUBMC调试工具安装指导 - CICD SIG - openUBMC 论坛
busybox作为conan组件编入openUBMC实践分享 - 交流互助区 - openUBMC 论坛
伙伴在场外如何分析解决corddump问题 - bmc_core SIG - openUBMC 论坛
在家就可以愉快的解OpenUBMC core dump 方法 - bmc_core SIG - openUBMC 论坛

之前调试coredump的时候只需要把gdb拷贝进来就可以使用,你这种方式为什么要引入mpfr和gmp,这两个组件的作用是啥

我在编译gdb的时候,编译依赖这两个,不然会编译失败。manifest下面去掉这两个不知道是否会影响

其实gdb这种感觉需要的时候手动拷贝,使用更灵活方便,你放个gdb的下载链接吧