Bagaimana cara membuat 'perf record' linux berfungsi untuk libc dan libstdc ++ simbol?

12

Saya menggunakan perf record -gdi x86-64 Linux untuk membuat profil suatu program. Beberapa simbol dalam libc atau libstdc ++ memiliki 0sebagai induk: __GI___strcmp_ssse3(libc) dan strcmp@plt(libstdc ++) misalnya. (Saya benar-benar dapat mematahkan simbol-simbol ini di debugger dan mendapatkan backtrace.)

Saya ingin tahu apa penelepon utama dari fungsi-fungsi ini, dan mengapa mereka tidak direkam. Apakah ini karena libc dan libstdc ++ tidak memiliki frame pointer di x86_64? Dan, lebih praktisnya, apakah ada jalan keluarnya?

Benjamin Redelings
sumber

Jawaban:

5

Ini adalah pertanyaan lama, tetapi ini sekarang mungkin dengan --call-graph dwarf. Dari halaman manual:

 -g
       Enables call-graph (stack chain/backtrace) recording.

   --call-graph
       Setup and enable call-graph (stack chain/backtrace) recording, implies -g.

           Allows specifying "fp" (frame pointer) or "dwarf"
           (DWARF's CFI - Call Frame Information) as the method to collect
           the information used to show the call graphs.

           In some systems, where binaries are build with gcc
           --fomit-frame-pointer, using the "fp" method will produce bogus
           call graphs, using "dwarf", if available (perf tools linked to
           the libunwind library) should be used instead.

Saya percaya ini membutuhkan kernel Linux yang agak baru (> = 3,9? Saya tidak sepenuhnya yakin). Anda dapat memeriksa apakah paket perf distro Anda terhubung dengan libdw atau libunwind readelf -d $(which perf) | grep -e libdw -e libunwind. Pada Fedora 20, perf dikaitkan dengan libdw.

ajduff574
sumber
perf record --call-graph dwarfMemecahkan masalah ini untuk saya. Sayangnya, tampaknya perf memiliki masalah yang menunjukkan grafik panggilan berbasis penelepon (yaitu "terbalik") ketika menggunakan informasi katai. Itu sebabnya saya mulai menggunakan FlameGraph untuk visualisasi.
biru
perhatikan bahwa menggunakan kurcaci yang
membuka gulungan
-2

perfadalah alat kernel yang menunjukkan waktu yang telah berlalu untuk panggilan sistem. Anda mencari gprof GNU. "gprof - tampilkan data profil grafik panggilan". Untuk menggunakan gprof, Anda perlu mengkompilasi sumber Anda dengan-pg switch.

Selain itu ada banyak alat profil canggih seperti eclipse-cdt-profiling-framework.


sumber