มีตัวถอดรหัสชื่อออนไลน์สำหรับ C ++ หรือไม่? [ปิด]


109

ฉันได้รับข้อผิดพลาดในการเชื่อมโยงที่ค่อนข้างยาวและสับสนและจะชอบมากถ้าฉันสามารถวางลงในกล่องข้อความบนเว็บไซต์บางแห่งและมีชื่อที่ไม่สับสนสำหรับฉัน

มีใครรู้จักบริการดังกล่าวบ้าง?


3
Btw คอมไพเลอร์ของคุณคืออะไร? บางทีคุณอาจใช้เครื่องมือสำเร็จรูปที่จัดมาให้ก็ได้
sharptooth

4
ฉันพบ "undname.exe" และใช้งานได้กับ VC ++
Roman Starkov

3
วางชื่อของคุณที่นี่และถ้าเป็นชื่อ VC2005 ฉันจะแยกมันออก
xtofl

คำตอบ:


133

ฉันได้สร้างบริการออนไลน์ดังกล่าว: https://demangler.com

นี่คือ demangler สัญลักษณ์ gcc c ++ คุณเพียงแค่คัดลอกการติดตามสแต็กหรือเอาต์พุตของ nm ลงในกล่องข้อความและจะส่งคืนผลลัพธ์โดยมีการแยกชื่อออก

@Update: ตอนนี้มันแยกสัญลักษณ์ MSVC และ Java ด้วย


อันนี้ใช้ได้ผลสำหรับฉัน แต่ไม่ใช่คำตอบที่ได้รับความนิยมมากกว่า: _ZN9cdnalizer11rewriteHTMLINS_6apache8IteratorEcEET_RKSsRKNS_6ConfigES3_S3_St8functionIFS3_RKS3_SB_EES9_IFvSsEE
matiu

Demangler ของคุณไม่สามารถลดทอนคุณสมบัติอ้างอิงสำหรับ Itanium ได้ ฉันกำลังดู _ZNR4test1fEv ที่สร้างโดย Clang
Puppy

ขอบคุณเว็บไซต์ที่ดี! คุณช่วยเพิ่มwhite-space: normalหรือคล้ายกับแท็ก responseSection <pre> (และอาจเพิ่มหมายเลขบรรทัด) ได้ไหม เอาต์พุตบรรทัดเดียวแบบยาวไม่สามารถอ่านได้ในขณะนี้
jplatte

1
คุณควรระมัดระวัง การใช้งาน Demanglers ในโลกแห่งความเป็นจริงส่วนใหญ่เป็นเรื่องที่น่ากลัวและไม่ปลอดภัย โดยทั่วไปแล้วจะใช้งานได้เฉพาะกับชื่อที่สับสนซึ่งแพลตฟอร์มเดียวกันสร้างขึ้น แต่อาจมีความซับซ้อนสูงหรือแบนข้อผิดพลาดของหน่วยความจำในอินพุตทั่วไป
Kerrek SB

9
ฉันได้ใช้มันเป็นประจำ ดูเหมือนจะไม่ลงมันเป็นหน้าที่ดีและมีประโยชน์มาก
เพลง

104

อาจจะช้าไปหน่อย แต่ฉันสร้างคำถามขึ้นมาจากคำถามนี้ ใช้งานได้กับอินพุตที่ฉันพยายามรองรับ g ++ และ msvc ++ ผ่าน __cxa_demangle และ __unDName ที่คอมไพล์เป็น Javascript ผ่าน Emscripten หวังว่านี่จะช่วยใครบางคน: c ++ filtjs

แก้ไข: แก้ไขปัญหาการหลบหนี


6
สุดยอด! ขอบคุณ! อาจจะพูดถึง "Online C ++ name demangler" ที่ใดที่หนึ่งในหน้าเพื่อให้คนอื่นสามารถค้นหาคุณผ่าน Google
Roman Starkov

1
โอเคควรได้รับการแก้ไขแล้ว
nattofriends

3
@ Zibri: "แหล่ง C ขนาดเล็ก" ไม่ออนไลน์ สำหรับสิ่งนั้นให้ใช้ยูทิลิตี้ c ++ filt และ undname ที่มีอยู่
nattofriends

1
@nattofriends: ??_R3?$KxSet@V?$KxSpe@DI@@I@@8เครื่องมือของคุณดูเหมือนจะไม่หลบหนีวงเล็บดู
หมูปิ้ง

2
จะเป็นประโยชน์มากหากคุณสามารถแก้ไขปัญหาเกี่ยวกับเทมเพลตที่ผู้อื่นกล่าวถึงได้ สิ่งนี้ทำให้เกิดคำถามปลอมอย่างน้อยหนึ่งข้อใน SO
Shafik Yaghmour

24

คอมไพเลอร์ C ++ ส่วนใหญ่ (ถ้าไม่ใช่ทั้งหมด) มาพร้อมกับc++filtเครื่องมือที่ทำสิ่งที่คุณต้องการได้อย่างแม่นยำ

ถ้าคุณต้องการเมื่อคลิกเมาส์ ... ให้เขียน GUI ให้ดี;)


ฉันต้องการมันด้วยความพยายามขั้นต่ำเมื่อเทียบกับการคลิกเมาส์ :) โอ้ฉันไม่ต้องการมันบ่อยนัก
Roman Starkov

3
กรณีการใช้งานปกติของฉันสำหรับ c ++ filt คือobjdump -dr ./AClass.o | c++filt | less(disassembler) หรือnm ./AClass.o | c++filt | less(รายการสัญลักษณ์ภายในไฟล์อ็อบเจ็กต์)
Dummy00001

2
คอมไพเลอร์ส่วนใหญ่ไม่ใช่ GCC คอมไพเลอร์ที่ไม่ใช่ GCC จะไม่จัดส่งตัวกรอง c ++ โดยการเหนี่ยวนำคอมไพเลอร์ส่วนใหญ่จะไม่จัดส่งตัวกรอง c ++
IInspectable

9

มีโซลูชันออนไลน์สองแบบคัดลอกและวาง:

ถ้าคุณเพียงต้องการการสนับสนุนสำหรับ GCC และเสียงดังกราวคุณยังมีตัวเลือกของการใช้Coliruซึ่งอาจเป็นส่วนใหญ่อเนกประสงค์ออนไลน์ c ++ คอมไพเลอร์

สิ่งนี้ไม่ง่ายเหมือนการตัดวางและคลิก แต่ก็ไม่ยากเกินไปและดูเหมือนว่าจะไม่มีปัญหากับพารามิเตอร์เทมเพลตตามที่ระบุไว้ข้างต้น คุณต้องแก้ไขบรรทัดคำสั่งเพื่อเรียกใช้สิ่งนี้:

cat main.cpp | c++filt -t

ดูสดด้วยตัวอย่างนี้ซึ่ง demangles:

_Z6kernelIfLj3EEvPT_5arrayIPKS0_XT0_EES5_S2_IjXT0_EES6_S0_

ถึง:

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.