2015-12-11 12 views
6

Tôi muốn chụp ảnh một số chương trình sau khi tôi thấy this nói chuyện từ CppCon 2015. Tôi đã tải xuống cùng thư viện điểm chuẩn của Google mà anh chàng sử dụng trong cuộc trò chuyện, biên dịch chương trình của tôi bằng các công tắc thích hợp , liên kết nó với nó, sau đó sử dụng perf để ghi lại một chạy. Các tùy chọn báo cáo mang lại cho tôi điều này:Perf hiển thị tên chức năng bị xáo trộn

enter image description here

Như bạn có thể nhìn thấy tên chức năng không phải là rất có thể đọc được. Tôi giả định điều này đã làm với C++ manglingling tên. Thật thú vị, tất cả các tên hàm hiển thị chính xác trong video cho người đã nói chuyện, nhưng không phải cho tôi. Tôi không nghĩ rằng đó là một trường hợp hoàn toàn thiếu thông tin biểu tượng bởi vì tôi sẽ chỉ nhìn thấy địa chỉ bộ nhớ trong trường hợp đó. Vì lý do nào đó, perf không thể "hoàn tác" tên mang tên C++ cho tôi, và điều này thật khó chịu khi nhìn vào.

Tôi đang sử dụng gcc (g ++) phiên bản 5.2.1, perf là ​​phiên bản 4.2.6, và tôi sử dụng những công tắc khi biên dịch:

-I<my own include path> -L<path to the benchmark library> -O3 -std=c++14 -gdwarf-2 -fno-rtti -Wall -pedantic -lbenchmark -pthread

Lý do tại sao tôi không sử dụng -fno-omit-frame-pointer là tôi sử dụng tùy chọn -gdwarf-2 thay vào đó, để lại thông tin gỡ lỗi trong tệp thực thi lùn, đây là một thay thế cho việc rời khỏi con trỏ khung trong trường hợp này. Điều này cũng có nghĩa là tôi vượt qua --call-graph "dwarf" đến perf record. Dù sao, tôi đã thử phương pháp con trỏ khung là tốt, và nó cho kết quả tương tự, vì vậy điều này không quan trọng thực sự.

Vậy tại sao bạn không hoàn thiện "hoàn tác" tên xén tên C++ trong trường hợp này? Điều này có liên quan đến việc sử dụng GCC không, điều này có nghĩa là tôi đang sử dụng libstdC++?

+1

Tôi đang sử dụng Arch Linux và 'perf report' cho thấy biểu tượng chính xác. Trang man cho perf cũng cho thấy có một tùy chọn '--demangle' được kích hoạt mặc định. Vì tôi không nhìn thấy hành vi giống như bạn không có câu trả lời, nhưng những gì bạn đang thấy không phải là hành vi mặc định. –

+0

Tôi đã thử thêm chuyển đổi đó theo cách thủ công, nhưng nó không thay đổi bất cứ điều gì – adam10603

+0

@GabrielSouthern Bạn đang sử dụng gcc? – adam10603

Trả lời

1

Khi perf report cung cấp cho bạn tên đọc sai như _Z*, _ZN*, _ZL* vv, nó có nghĩa là công cụ perf của bạn đã được biên soạn mà không cần truy cập vào chức năng demangling hoặc với nó tàn tật. Có mã để phát hiện demangler trong Makefiles:

http://elixir.free-electrons.com/linux/v4.2.6/source/tools/perf/Makefile.perf

# Define NO_DEMANGLE if you do not want C++ symbol demangling. 
# Define NO_LIBELF if you do not want libelf dependency (e.g. cross-builds) 

http://elixir.free-electrons.com/linux/v4.2.6/source/tools/perf/config/Makefile

ifdef NO_LIBELF 
... 
    NO_DEMANGLE := 1 
... 
else 
    ifeq ($(feature-libelf), 0) 
    ifeq ($(feature-glibc), 1) 
     LIBC_SUPPORT := 1 
    endif 
    ... 
    ifeq ($(LIBC_SUPPORT),1) 
     ... 
     NO_DEMANGLE := 1 
    ... 

thử nghiệm nằm trong thư mục tools/build/feature: http://elixir.free-electrons.com/linux/v4.2.6/source/tools/build/feature và tính năng libelf được kích hoạt nếu chương trình thử nghiệm sử dụng elf_begin chức năng của libelf (<libelf.h> header of elfutils package, -lelf liên kết) có sẵn (và trả về một cái gì đó? Là có chạy thử nghiệm? Những gì về cross- được xây dựng khi máy xây dựng hạt nhân không thể chạy các tệp nhị phân elf máy đích trực tiếp bằng ./test-libelf.bin và phải sử dụng ssh cho máy thực hoặc một số người dùng/hệ thống qemu?).

Và mã trong việc thực hiện Perf để làm demangling (sử dụng cplus_demangle nếu HAVE_CPLUS_DEMANGLE_SUPPORT xác định, sử dụng không demangle được NO_DEMANGLE được thiết lập sau khi Makefiles, sử dụng bfd.h và bfd_demangle chức năng docs - 2.3.1.24 bfd_demangle): http://elixir.free-electrons.com/linux/v4.2.6/source/tools/perf/util/symbol-elf.c#L19

#ifdef HAVE_CPLUS_DEMANGLE_SUPPORT 
extern char *cplus_demangle(const char *, int); 

static inline char *bfd_demangle(void __maybe_unused *v, const char *c, int i) 
{ 
    return cplus_demangle(c, i); 
} 
#else 
#ifdef NO_DEMANGLE 
static inline char *bfd_demangle(void __maybe_unused *v, 
       const char __maybe_unused *c, 
       int __maybe_unused i) 
{ 
    return NULL; 
} 
#else 
#define PACKAGE 'perf' 
#include <bfd.h> 
#endif 

này tất cả là hơi lạ (vẫn không có chức năng tiêu chuẩn c + + demangle trong Linux thế giới trong bài C + + 11 epoch?). Và mức độ hoàn thiện của bạn bị miscompiled hoặc định cấu hình sai - đó là lý do tại sao nó không làm hỏng tên.billyw linked answer bởi Michal Fapso cho biết đây là lỗi 1396654 của ubuntu - https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1396654.

Bạn có thể làm Hack sản lượng lọc của Perf với chương trình c++filt nhưng nó ngăn bạn sử dụng mặc định tương tác TUI giao diện của Perf (ADD less hoặc gửi thư cho tập tin văn bản để xem danh sách rất dài với PageDown bình thường/PageUp):

perf report | c++filt | less 
perf annotate function_name | c++filt | less 
# or: perf annotate -s function_name | c++filt | less 

Hoặc bạn có thể cập nhật/biên dịch lại perf của bạn như đề nghị của billyw trong his comment

4^dường như bạn trên Ubuntu. Tôi nghi ngờ rằng đây là vấn đề và giải pháp của bạn: https://stackoverflow.com/a/34061874/2166274 - billyw Mar 3 '16 at 17:31

Các vấn đề liên quan