4

この質問を読んだことがあるかもしれません: プログラムでシンボルを見つけるために perf を取得するにはどうすればよいですか?

1) 私の質問は:

perf report を使用すると、次のような結果が得られます。

    # Overhead  Command      Shared Object                    Symbol
    #   .  .  
    #
        99.59%     test  test               [.] 0x000003d4          
         0.21%     test  [kernel.kallsyms]  [k] __do_fault          
         0.10%     test  [kernel.kallsyms]  [k] run_timer_softirq   
         0.10%     test  [kernel.kallsyms]  [k] __update_cpu_load   
         0.01%     test  [kernel.kallsyms]  [k] set_task_comm       
         0.00%     test  [kernel.kallsyms]  [k] intel_pmu_enable_all

つまり、パフォーマンスはカーネルでシンボルを見つけることができますが、プログラムでシンボルを見つけることができません。

私のプログラムはここにあります:

     void longa() 
      { 
         int i,j; 
         for(i = 0; i < 1000000; i++) 
        j=i; //am I silly or crazy? I feel boring and desperate. 
      } 


     void foo2() 
     { 
       int i; 
       for(i=0 ; i < 10; i++) 
        longa(); 
     } 

     void foo1() 
     { 
       int i; 
       for(i = 0; i< 100; i++) 
          longa(); 
     } 

    int main(void) 
     { 
       foo1(); 
       foo2(); 
     } 

2)次のようにプログラムをコンパイルしました:

gcc test.c -g -o テスト

私の環境: os:ubuntu カーネル:3.10.9

4

4 に答える 4

5

今日、 を実行するperf testと、 というメッセージが表示されましたvmlinux symtab matches kallsyms: Failed

理由を探していたところ、 の値/proc/sys/kernel/kptr_restrictが 1 であることが原因であることがわかりました。これを に設定すると0、プログラムでシンボルが取得されます。

于 2013-10-29T14:39:59.253 に答える
2

この問題には 2 つの原因が考えられます。

  • perfツールは、elfutils のサポートなしでコンパイルされました
  • perfツールは、ターゲットで libelf.so ライブラリを見つけることができません
于 2014-08-06T08:34:58.567 に答える