Ubuntu 21.10 安装调试符号

简介: Ubuntu 21.10 安装调试符号

1. 背景


Linux 内核中的调试符号包含源代码级别的信息,如函数名称、函数调用约定、以及源代码行号到指令的映射。这些信息在调试或剖析内核的时候非常有用。在本文中,我将展示如何在 Ubuntu 上获得任何内核的调试符号。


通常来说,有 2 种方法可以使用调试符号:


  1. 使用源码构建带有调试符号的内核源代码,通常适用于自己修改源码编译的场景,构建内核的过程依据编译选项,一般会耗费比较长的时间;
  2. 使用现成包含编译好的调试符号包进行安装;

这里主要讨论安装调试符号包的方式,包括手动下载安装和第三方源安装的方式。

本地的环境为 Ubuntu 21.10 版本,代号为 impish,内核版本如下所示:


$ uname -a
Linux ubuntu21-10 5.13.0-20-generic #20-Ubuntu SMP Fri Oct 15 14:21:35 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux


2. 手动搜索下载安装


首先我们可以从 Ubuntu 官方网址 中进行调试符号安装包,其中 impish 为 Ubuntu 21.10 的代号。搜索的时候可以使用 "linux-image-unsigned-`uname -r`-dbgsym" 作为关键词,uname -r 为本地安装的内核版本,需要搜索前进行运行替换。


5.13.0-20-generic 版本可以直接下载 linux-image-unsigned-5.13.0-20-generic-dbgsym_5.13.0-20.20_amd64.ddeb


3. 使用第三方源安装


步骤 1:GPG 秘钥导入


请确保已经导入系统的 GPG 密钥。对于 Ubuntu 16.04 及以上版本:


$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys C8CAB6595FDFF622


其他旧的版本命令如下:


$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys ECDCAD72428D7C01


步骤 2:添加仓库配置


$ codename=$(lsb_release -c | awk  '{print $2}')  
sudo tee /etc/apt/sources.list.d/ddebs.list << EOF  
deb http://ddebs.ubuntu.com/ ${codename}      main restricted universe multiverse  
deb http://ddebs.ubuntu.com/ ${codename}-security main restricted universe multiverse  
deb http://ddebs.ubuntu.com/ ${codename}-updates  main restricted universe multiverse  
deb http://ddebs.ubuntu.com/ ${codename}-proposed main restricted universe multiverse  
EOF


步骤 3:更新安装包


$ sudo apt-get update


步骤 4:安装调试符号包


$ sudo apt-get install linux-image-$(uname -r)-dbgsym


步骤 5: 验证符号包已经成功安装


包含调试信息的文件被称为 vmlinux-XXX-debug,其中 XXX 是内核版本。安装完成后该文件存储在 /usr/lib/debug/boot 下。


ubuntu21-10:/usr/lib/debug/boot$ ls -hl
total 773M
-rw-r--r-- 1 root root 773M Oct 15 21:53 vmlinux-5.13.0-20-generic


如果我们想查看 __x64_sys_mount 的汇编指令,则可以使用 gdb vmlinux-5.13.0-20-generic 进入到 gdb 调试工作区,使用 list/disassemble 等命令进行查看。


4. 源码安装及关联


为了将调试符号与源码关联查看,我们还需要安装源码,然后与安装的 dbgsym 进行关联。


$ sudo apt-cache search linux-source
linux-source - Linux kernel source with Ubuntu patches
linux-source-5.13.0 - Linux kernel source for version 5.13.0 with Ubuntu patches
$ sudo apt install linux-source-5.13.0
$ sudo cd /usr/src
$ sudo tar -jxvf linux-source-5.13.0.tar.bz2
$ sudo cd /usr/src/linux-source-5.13.0


5. 最终调测效果



# 需要 gdb 首先获取到 vmlinux-5.13.0-20-generic 的编译目录,使用 list *__x64_sys_mount
# 会提示对应的编译目录,如果我们在 /usr/src 目录已经安装了源码,建立快捷方式即可
$ mkdir -p /build/linux-lpF6wX/
$ ln -s /usr/src/linux-source-5.13.0 /build/linux-lpF6wX/linux-5.13.0 
$ gdb /usr/lib/debug/boot/vmlinux-5.13.0-20-generic
(gdb) list *__x64_sys_mount
0xffffffff81352ce0 is in __x64_sys_mount (/build/linux-lpF6wX/linux-5.13.0/fs/namespace.c:3451).
warning: Source file is more recent than executable.
3446    /* ... and return the root of (sub)tree on it */
3447    return path.dentry;
3448  }
3449  EXPORT_SYMBOL(mount_subtree);
3450
3451  SYSCALL_DEFINE5(mount, char __user *, dev_name, char __user *, dir_name,
3452      char __user *, type, unsigned long, flags, void __user *, data)
3453  {
3454    int ret;
3455    char *kernel_type;
(gdb) disassemble *__x64_sys_mount
...
   0xffffffff81352de3 <+259>: call   0xffffffff813524c0 <path_mount>
   0xffffffff81352de8 <+264>: lea    -0x40(%rbp),%rdi
   0xffffffff81352dec <+268>: movslq %eax,%r12
   0xffffffff81352def <+271>: call   0xffffffff813321b0 <path_put>
...


通过在 gdb 工作窗口中 list *__x64_sys_mount 我们就可以看到源码相关的定义,一切准备完成,可以愉快地进行相关工作调试了。


参考


相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
目录
相关文章
|
24天前
|
缓存 Ubuntu Linux
Linux中yum、rpm、apt-get、wget的区别,yum、rpm、apt-get常用命令,CentOS、Ubuntu中安装wget
通过本文,我们详细了解了 `yum`、`rpm`、`apt-get`和 `wget`的区别、常用命令以及在CentOS和Ubuntu中安装 `wget`的方法。`yum`和 `apt-get`是高层次的包管理器,分别用于RPM系和Debian系发行版,能够自动解决依赖问题;而 `rpm`是低层次的包管理工具,适合处理单个包;`wget`则是一个功能强大的下载工具,适用于各种下载任务。在实际使用中,根据系统类型和任务需求选择合适的工具,可以大大提高工作效率和系统管理的便利性。
123 25
|
7天前
|
NoSQL Ubuntu 网络安全
在 Ubuntu 20.04 上安装和配置 Redis
在 Ubuntu 20.04 上安装和配置 Redis 的步骤如下:首先更新系统包,然后通过 `apt` 安装 Redis。安装后,启用并启动 Redis 服务,检查其运行状态。可选配置包括修改绑定 IP、端口等,并确保防火墙设置允许外部访问。最后,使用 `redis-cli` 测试 Redis 功能,如设置和获取键值对。
22 1
|
13天前
|
Ubuntu TensorFlow 算法框架/工具
如何在Ubuntu上安装TensorFlow 24.04
如何在Ubuntu上安装TensorFlow 24.04
38 1
|
1月前
|
Ubuntu API 网络虚拟化
ubuntu22 编译安装docker,和docker容器方式安装 deepseek
本脚本适用于Ubuntu 22.04,主要功能包括编译安装Docker和安装DeepSeek模型。首先通过Apt源配置安装Docker,确保网络稳定(建议使用VPN)。接着下载并配置Docker二进制文件,创建Docker用户组并设置守护进程。随后拉取Debian 12镜像,安装系统必备工具,配置Ollama模型管理器,并最终部署和运行DeepSeek模型,提供API接口进行交互测试。
378 15
|
7天前
|
Ubuntu Linux Docker
如何在Ubuntu 20.04系统中安装Docker
安装 Docker 引擎的步骤如下:首先更新系统包索引 (`sudo apt update`),安装必要依赖包 (`apt-transport-https` 等),添加 Docker 官方 GPG 密钥及 APT 仓库。接着再次更新包索引并安装 Docker 引擎及相关工具 (`docker-ce` 等)。最后启动 Docker 服务并设置开机自启,通过 `docker --version` 和运行测试容器 (`sudo docker run hello-world`) 验证安装是否成功。
65 0
|
2月前
|
弹性计算 Ubuntu Java
OS-Copilot-ubuntu镜像版本的具体测试使用(安装方式有单独注明)
作为一名个人开发者,我主要负责云资源的运维和管理。在使用OS Copilot的过程中,我遇到了一些配置问题,特别是在ECS实例中设置AccessKey时,但最终成功解决了。通过使用OS Copilot的-t/-f/管道功能,我大大提升了效率,减少了命令编写的工作量,特别是在搭建Java运行环境时效果显著。此外,| 功能帮助我快速理解文档,整体体验非常流畅,推荐给其他开发者使用。
62 6
|
3月前
|
JSON Ubuntu 开发者
ubuntu 22安装lua环境&&编译lua cjson模块
通过上述步骤,可以在 Ubuntu 22.04 系统上成功安装 Lua 环境,并使用 LuaRocks 或手动编译的方式安装 lua-cjson 模块。本文详细介绍了每一步的命令和操作,确保每一步都能顺利完成,适合需要在 Ubuntu 系统上配置 Lua 开发环境的开发者参考和使用。
270 13
|
3月前
|
监控 关系型数据库 MySQL
Ubuntu24.04安装Librenms
此指南介绍了在Linux系统上安装和配置LibreNMS网络监控系统的步骤。主要内容包括:安装所需软件包、创建用户、克隆LibreNMS仓库、设置文件权限、安装PHP依赖、配置时区、设置MariaDB数据库、调整PHP-FPM与Nginx配置、配置SNMP及防火墙、启用命令补全、设置Cron任务和日志配置,最后通过网页完成安装。整个过程确保LibreNMS能稳定运行并提供有效的网络监控功能。
|
4月前
|
Ubuntu 开发工具 git
Ubuntu安装homebrew的完整教程
本文介绍了如何在没有公网的情况下安装 Homebrew。首先访问 Homebrew 官网,然后通过阿里云的镜像克隆安装脚本,并创建普通用户进行安装。接着修改 `install.sh` 文件指向国内镜像,执行安装命令。最后配置环境变量并更换 Homebrew 源为国内镜像,确保安装顺利。
940 50
|
3月前
|
Ubuntu Linux Docker
Ubuntu22.04上Docker的安装
通过以上详细的安装步骤和命令,您可以在Ubuntu 22.04系统上顺利安装
1564 12