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技術ブログ