Apakah ada demangler nama online untuk C ++? [Tutup]


109

Saya mendapatkan kesalahan tautan yang cukup panjang dan membingungkan, dan akan sangat senang jika saya bisa menempelkannya ke beberapa kotak teks di beberapa situs web dan nama-nama itu tidak rusak untuk saya.

Apakah ada yang tahu tentang layanan seperti itu?


3
Btw, apa kompiler Anda? Mungkin Anda hanya dapat menggunakan alat siap pakai yang disertakan dengannya.
gigi tajam

4
Saya telah menemukan "undname.exe" dan berfungsi untuk VC ++.
Roman Starkov

3
tempelkan nama Anda di sini, dan jika itu adalah nama VC2005, saya akan menurunkannya.
xtofl

Jawaban:


133

Saya telah membuat serivice online seperti itu: https://demangler.com

Ini adalah demangler simbol gcc c ++. Anda cukup menyalin jejak tumpukan, atau keluaran dari nm ke dalam kotak teks, dan itu akan mengembalikan keluaran dengan nama yang didemangle.

@Pembaruan: Sekarang juga meruntuhkan simbol MSVC dan Java.


Yang ini berhasil untuk saya, tetapi bukan yang di jawaban yang lebih populer: _ZN9cdnalizer11rewriteHTMLINS_6apache8IteratorEcEET_RKSsRKNS_6ConfigES3_S3_St8functionIFS3_RKS3_SB_EES9_IFvSsEE
matiu

Demangler Anda tidak dapat menurunkan kualifikasi ref untuk Itanium. Saya melihat _ZNR4test1fEv yang dibuat oleh Clang.
Anak Anjing

Terima kasih, situs yang bagus! Bisakah Anda menambahkan white-space: normalatau serupa dengan tag <pre> responseSection (dan mungkin menambahkan nomor baris)? Output satu baris yang panjang tidak dapat dibaca saat ini.
jplatte

1
Kamu harus hati-hati. Sebagian besar implementasi demangler di dunia nyata sangat bermasalah dan tidak aman. Mereka pada dasarnya hanya bekerja pada nama yang rusak yang diproduksi oleh platform yang sama, tetapi dapat mengalami kompleksitas tinggi atau kesalahan memori pada input umum.
Kerrek SB

8
Saya telah menggunakannya secara teratur. Tampaknya turun. Itu adalah halaman yang sangat bagus dan berguna
chrise

104

Ini mungkin agak terlambat, tapi saya membuatnya, berdasarkan pertanyaan ini. Ia bekerja dengan input yang saya coba, mendukung g ++ dan msvc ++ melalui __cxa_demangle dan __unDName, dikompilasi ke Javascript melalui Emscripten. Semoga ini bisa membantu seseorang: c ++ filtjs

Edit: Memperbaiki masalah pelolosan


6
Hebat! Terima kasih! Mungkin menyebutkan "Demangler nama C ++ online" di suatu tempat pada halaman, sehingga orang dapat menemukan Anda melalui Google?
Roman Starkov

1
Oke, harus diperbaiki sekarang.
nattofriends

3
@ Zibri: "sumber C kecil" tidak online. Untuk itu, gunakan utilitas c ++ filt dan undname yang ada.
nattofriends

1
@nattofriends: Alat Anda tampaknya tidak luput dari tanda kurung, lihat ??_R3?$KxSet@V?$KxSpe@DI@@I@@8.
Mooing Duck

2
Akan sangat membantu jika Anda dapat memperbaiki masalah Anda dengan templat yang disebutkan orang lain. Hal ini menyebabkan setidaknya satu pertanyaan palsu tentang SO.
Shafik Yaghmour

24

Sebagian besar (jika tidak semua) kompiler C ++ hadir dengan c++filtalat yang melakukan persis seperti yang Anda cari.

Jika Anda menginginkannya di klik mouse ... baik tulis GUI untuk itu;)


Saya menginginkannya dengan usaha minimal dibandingkan dengan klik mouse :) Yah, toh, saya tidak terlalu sering membutuhkannya.
Roman Starkov

3
kasus penggunaan saya yang biasa untuk c ++ filt adalah objdump -dr ./AClass.o | c++filt | less(disassembler) atau nm ./AClass.o | c++filt | less(daftar simbol di dalam file objek)
Dummy00001

2
Kebanyakan kompiler bukan GCC. Kompiler yang bukan GCC tidak mengirimkan c ++ filt. Dengan induksi, sebagian besar kompiler tidak mengirimkan c ++ filt.
IInspectable

9

Ada dua solusi online salin dan tempel:

Jika Anda hanya membutuhkan dukungan untuk GCC dan Clang, Anda juga memiliki opsi untuk menggunakan Coliru , yang mungkin merupakan kompiler C ++ online paling serbaguna .

Ini tidak sesederhana potong, tempel, dan klik - tetapi tidak terlalu sulit - dan sepertinya tidak ada masalah dengan parameter template seperti yang disebutkan di atas. Anda hanya perlu mengubah baris perintah untuk menjalankan sesuatu seperti ini:

cat main.cpp | c++filt -t

Lihat langsung dengan contoh ini yang demangles:

_Z6kernelIfLj3EEvPT_5arrayIPKS0_XT0_EES5_S2_IjXT0_EES6_S0_

untuk:

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.