開発ツール
バイナリとデバッグ
実行ファイルやライブラリの中身・依存関係を調べる ldd・nm・objdump・readelf と、動きを追う strace・gdb。
ldd依存している共有ライブラリ
実行ファイルがどの共有ライブラリ(.so)を使っているかを表示します。「ライブラリが見つからない」エラーの調査に使います。
$ ldd /usr/bin/curl
$ ldd ./myapp | grep "not found" # 足りないライブラリを探すldconfigライブラリの検索パスを更新する
新しく入れた共有ライブラリをシステムに認識させます。
$ sudo ldconfig # /usr/local/lib などに入れたライブラリを認識させる
$ ldconfig -p | grep libssl # 認識されているライブラリを探すnmシンボル(関数名・変数名)の一覧
Ubuntu には最初から入っていません。 で入れられます。
実行ファイルやライブラリに含まれる関数名・変数名(シンボル)を一覧します。
$ nm -C mylib.a | grep " T " # 定義されている関数(-C で C++ の名前を読みやすく)
$ nm -D /usr/lib/x86_64-linux-gnu/libz.so.1 | headobjdump逆アセンブル・ヘッダーの表示
Ubuntu には最初から入っていません。 で入れられます。
実行ファイルを逆アセンブルしたり、ヘッダーやセクションを表示したりします。
$ objdump -d -M intel ./hello | less # 逆アセンブル(Intel 記法)
$ objdump -p ./hello | grep NEEDED # 必要なライブラリ
$ objdump -h ./hello # セクションの一覧readelfELF ファイルの情報
Ubuntu には最初から入っていません。 で入れられます。
Linux の実行ファイル形式(ELF)の中身を詳しく表示します。
$ readelf -h ./hello # ヘッダー(32/64bit、エントリーポイントなど)
$ readelf -d ./hello # 動的リンクの情報
$ readelf -S ./hello # セクションsize / strip / arサイズ・削減・静的ライブラリ
Ubuntu には最初から入っていません。 で入れられます。
実行ファイルの大きさの内訳を見たり、デバッグ情報を外して小さくしたり、静的ライブラリの中身を見たりします。
$ size ./hello # text / data / bss の大きさ
$ strip ./hello # デバッグ情報を外して小さくする
$ ar t libfoo.a # 静的ライブラリの中身hexdump16進数で表示する
ファイルの中身を16進数で表示します。
$ hexdump -C file.bin | head # 16進数と文字を並べて表示
$ hexdump -n 16 -C file.bin # 先頭16バイトpkg-configライブラリのコンパイルオプション
Ubuntu には最初から入っていません。 で入れられます。
ライブラリを使うプログラムをコンパイルするときに必要なオプションを教えてくれます。
$ pkg-config --cflags --libs libcurl
$ gcc app.c $(pkg-config --cflags --libs libcurl) -o app
$ pkg-config --list-all | grep -i sslstraceシステムコールを追いかける
プログラムがどのファイルを開こうとしているか、どこで止まっているかを調べるのに便利です。
$ strace -f -e trace=openat ./app 2>&1 | grep -v ENOENT # 開いたファイル
$ strace -c ls # システムコールの集計
$ sudo strace -p 1234 # 動いているプロセスにつなぐ
$ strace -e trace=network curl -s example.com >/dev/nullltraceライブラリ関数の呼び出しを追いかける
Ubuntu には最初から入っていません。 で入れられます。
プログラムがどのライブラリ関数を呼んでいるかを追いかけます。
$ ltrace -c ./appgdbデバッガ
Ubuntu には最初から入っていません。 で入れられます。
プログラムを1行ずつ動かしたり、落ちた場所を調べたりするデバッガです。
$ gcc -g -O0 app.c -o app # デバッグ情報付きでコンパイル
$ gdb ./app
(gdb) break main # ブレークポイント
(gdb) run arg1 # 実行
(gdb) next / step # 1行進む / 関数の中に入る
(gdb) print var # 変数を表示
(gdb) bt # 呼び出し履歴(クラッシュしたときに)
(gdb) quit
$ gdb -p 1234 # 動いているプロセスにつなぐjavaJava のプログラムを実行する
Ubuntu には最初から入っていません。 で入れられます。
Java で作られたプログラム(.jar)を実行します。
$ java -version
$ java -jar app.jar
$ java -Xmx2g -jar server.jar nogui # メモリの上限を指定実行するだけなら JRE(openjdk-17-jre)、javac でコンパイルもするなら JDK(openjdk-17-jdk)を入れます。
perlテキスト処理のワンライナー
テキスト処理が得意な言語で、sed や awk の代わりにワンライナーでよく使われます。
$ perl -pi -e 's/foo/bar/g' *.txt # sed -i の代わり(Perl の正規表現が使える)
$ perl -ne 'print if /ERROR/' app.log
$ perl -MJSON::PP -e 'print encode_json({a=>1})'