2011-02-08 18 views
7

Tôi đã có trước đó, here, được chỉ ra rằng các hàm C++ không dễ dàng được biểu diễn trong assembly. Bây giờ tôi quan tâm đến việc đọc 1 cách này hay cách khác bởi vì callgrind, một phần của valgrind, cho thấy chúng bị lộn xộn trong khi lắp ráp chúng được hiển thị bị cắt xén, vì vậy tôi muốn hoặc là mangle đầu ra chức năng valgrind hoặc demangle tên lắp ráp các chức năng. Có ai từng thử một thứ như thế không? Tôi đã nhìn vào một website và phát hiện ra những điều sau đây:chức năng cho các hàm mangle/demangle

Code to implement demangling is part of the GNU Binutils package; 
see libiberty/cplus-dem.c and include/demangle.h. 

ai đã từng thử một cái gì đó như thế, tôi muốn demangle/mangle trong C? trình biên dịch của tôi là gcc 4.x

+3

Tôi không hiểu câu hỏi của bạn - bạn đã đăng câu trả lời của riêng bạn, sử dụng mã từ binutils. Có các thư viện/đoạn mã tương tự cho các công cụ khác, vậy vấn đề ở đâu? –

+3

IIRC sau đó valgrind đã có tùy chọn --demangle = yes để loại bỏ các ký hiệu C++ trên đầu ra. Callgrind có thể được gọi là 'valgrind --tool = callgrind --demangle = yes', phải không? –

+0

@Luther: Tôi đã mở một diễn đàn khác để kiểm tra xem tôi có đang gỡ rối vallgrind http://stackoverflow.com/questions/4846411/de-mangeling-in-callgrind nhưng không ai trả lời. Tôi nhìn vào hướng dẫn sử dụng Linux để phá vỡ nó không cung cấp bất cứ điều gì! đề xuất của bạn đã hoạt động. thnks –

Trả lời

13

Sử dụng công cụ dòng lệnh c++filt để loại bỏ tên.

+2

Có, hoạt động trên dòng lệnh. Tôi tin rằng người hỏi đang tìm kiếm các chức năng thư viện có thể được gọi từ bên trong mã. – Dave

+0

Đó là câu trả lời được chấp nhận, vì vậy tôi nghĩ rằng câu trả lời cho câu hỏi về những gì người hỏi đang tìm kiếm. –

+0

Đó là tất cả tốt, trong thực tế, tôi đã học được một cái gì đó mới khi tôi đọc câu trả lời của bạn, vì vậy tôi chắc chắn đánh giá cao nó. Tôi đã thêm phiên bản 'từ mã' dưới bất kỳ cách nào vì đó là những gì tôi tìm kiếm dựa trên tiêu đề của câu hỏi. Tôi chắc chắn cả hai câu trả lời sẽ giúp một ai đó. :) – Dave

11

Dưới đây là C++ của tôi 11 thực hiện, có nguồn gốc từ các trang sau đây: http://gcc.gnu.org/onlinedocs/libstdc++/manual/ext_demangling.html

#include <cxxabi.h> // needed for abi::__cxa_demangle 

std::shared_ptr<char> cppDemangle(const char *abiName) 
{ 
    int status;  
    char *ret = abi::__cxa_demangle(abiName, 0, 0, &status); 

    /* NOTE: must free() the returned char when done with it! */ 
    std::shared_ptr<char> retval; 
    retval.reset((char *)ret, [](char *mem) { if (mem) free((void*)mem); }); 
    return retval; 
} 

Để thực hiện công tác quản lý bộ nhớ dễ dàng trên trả lại (char *), tôi đang sử dụng một std :: shared_ptr với hàm lambda 'deleter' tùy chỉnh gọi các hàm free() trên bộ nhớ trả về. Bởi vì điều này, tôi không bao giờ phải lo lắng về việc xóa bộ nhớ trên của riêng tôi, tôi chỉ cần sử dụng nó khi cần thiết, và khi shared_ptr đi ra khỏi phạm vi, bộ nhớ sẽ được free'd.

Đây là macro tôi sử dụng để truy cập tên loại bị phân loại dưới dạng (const char *). Lưu ý rằng bạn phải có RTTI bật để có quyền truy cập vào 'typeid'

#define CLASS_NAME(somePointer) ((const char *) cppDemangle(typeid(*somePointer).name()).get()) 

Vì vậy, từ bên trong một lớp C++ tôi có thể nói:

printf("I am inside of a %s\n",CLASS_NAME(this)); 
+0

Không tệ. Có thể đã làm cho nó 'unique_ptr' mặc dù, hoặc chỉ cần xây dựng một' std :: string' của nó và miễn phí() ngay lập tức. – sehe

+0

Cảm ơn sehe. :) Tôi sẽ phải xem unique_ptr (chưa sử dụng chúng). Tôi cố ý không sử dụng phương pháp std :: string/immediate free() để tránh việc sao chép thêm. Điều đó nói rằng, hiệu suất hit có lẽ sẽ không quan trọng nhiều - Tôi thường chỉ sử dụng điều này để gỡ lỗi in ấn, như trái ngược với bất kỳ loại ứng dụng tốc độ quan trọng. Nhưng dù sao, hy vọng có đủ cho một người nào đó để tùy chỉnh chức năng theo nhu cầu riêng của họ. – Dave