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
}
First off, this might be an
lldbbug. But since that SW is a bit more mature, let's start here.I have a debugging session recorded:
The above is just a dump of the translation map, I use
origin/mainf1a5e55wasmtime, with this slight patch. Eyeballing doesn't seem to detect anything strange in it.at this point all is fine, reverse mapping from
ripto source works fine.Now suddenly we find ourselves in assembly land. No mapping to source shown:
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
wasmtimepatch I mentioned: