JosephTremoulet added a comment. @jasonmolenda @clayborg ping. To clarify, the issue this fixes is, using test functionalities/signal/handle-abrt as an example:
#include <signal.h> #include <stdio.h> #include <stdlib.h> void handler(int sig) { printf("Set a breakpoint here.\n"); exit(0); } void abort_caller() { abort(); } int main() { if (signal(SIGABRT, handler) == SIG_ERR) { perror("signal"); return 1; } abort_caller(); return 2; } When stopped at the breakpoint in "handler", backtrace currently gives this: (lldb) bt * thread #1, name = 'sigtest', stop reason = breakpoint 1.1 * frame #0: 0x0000000000400651 sigtest`handler(sig=6) at main.c:7 frame #1: 0x00007ffff7a424b0 libc.so.6`___lldb_unnamed_symbol1$$libc.so.6 + 1 <----- the symbol context of this frame is the issue frame #2: 0x00007ffff7a42428 libc.so.6`__GI_raise(sig=6) at raise.c:54 frame #3: 0x00007ffff7a4402a libc.so.6`__GI_abort at abort.c:89 frame #4: 0x000000000040066e sigtest`abort_caller() at main.c:12 frame #5: 0x00000000004006a2 sigtest`main at main.c:23 frame #6: 0x00007ffff7a2d830 libc.so.6`__libc_start_main(main=(sigtest`main at main.c:16), argc=1, argv=0x00007fffffffe328, init=<unavailable>, fini=<unavailable>, rtld_fini=<unavailable>, stack_end=0x00007fffffffe318) at libc-start.c:291 frame #7: 0x0000000000400579 sigtest`_start + 41 the pc of frame 1 is actually on the first byte of the relevant function, not following a call: (lldb) frame select 1 frame #1: 0x00007ffff7a424b0 libc.so.6`___lldb_unnamed_symbol1$$libc.so.6 + 1 libc.so.6`__restore_rt: -> 0x7ffff7a424b0 <+0>: movq $0xf, %rax 0x7ffff7a424b7 <+7>: syscall 0x7ffff7a424b9 <+9>: nopl (%rax) libc.so.6`__GI___libc_sigaction: 0x7ffff7a424c0 <+0>: subq $0xd0, %rsp (lldb) disassemble -s '$pc - 2' 0x7ffff7a424ae: addb %al, (%rax) libc.so.6`__restore_rt: -> 0x7ffff7a424b0 <+0>: movq $0xf, %rax 0x7ffff7a424b7 <+7>: syscall 0x7ffff7a424b9 <+9>: nopl (%rax) libc.so.6`__GI___libc_sigaction: 0x7ffff7a424c0 <+0>: subq $0xd0, %rsp 0x7ffff7a424c7 <+7>: testq %rsi, %rsi 0x7ffff7a424ca <+10>: movq %rdx, %r8 With this fix, we instead get this backtrace: (lldb) bt * thread #1, name = 'sigtest', stop reason = breakpoint 1.1 * frame #0: 0x0000000000400651 sigtest`handler(sig=6) at main.c:7 frame #1: 0x00007ffff7a424b0 libc.so.6`__restore_rt <-------------- correct symbol context here frame #2: 0x00007ffff7a42428 libc.so.6`__GI_raise(sig=6) at raise.c:54 frame #3: 0x00007ffff7a4402a libc.so.6`__GI_abort at abort.c:89 frame #4: 0x000000000040066e sigtest`abort_caller() at main.c:12 frame #5: 0x00000000004006a2 sigtest`main at main.c:23 frame #6: 0x00007ffff7a2d830 libc.so.6`__libc_start_main(main=(sigtest`main at main.c:16), argc=1, argv=0x00007fffffffe328, init=<unavailable>, fini=<unavailable>, rtld_fini=<unavailable>, stack_end=0x00007fffffffe318) at libc-start.c:291 frame #7: 0x0000000000400579 sigtest`_start + 41 Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D64993/new/ https://reviews.llvm.org/D64993 _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits