فهرست منبع

Demangle function names in stack trace when using addr2line script (#3211)

Last bit missing from #3206: demangling of function names (useful for wasm
generated from Rust for instance) using `llvm-cxxfilt`.

Before this PR:
```text
0: abort
        at /rustc/82e1608dfa6e0b5569232559e3d385fea5a93112/library/panic_abort/src/lib.rs:85
1: _ZN3std3sys4wasi14abort_internal17h50698daab05bf73bE
        at /rustc/82e1608dfa6e0b5569232559e3d385fea5a93112/library/std/src/sys/wasi/mod.rs:181
2: _ZN3std7process5abort17h6bc522b6749f17cfE
        at /rustc/82e1608dfa6e0b5569232559e3d385fea5a93112/library/std/src/process.rs:2278
3: _ZN3std5alloc8rust_oom17h452ad5ba6cebff96E
        at /rustc/82e1608dfa6e0b5569232559e3d385fea5a93112/library/std/src/alloc.rs:364
```

After:
```text
0: abort
        at /rustc/82e1608dfa6e0b5569232559e3d385fea5a93112/library/panic_abort/src/lib.rs:85
1: std::sys::wasi::abort_internal::h50698daab05bf73b
        at /rustc/82e1608dfa6e0b5569232559e3d385fea5a93112/library/std/src/sys/wasi/mod.rs:181
2: std::process::abort::h6bc522b6749f17cf
        at /rustc/82e1608dfa6e0b5569232559e3d385fea5a93112/library/std/src/process.rs:2278
3: std::alloc::rust_oom::h452ad5ba6cebff96
        at /rustc/82e1608dfa6e0b5569232559e3d385fea5a93112/library/std/src/alloc.rs:364
```
Enrico Loparco 1 سال پیش
والد
کامیت
f550feb039
1فایلهای تغییر یافته به همراه17 افزوده شده و 1 حذف شده
  1. 17 1
      test-tools/addr2line/addr2line.py

+ 17 - 1
test-tools/addr2line/addr2line.py

@@ -223,6 +223,18 @@ def parse_module_functions(wasm_objdump: Path, wasm_file: Path) -> dict[str, str
     return function_index_to_name
 
 
+def demangle(cxxfilt: Path, function_name: str) -> str:
+    cmd = f"{cxxfilt} -n {function_name}"
+    p = subprocess.run(
+        shlex.split(cmd),
+        check=True,
+        capture_output=True,
+        text=True,
+        universal_newlines=True,
+    )
+    return p.stdout.strip()
+
+
 def main():
     parser = argparse.ArgumentParser(description="addr2line for wasm")
     parser.add_argument("--wasi-sdk", type=Path, help="path to wasi-sdk")
@@ -242,6 +254,9 @@ def main():
     llvm_dwarf_dump = args.wasi_sdk.joinpath("bin/llvm-dwarfdump")
     assert llvm_dwarf_dump.exists()
 
+    llvm_cxxfilt = args.wasi_sdk.joinpath("bin/llvm-cxxfilt")
+    assert llvm_cxxfilt.exists()
+
     code_section_start = get_code_section_start(wasm_objdump, args.wasm_file)
     if code_section_start == -1:
         return -1
@@ -275,7 +290,7 @@ def main():
                 )
 
                 _, funciton_file, function_line = line_info
-                function_name = function_index_to_name[index]
+                function_name = demangle(llvm_cxxfilt, function_index_to_name[index])
                 print(f"{i}: {function_name}")
                 print(f"\tat {funciton_file}:{function_line}")
             else:
@@ -286,6 +301,7 @@ def main():
                 )
 
                 function_name, funciton_file, function_line, function_column = line_info
+                function_name = demangle(llvm_cxxfilt, function_name)
                 print(f"{i}: {function_name}")
                 print(f"\tat {funciton_file}:{function_line}:{function_column}")