tracy
tracy copied to clipboard
SIGILL: Illegal Instruction Operand
Building f15de19fda5f03f97ea0f779c2c846228350a640 using Zig (using this fork) and running on Linux, I'm seeing some weird behaviour in the DWARF backtrace code.
Illegal instruction at address 0x4c977b
(lldb) f
frame #0: 0x00000000004c977b viken`tracy::read_function_entry(state=0x00007fffeb800080, ddata=0x00007fffebb80080, u=0x00007fffeb9806c0, base=0, unit_buf=0x00007ffff08327c0, lhdr=0x00007ffff0833028, error_callback=(viken`tracy::CallstackErrorCb(void*, char const*, int) at TracyCallstack.cpp:900), data=0x0000000000000000, vec_function=0x00007fffebb80150, vec_inlined=0x00007fffebb80150) at dwarf.cpp:3588:30
3585 if (abbrev == NULL)
3586 return 0;
3587
-> 3588 is_function = (abbrev->tag == DW_TAG_subprogram
3589 || abbrev->tag == DW_TAG_entry_point
3590 || abbrev->tag == DW_TAG_inlined_subroutine);
3591
(lldb) bt
* thread #5, name = 'Tracy Symbol Wo', stop reason = signal SIGILL: illegal instruction operand
* frame #0: 0x00000000004c977b viken`tracy::read_function_entry(state=0x00007fffeb800080, ddata=0x00007fffebb80080, u=0x00007fffeb9806c0, base=0, unit_buf=0x00007ffff08327c0, lhdr=0x00007ffff0833028, error_callback=(viken`tracy::CallstackErrorCb(void*, char const*, int) at TracyCallstack.cpp:900), data=0x0000000000000000, vec_function=0x00007fffebb80150, vec_inlined=0x00007fffebb80150) at dwarf.cpp:3588:30
frame #1: 0x00000000004cb63b viken`tracy::read_function_entry(state=0x00007fffeb800080, ddata=0x00007fffebb80080, u=0x00007fffeb9806c0, base=0, unit_buf=0x00007ffff08327c0, lhdr=0x00007ffff0833028, error_callback=(viken`tracy::CallstackErrorCb(void*, char const*, int) at TracyCallstack.cpp:900), data=0x0000000000000000, vec_function=0x00007fffebb80150, vec_inlined=0x00007fffebb80150) at dwarf.cpp:3754:13
frame #2: 0x00000000004cb63b viken`tracy::read_function_entry(state=0x00007fffeb800080, ddata=0x00007fffebb80080, u=0x00007fffeb9806c0, base=0, unit_buf=0x00007ffff08327c0, lhdr=0x00007ffff0833028, error_callback=(viken`tracy::CallstackErrorCb(void*, char const*, int) at TracyCallstack.cpp:900), data=0x0000000000000000, vec_function=0x00007fffebb80150, vec_inlined=0x00007fffebb80150) at dwarf.cpp:3754:13
frame #3: 0x00000000004cb63b viken`tracy::read_function_entry(state=0x00007fffeb800080, ddata=0x00007fffebb80080, u=0x00007fffeb9806c0, base=0, unit_buf=0x00007ffff08327c0, lhdr=0x00007ffff0833028, error_callback=(viken`tracy::CallstackErrorCb(void*, char const*, int) at TracyCallstack.cpp:900), data=0x0000000000000000, vec_function=0x00007fffebb80150, vec_inlined=0x00007fffebb80150) at dwarf.cpp:3754:13
frame #4: 0x00000000004cb63b viken`tracy::read_function_entry(state=0x00007fffeb800080, ddata=0x00007fffebb80080, u=0x00007fffeb9806c0, base=0, unit_buf=0x00007ffff08327c0, lhdr=0x00007ffff0833028, error_callback=(viken`tracy::CallstackErrorCb(void*, char const*, int) at TracyCallstack.cpp:900), data=0x0000000000000000, vec_function=0x00007fffebb80150, vec_inlined=0x00007fffebb80150) at dwarf.cpp:3754:13
frame #5: 0x00000000004c1c26 viken`tracy::read_function_info(state=0x00007fffeb800080, ddata=0x00007fffebb80080, lhdr=0x00007ffff0833028, error_callback=(viken`tracy::CallstackErrorCb(void*, char const*, int) at TracyCallstack.cpp:900), data=0x0000000000000000, u=0x00007fffeb9806c0, fvec=0x00007fffebb80150, ret_addrs=0x00007ffff0833078, ret_addrs_count=0x00007ffff0833070) at dwarf.cpp:3849:12
frame #6: 0x00000000004be597 viken`tracy::dwarf_lookup_pc(state=0x00007fffeb800080, ddata=0x00007fffebb80080, pc=5222695, callback=(viken`tracy::CallstackDataCb(void*, unsigned long, unsigned long, char const*, int, char const*) at TracyCallstack.cpp:828), error_callback=(viken`tracy::CallstackErrorCb(void*, char const*, int) at TracyCallstack.cpp:900), data=0x0000000000000000, found=0x00007ffff0833564) at dwarf.cpp:4104:4
frame #7: 0x000000000048ab18 viken`tracy::dwarf_fileline(state=0x00007fffeb800080, pc=5222695, callback=(viken`tracy::CallstackDataCb(void*, unsigned long, unsigned long, char const*, int, char const*) at TracyCallstack.cpp:828), error_callback=(viken`tracy::CallstackErrorCb(void*, char const*, int) at TracyCallstack.cpp:900), data=0x0000000000000000) at dwarf.cpp:4273:10
frame #8: 0x000000000047d085 viken`tracy::backtrace_pcinfo(state=0x00007fffeb800080, pc=5222695, callback=(viken`tracy::CallstackDataCb(void*, unsigned long, unsigned long, char const*, int, char const*) at TracyCallstack.cpp:828), error_callback=(viken`tracy::CallstackErrorCb(void*, char const*, int) at TracyCallstack.cpp:900), data=0x0000000000000000) at fileline.cpp:304:10
frame #9: 0x000000000045ef49 viken`tracy::DecodeCallstackPtr(ptr=5222695) at TracyCallstack.cpp:932:9
frame #10: 0x000000000044f05f viken`tracy::Profiler::HandleSymbolQueueItem(this=0x0000000000629280, si=0x00007ffff71100c0) at TracyProfiler.cpp:3206:32
frame #11: 0x00000000004620c2 viken`tracy::Profiler::SymbolWorker(this=0x0000000000629280) at TracyProfiler.cpp:3328:13
frame #12: 0x00000000004f0316 viken`tracy::Profiler::LaunchSymbolWorker(ptr=0x0000000000629280) at TracyProfiler.hpp:771:69
frame #13: 0x00000000004f3601 viken`tracy::Thread::Launch(ptr=0x00007ffff71c00e0) at TracyThread.hpp:80:40
frame #14: 0x00007ffff7d79907 libc.so.6`start_thread + 759
frame #15: 0x00007ffff7dff870 libc.so.6`__clone3 + 48
This is probably some kind of UB triggering the sanitizer, as disabling it in this commit makes the issue disappear.
Related: https://github.com/ziglang/zig/issues/7137
The issue here (if any) is in https://github.com/ianlancetaylor/libbacktrace/, or in zig generating invalid function entry data.