Skip to content

lldb cannot symbolise the last retq of functions #2173

@ggreif

Description

@ggreif

First off, this might be an lldb bug. But since that SW is a bit more mature, let's start here.
I have a debugging session recorded:

$ cd tests/all/debug/testsuite
/Users/ggreif/motoko/wasmtime/tests/all/debug/testsuite

$ lldb-10.0.1/bin/lldb -- ../../../../target/debug/wasmtime --disable-cache -g fib-wasm-dwarf5.wasm --invoke fib 2

(lldb) target create "../../../../target/debug/wasmtime"
Current executable set to '/Users/ggreif/motoko/wasmtime/target/debug/wasmtime' (x86_64).
(lldb) settings set -- target.run-args  "--disable-cache" "-g" "fib-wasm-dwarf5.wasm" "--invoke" "fib" "2"
(lldb) 
(lldb) b fib
Breakpoint 1: no locations (pending).
WARNING:  Unable to resolve breakpoint to any actual locations.
(lldb) r
Process 42125 launched: '/Users/ggreif/motoko/wasmtime/target/debug/wasmtime' (x86_64)
map: PrimaryMap { elems: [FunctionMap { offset: 0, len: 142, wasm_start: 3, wasm_end: 206, addresses: [AddressMap { generated: 7, wasm: 4 }, AddressMap { generated: 13, wasm: 6 }, AddressMap { generated: 17, wasm: 22 }, AddressMap { generated: 20, wasm: 29 }, AddressMap { generated: 26, wasm: 37 }, AddressMap { generated: 29, wasm: 37 }, AddressMap { generated: 33, wasm: 37 }, AddressMap { generated: 38, wasm: 44 }, AddressMap { generated: 43, wasm: 51 }, AddressMap { generated: 48, wasm: 58 }, AddressMap { generated: 53, wasm: 63 }, AddressMap { generated: 53, wasm: 67 }, AddressMap { generated: 58, wasm: 74 }, AddressMap { generated: 63, wasm: 91 }, AddressMap { generated: 68, wasm: 91 }, AddressMap { generated: 72, wasm: 102 }, AddressMap { generated: 75, wasm: 108 }, AddressMap { generated: 80, wasm: 108 }, AddressMap { generated: 80, wasm: 112 }, AddressMap { generated: 85, wasm: 121 }, AddressMap { generated: 90, wasm: 126 }, AddressMap { generated: 95, wasm: 135 }, AddressMap { generated: 100, wasm: 140 }, AddressMap { generated: 105, wasm: 147 }, AddressMap { generated: 110, wasm: 156 }, AddressMap { generated: 112, wasm: 163 }, AddressMap { generated: 117, wasm: 168 }, AddressMap { generated: 122, wasm: 181 }, AddressMap { generated: 125, wasm: 188 }, AddressMap { generated: 130, wasm: 191 }, AddressMap { generated: 132, wasm: 197 }, AddressMap { generated: 141, wasm: 204 }] }], unused: PhantomData }

The above is just a dump of the translation map, I use origin/main f1a5e55 wasmtime, with this slight patch. Eyeballing doesn't seem to detect anything strange in it.

