• Ubuntu 21.10 安装调试符号


    本文地址:https://www.ebpf.top/post/ubuntu-21-10-dbgsym

    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 我们就可以看到源码相关的定义,一切准备完成,可以愉快地进行相关工作调试了。

    参考

  • 相关阅读:
    Lucene学习总结之二:Lucene的总体架构
    Lucene学习总结之三:Lucene的索引文件格式(1)
    android开发_SeekBar进度条
    android开发_mp3_player音乐播放器
    Lucene学习总结之一:全文检索的基本原理
    android开发_Intent_requestCode_resultCode页面之间的跳转
    android开发_Location位置定位
    .NET Remoting Basic(7)信道
    .NET Remoting Basic(1)概览
    .NET Remoting Basic(5)多服务器访问和程序集共享
  • 原文地址:https://www.cnblogs.com/davad/p/16017450.html
Copyright © 2020-2023  润新知