JavaScriptを有効にしてください

「Linuxに触れる」パッケージのソースを落としてビルド、デバッグする方法

 ·  ☕ 2 分で読めます

こんな人に読んでほしい。

  • Linux開発に触れてみたい
  • Linux開発始めたいけど、いまいち何から手をつけたらいいか分からない

Linuxのコマンドをデバッグしてみよう。
コマンドのパッケージを特定してソースコードを落としてビルドしてデバックするところまでを実践的に触れることができると思う。

lsコマンドをデバッグしてみる

本記事ではLinuxでよく使うコマンドlsをソースコートを落としてビルド、デバッグまでやってみる。

環境

1
2
3
4
5
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.1 LTS"

コマンドのパッケージを特定

まずは、lsコマンドのパッケージを特定します。

1
2
3
4
$ which ls
/bin/ls
$ dpkg -S /bin/ls
coreutils: /bin/ls

lsoreutilsっていうパッケージに含まれていることが分かりました。

パッケージのソースをダウンロード

ubuntu の公式パッケージであればapt sourceでソースコードをダウンロードできます。
リポジトリからソースをダウンロードするため、sources.listdeb-srcを有効にします。

1
2
$ sudo su -c "grep '^deb ' /etc/apt/sources.list | \
sed 's/^deb/deb-src/g' > /etc/apt/sources.list.d/deb-src.list"

リポジトリを更新しパッケージをダウンロードします。

1
2
$ sudo apt update
$ apt source coreutils

lsをビルドする環境を整える

apt build-depでソースパッケージをビルドするのに必要なソフトウェアをインストールしてくれます。便利。

1
2
$ sudo apt install build-essential
$ sudo apt build-dep coreutils

ビルドする

デバッグしたいので、デバッグ情報付加、最適化しないようにします。

1
2
3
$ cd coreutils-8.28
$ ./configure CFLAGS="-g3 -O0"
$ make

srcディレクトリ配下に実行ファイルが生成されます。

デバッグする

GNUデバッガgdbを使います。$ gdb (実行ファイル名)で起動します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
$ cd src
$ gdb ./ls
(gdb) b main #main()関数にブレークポイントを貼る
Breakpoint 1 at 0x4fc5: file src/ls.c, line 1445.
(gdb) r #実行する
Starting program: /home/coreutils-8.28/src/ls
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".

Breakpoint 1, main (argc=1, argv=0x7fffffffe388) at src/ls.c:1445
1445    {
(gdb) n #ステップ実行する
1451      set_program_name (argv[0]);
(gdb)
1452      setlocale (LC_ALL, "");
(gdb)
1453      bindtextdomain (PACKAGE, LOCALEDIR);

main()関数にブレークポイントを貼ってステップ実行している(デバッグしている)例です。gdbの使い方に関してはマニュアルを参照しましょう。

どうでしょう?たったこれだけですが、Linux開発の基本的なところである、「パッケージのソースを落としてビルド環境整えて、ビルド、デバッグする」という部分に触れることができましたね。

共有

tommy
著者
tommy
Software engineer⭐LPIC-3(304)⭐