1 location added to breakpoint 1
warning: using `--invoke` with a function that takes arguments is experimental and may break in the future
Process 42125 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
    frame #0: 0x00000001040e7026 JIT(0x10580d600)`fib(n=2) at fib-wasm.c:9:10
   6   	//     -Wl,--no-entry,--export=fib -nostdlib -fdebug-prefix-map=$PWD=.
   7   	
   8   	int fib(int n) {
-> 9   	  int t, a = 0, b = 1;
   10  	  for (int i = 0; i < n; i++) {
   11  	    t = a;
   12  	    a = b;
(lldb) disass
JIT(0x10580d600)`fib:
    0x1040e7000 <+0>:   pushq  %rbp
    0x1040e7002 <+2>:   movq   %rsp, %rbp
    0x1040e7005 <+5>:   pushq  %rbx
    0x1040e7007 <+7>:   movl   $0x0, %eax
    0x1040e700d <+13>:  movl   0x40(%rdi), %ecx
    0x1040e7011 <+17>:  addl   $-0x20, %ecx
    0x1040e7014 <+20>:  movl   $0x1, %ebx
    0x1040e701a <+26>:  movl   %ecx, %ecx
    0x1040e701d <+29>:  movq   0x2c(%rdi), %rsi
    0x1040e7021 <+33>:  movl   %edx, 0x1c(%rsi,%rcx)
->  0x1040e7026 <+38>:  movl   %eax, 0x14(%rsi,%rcx)
    0x1040e702b <+43>:  movl   %ebx, 0x10(%rsi,%rcx)
    0x1040e7030 <+48>:  movl   %eax, 0xc(%rsi,%rcx)
    0x1040e7035 <+53>:  movl   0xc(%rsi,%rcx), %eax
    0x1040e703a <+58>:  movl   0x1c(%rsi,%rcx), %edx
    0x1040e703f <+63>:  cmpl   %edx, %eax
    0x1040e7041 <+65>:  setl   %al
    0x1040e7044 <+68>:  movzbl %al, %eax
    0x1040e7048 <+72>:  andl   $0x1, %eax
    0x1040e704b <+75>:  testl  %eax, %eax
    0x1040e704e <+78>:  je     0x1040e7084               ; <+132> at fib-wasm.c:15:10
    0x1040e7050 <+80>:  movl   0x14(%rsi,%rcx), %eax
    0x1040e7055 <+85>:  movl   %eax, 0x18(%rsi,%rcx)
    0x1040e705a <+90>:  movl   0x10(%rsi,%rcx), %eax
    0x1040e705f <+95>:  movl   %eax, 0x14(%rsi,%rcx)
    0x1040e7064 <+100>: movl   0x18(%rsi,%rcx), %eax
    0x1040e7069 <+105>: movl   0x10(%rsi,%rcx), %edx
    0x1040e706e <+110>: addl   %eax, %edx
    0x1040e7070 <+112>: movl   %edx, 0x10(%rsi,%rcx)
    0x1040e7075 <+117>: movl   0xc(%rsi,%rcx), %eax
    0x1040e707a <+122>: addl   $0x1, %eax
    0x1040e707d <+125>: movl   %eax, 0xc(%rsi,%rcx)
    0x1040e7082 <+130>: jmp    0x1040e7035               ; <+53> at fib-wasm.c:10:19
    0x1040e7084 <+132>: movl   0x10(%rsi,%rcx), %eax
    0x1040e7089 <+137>: popq   %rbx
    0x1040e708b <+139>: popq   %rbp
    0x1040e708d <+141>: retq   
(lldb) b 0x1040e708b
Breakpoint 2: where = JIT(0x10580d600)`fib + 139 at fib-wasm.c:15:10, address = 0x00000001040e708b
(lldb) c
Process 42125 resuming
Process 42125 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 2.1
    frame #0: 0x00000001040e708b JIT(0x10580d600)`fib(n=2) at fib-wasm.c:15:10
   12  	    a = b;
   13  	    b += t;
   14  	  }
-> 15  	  return b;
   16  	}
(lldb) reg rea rip
     rip = 0x00000001040e708b  JIT(0x10580d600)`fib + 139 at fib-wasm.c:15:10

at this point all is fine, reverse mapping from rip to source works fine.

(lldb) ni
Process 42125 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = instruction step over
    frame #0: 0x00000001040e708d JIT(0x10580d600)`fib(n=2) + 141
JIT(0x10580d600)`fib:
->  0x1040e708d <+141>: retq   
    0x1040e708e:        pushq  %rbp
    0x1040e7090:        movq   %rsp, %rbp
    0x1040e7093:        pushq  %r15
(lldb) 

Now suddenly we find ourselves in assembly land. No mapping to source shown:

(lldb) reg rea rip
     rip = 0x00000001040e708d  JIT(0x10580d600)`fib + 141

How can this be debugged? Thankfully all ingredients are in the repo itself, so it should be easy to take a first step and reproduce.

@yurydelendik any tips?

For completeness, here is the wasmtime patch I mentioned:

$ git diff
diff --git a/crates/debug/src/transform/address_transform.rs b/crates/debug/src/transform/address_transform.rs
index 43bfc0b63..da7ae36f0 100644
--- a/crates/debug/src/transform/address_transform.rs
+++ b/crates/debug/src/transform/address_transform.rs
@@ -219,6 +219,7 @@ fn build_function_addr_map(
             addresses: fn_map.into_boxed_slice(),
         });
     }
+    println!("map: {:?}", map);
     map
 }
 

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugIncorrect behavior in the current implementation that needs fixing

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions