hana_shinのLinux技術ブログ

Linuxの技術情報を掲載しています。特にネットワークをメインに掲載していきます。

debuginfoパッケージのインストール方法



1 はじめに

カーネルやユーザアプリのdebuginfoパッケージをインストールしてみます。debuginfoパッケージをインストールすると、crashコマンド、gdbコマンド、stapコマンド等でソースコードデバッグが可能になります。

2 検証環境

AlmaLinuxの版数は以下のとおりです。

[root@server ~]# cat /etc/redhat-release
AlmaLinux release 8.6 (Sky Tiger)

カーネル版数は以下のとおりです。

[root@server ~]# uname -r
4.18.0-372.9.1.el8.x86_64

3 カーネルのdebuginfoパッケージのインストール方法

カーネルのdebuginfoパッケージをインストールします。

[root@server ~]# dnf debuginfo-install kernel-debuginfo-4.18.0-372.9.1.el8.x86_64

インストールしたパッケージを確認します。kernel-debuginfoをインストールすると、依存関係によりkernel-debuginfo-commonパッケージもインストールされます。

[root@server ~]# rpm -qa|grep kernel-debuginfo
kernel-debuginfo-common-x86_64-4.18.0-372.9.1.el8.x86_64
kernel-debuginfo-4.18.0-372.9.1.el8.x86_64

kernel-debuginfoをインストールすると、下記ディレクトリ配下にソースもインストールされます。

[root@server linux-4.18.0-372.9.1.el8.x86_64]# pwd
/usr/src/debug/kernel-4.18.0-372.9.1.el8/linux-4.18.0-372.9.1.el8.x86_64

次にcrashパッケージをインストールします。

[root@server ~]# dnf install crash

crashコマンドを実行します。

[root@server ~]# crash
-snip-
crash> sys
      KERNEL: /usr/lib/debug/lib/modules/4.18.0-372.9.1.el8.x86_64/vmlinux
    DUMPFILE: /proc/kcore
        CPUS: 4
        DATE: Fri Jul 29 07:27:32 EDT 2022
      UPTIME: 01:18:00
LOAD AVERAGE: 0.44, 0.15, 0.05
       TASKS: 163
    NODENAME: server
     RELEASE: 4.18.0-372.9.1.el8.x86_64
     VERSION: #1 SMP Tue May 10 08:57:35 EDT 2022
     MACHINE: x86_64  (2808 Mhz)
      MEMORY: 4 GB

disコマンドを実行して、ip_rcv関数の逆アセンブルを表示してみます。関数名が表示されていることがわかります。

crash> dis ip_rcv
0xffffffff98e76f30 <ip_rcv>:    nopl   0x0(%rax,%rax,1) [FTRACE NOP]
0xffffffff98e76f35 <ip_rcv+5>:  push   %r13
0xffffffff98e76f37 <ip_rcv+7>:  push   %r12
-snip-

4 httpdのdebuginfoパッケージのインストール方法

httpdの版数を確認します。

[root@server ~]# rpm -qa|grep httpd
httpd-2.4.37-47.module_el8.6.0+2935+fb177b09.2.x86_64
-snip-

httpdのdebuginfoパッケージをインストールします。

[root@server ~]# dnf debuginfo-install httpd-debuginfo-2.4.37-47.module_el8.6.0+2935+fb177b09.2.x86_64

httpdのdebuginfoパッケージをインストールすると、debuginfoパッケージとdebugsourceパッケージがインストールされることがわかります。

[root@server ~]# rpm -qa|grep httpd
httpd-2.4.37-47.module_el8.6.0+2935+fb177b09.2.x86_64
httpd-debuginfo-2.4.37-47.module_el8.6.0+2935+fb177b09.2.x86_64
httpd-debugsource-2.4.37-47.module_el8.6.0+2935+fb177b09.2.x86_64
-snip-

httpd-debuginfoをインストールすると、下記ディレクトリ配下にソースもインストールされます。

[root@server httpd-2.4.37-47.module_el8.6.0+2935+fb177b09.2.x86_64]# pwd
/usr/src/debug/httpd-2.4.37-47.module_el8.6.0+2935+fb177b09.2.x86_64

httpdサービスを起動します。

[root@server ~]# systemctl start httpd

psコマンドを実行して、httpdのPIDを確認します。なお、psコマンドの使い方は、psコマンドの使い方 - hana_shinのLinux技術ブログを参照してください。

[root@server ~]# ps -C httpd -o comm,pid,ppid,args
COMMAND             PID    PPID COMMAND
httpd              1794       1 /usr/sbin/httpd -DFOREGROUND
httpd              1795    1794 /usr/sbin/httpd -DFOREGROUND
httpd              1796    1794 /usr/sbin/httpd -DFOREGROUND
httpd              1797    1794 /usr/sbin/httpd -DFOREGROUND
httpd              1798    1794 /usr/sbin/httpd -DFOREGROUND

gdbコマンドを実行します。ここでは、httpdの親プロセスに対してgdbを実行してみます。

[root@server ~]# gdb -p 1794

btコマンドを実行します。関数名、引数が表示されていることがわかります。

(gdb) bt
#0  0x00007f0de168a1db in select () from target:/lib64/libc.so.6
#1  0x00007f0de1d78919 in apr_sleep () from target:/lib64/libapr-1.so.0
#2  0x0000560d51f81b4d in ap_wait_or_timeout (status=status@entry=0x7ffebc94cce8,
    exitcode=exitcode@entry=0x7ffebc94ccec, ret=ret@entry=0x7ffebc94ccf0, p=<optimized out>, s=<optimized out>)
    at mpm_common.c:201
#3  0x00007f0dd6853041 in server_main_loop (num_buckets=1, remaining_children_to_start=0) at event.c:2904
#4  event_run (_pconf=<optimized out>, plog=<optimized out>, s=<optimized out>) at event.c:3082
#5  0x0000560d51f8115e in ap_run_mpm (pconf=0x560d5289da18, plog=0x560d528cac38, s=0x560d528c6cc0) at mpm_common.c:94
#6  0x0000560d51f79733 in main (argc=<optimized out>, argv=<optimized out>) at main.c:819

Z 参考情報

私が業務や記事執筆で参考にした書籍を以下のページに記載します。
Linux技術のスキルアップをしよう! - hana_shinのLinux技術ブログ