私は「Ubuntuの」タグに基づいてドッカーコンテナを使用していますし、デバッグシンボルを表示するツールPERFのlinuxを取得することはできません。ここではどのようにドッカーコンテナ内部のLinuxのPERFツールで作業デバッグシンボルを得るのですか?
は、私は、問題を示すためにやっているものです。
まず私はここで対話型シェルと、コンテナを起動します。
docker run -t -i ubuntu:14.04 /bin/bash
その後、コンテナのプロンプトからlinux perfツールをインストールします。私は今perf
ツールを使用することができます
apt-get update
apt-get install -y linux-tools-common linux-tools-generic linux-tools-`uname -r`
。私のカーネルは3.16.0-77-generic
です。
今私は、gcc
をインストールするテストプログラムをコンパイルし、そしてperf record
の下でそれを実行しようとするでしょう。
test.c
にテストプログラムに貼り付ける
apt-get install -y gcc
:次に
#include <stdio.h>
int function(int i) {
int j;
for(j = 2; j <= i/2; j++) {
if (i % j == 0) {
return 0;
}
}
return 1;
}
int main() {
int i;
for(i = 2; i < 100000; i++) {
if(function(i)) {
printf("%d\n", i);
}
}
}
、コンパイル、実行、およびレポート: gcc -g -O0 test.c && perf record ./a.out && perf report
出力は次のようなものになります。 72.38% a.out a.out [.] 0x0000000000000544 8.37% a.out a.out [.] 0x000000000000055a 8.30% a.out a.out [.] 0x000000000000053d 7.81% a.out a.out [.] 0x0000000000000551 0.40% a.out a.out [.] 0x0000000000000540
を実行可能ファイルにはシンボルが含まれていても、シンボルはありませんl情報。ルートになることと行うことによって 96.96% a.out a.out [.] function 0.35% a.out libc-2.19.so [.] [email protected]@GLIBC_2.2.5 0.14% a.out [kernel.kallsyms] [k] update_curr 0.12% a.out [kernel.kallsyms] [k] update_cfs_shares 0.11% a.out [kernel.kallsyms] [k] _raw_spin_lock_irqsave
私はすでにカーネルシンボルをオンにしているホストシステムで:コンテナが正常に動作し、このようなものを示して外に同じ一般的な手順を行う
echo 0 > /proc/sys/kernel/kptr_restrict
コンテナ化されたバージョンを正しく動作させ、デバッグシンボルを表示するにはどうすればよいですか?
ありがとう、それはまさにそれでした。 解決策に追加するには、カーネルシンボルを取得するために、さらに: '--kallsyms =/proc/kallsyms'を追加する必要があります。 –
他の誰かを助ける場合には、より簡単な方法は '-v/var/lib/docker /:/ var/lib/docker'で' docker run'を呼び出すことです。シンボルを正しく解決するための特別な引数。 –
ああ、それは良いものです。 –