Có một trình xử lý tên trực tuyến cho C ++ không? [đóng cửa]


109

Tôi đang gặp một lỗi liên kết khá dài và khó hiểu, và sẽ rất thích nếu tôi có thể dán nó vào hộp văn bản nào đó trên trang web nào đó và bỏ tên cho tôi.

Có ai biết về một dịch vụ như vậy không?


3
Btw, trình biên dịch của bạn là gì? Có lẽ bạn chỉ có thể sử dụng một công cụ sẵn sàng đi kèm với nó.
răng nhọn

4
Tôi đã tìm thấy "undname.exe" và nó đã thực hiện công việc cho VC ++.
Roman Starkov

3
dán tên của bạn vào đây và nếu đó là tên VC2005, tôi sẽ gỡ bỏ nó.
xtofl

Câu trả lời:


133

Tôi đã tạo một dịch vụ trực tuyến như vậy: https://demangler.com

Đây là một demangler ký hiệu gcc c ++. Bạn chỉ cần sao chép một dấu vết ngăn xếp hoặc đầu ra của nm vào một hộp văn bản và nó sẽ trả về đầu ra với các tên đã được gỡ bỏ.

@Update: Nó bây giờ cũng phân loại các biểu tượng MSVC và Java.


Câu trả lời này phù hợp với tôi, nhưng không phải câu trả lời trong câu trả lời phổ biến hơn: _ZN9cdnalizer11rewriteHTMLINS_6apache8IteratorEcEET_RKSsRKNS_6ConfigES3_S3_St8 Chức năngIFS3_RKS3_SB_EES9_IFvSsEE
matiu2

Trình giải mã của bạn không thể gỡ bỏ các điều kiện tham chiếu cho Itanium. Tôi đang xem _ZNR4test1fEv được tạo bởi Clang.
Puppy

Cảm ơn, trang web tốt đẹp! Bạn có thể vui lòng thêm white-space: normalhoặc tương tự với thẻ responseSection <pre> (và có thể thêm số dòng) không? Đầu ra dài một dòng hiện không thể đọc được.
jplatte

1
Bạn nên cẩn thận. Hầu hết các triển khai trong thế giới thực của demanglers đều có lỗi và không an toàn. Về cơ bản, chúng chỉ hoạt động trên các tên bị xáo trộn mà cùng một nền tảng tạo ra, nhưng có thể gặp độ phức tạp cao hoặc lỗi bộ nhớ trên các đầu vào chung.
Kerrek SB

8
Tôi đã sử dụng nó thường xuyên. Nó dường như là xuống, though.It là một đẹp rất, hữu ích của trang
chrise

104

Điều này có thể hơi muộn, nhưng tôi đã tạo một cái dựa trên câu hỏi này. Nó hoạt động với các đầu vào mà tôi đã thử, hỗ trợ g ++ và msvc ++ thông qua __cxa_demangle và __unDName, được biên dịch sang Javascript qua Emscripten. Hy vọng điều này sẽ giúp ai đó: c ++ filtjs

Chỉnh sửa: Đã khắc phục sự cố thoát


6
Tuyệt vời! Cảm ơn bạn! Có lẽ hãy đề cập đến "Demangler tên C ++ trực tuyến" ở đâu đó trên trang, để mọi người có thể tìm thấy bạn qua Google?
Roman Starkov

1
Được rồi, nên được sửa ngay bây giờ.
natto friends

3
@Zibri: "nguồn C nhỏ" không trực tuyến. Đối với điều đó, hãy sử dụng các tiện ích c ++ filt và undname hiện có.
nattofriends

1
@nattofriends: Công cụ của bạn dường như không thoát khỏi dấu ngoặc, hãy xem ??_R3?$KxSet@V?$KxSpe@DI@@I@@8.
Vịt rên rỉ

2
Sẽ rất hữu ích nếu bạn có thể khắc phục sự cố của mình với các mẫu mà người khác đã đề cập. Điều này đã gây ra ít nhất một câu hỏi giả mạo trên SO.
Shafik Yaghmour

24

Hầu hết (nếu không phải tất cả) các trình biên dịch C ++ đi kèm với c++filtcông cụ thực hiện chính xác những gì bạn đang tìm kiếm.

Nếu bạn muốn nó bằng cách nhấp chuột ... thì hãy viết GUI cho nó;)


Tôi muốn nó với nỗ lực tối thiểu thay vì chỉ bằng một cú nhấp chuột :) Ồ, dù sao thì tôi cũng không cần nó thường xuyên.
Roman Starkov

3
trường hợp sử dụng thông thường của tôi cho c ++ filt là objdump -dr ./AClass.o | c++filt | less(disassembler) hoặc nm ./AClass.o | c++filt | less(danh sách các biểu tượng bên trong tập tin đối tượng)
Dummy00001

2
Hầu hết các trình biên dịch không phải là GCC. Các trình biên dịch không phải GCC không gửi c ++ filt. Bằng cách quy nạp, hầu hết các trình biên dịch không gửi c ++ filt.
IInspectable

9

Có hai giải pháp sao chép và dán trực tuyến:

Nếu bạn chỉ cần hỗ trợ cho GCC và Clang, bạn cũng có tùy chọn sử dụng Coliru , đây có lẽ là trình biên dịch C ++ trực tuyến linh hoạt nhất .

Điều này không hoàn toàn đơn giản như cắt, dán và nhấp - nhưng không khó hơn nhiều - và có vẻ như không có vấn đề gì với các thông số mẫu như đã nói ở trên. Bạn chỉ cần sửa đổi dòng lệnh để chạy một cái gì đó như sau:

cat main.cpp | c++filt -t

Xem nó trực tiếp với ví dụ này có hình tam giác:

_Z6kernelIfLj3EEvPT_5arrayIPKS0_XT0_EES5_S2_IjXT0_EES6_S0_

đến:

void kernel<float, 3u>(float*, array<float const*, 3u>, array<float const*, 3u>, array<unsigned int, 3u>, array<unsigned int, 3u>, float)
           ^^^^^^^^^^^

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.