Open6

dyld[.....]: missing symbol called が出るときにlldbでそのシンボルを調査する

NyohoNyoho
env PORT=3000 RAILS_ENV=development bundle exec puma -C config/puma.rb

とすると

dyld[63710]: missing symbol called
fish: Job 1, 'env PORT=3000 RAILS_ENV=develop…' terminated by signal SIGABRT (Abort)

と出て dyld[\d+]: missing symbol called が困ってしまいます。

NyohoNyoho

lldbで調査したいですが、rbenvを使っていて、bundleコマンドやpumaコマンドがスクリプトであるためlldbで直接は起動できない。

$ env PORT=3000 RAILS_ENV=development bundle exec lldb -- ~/.rbenv/versions/3.0.6/bin/puma -C config/puma.rb
(lldb) target create "/Users/nyoho/.rbenv/versions/3.0.6/bin/puma"
error: '/Users/nyoho/.rbenv/versions/3.0.6/bin/puma' doesn't contain any 'host' platform architectures: arm64, armv7, armv7f, armv7k, armv7s, armv7m, armv7em, armv6m, armv6, armv5, armv4, arm, thumbv7, thumbv7k, thumbv7s, thumbv7f, thumbv7m, thumbv7em, thumbv6m, thumbv6, thumbv5, thumbv4t, thumb, x86_64, x86_64, arm64, arm64e, arm64, arm64e
(lldb)

こうなっちゃう。

でもpumaはrubyスクリプトであるから、バイナリであるrubyから起動すればよい。

$ env PORT=3000 RAILS_ENV=development bundle exec lldb -- ruby ~/.rbenv/versions/3.0.6/bin/puma -C config/puma.rb
(lldb) target create "ruby"
Current executable set to '/Users/nyoho/.rbenv/versions/3.0.6/bin/ruby' (arm64).
(lldb) settings set -- target.run-args  "/Users/nyoho/.rbenv/versions/3.0.6/bin/puma" "-C" "config/puma.rb"
(lldb)

起動した。

NyohoNyoho
(lldb) process launch
Process 64130 launched: '/Users/nyoho/.rbenv/versions/3.0.6/bin/ruby' (arm64)
[64130] Puma starting in cluster mode...
[64130] * Puma version: 5.6.7 (ruby 3.0.6-p216) ("Birdie's Version")
[64130] *  Min threads: 5
[64130] *  Max threads: 5
[64130] *  Environment: development
[64130] *   Master PID: 64130
[64130] *      Workers: 2
[64130] *     Restarts: (✔) hot (✖) phased
[64130] * Preloading application
warning: parser/current is loading parser/ruby30, which recognizes 3.0.5-compliant syntax, but you are running 3.0.6.
Please see https://github.com/whitequark/parser#compatibility-with-ruby-mri.
dyld[64130]: missing symbol called
Process 64130 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = signal SIGABRT
    frame #0: 0x0000000186dc34c8 dyld`__abort_with_payload + 8
dyld`:
->  0x186dc34c8 <+8>:  b.lo   0x186dc34e8               ; <+40>
    0x186dc34cc <+12>: pacibsp
    0x186dc34d0 <+16>: stp    x29, x30, [sp, #-0x10]!
    0x186dc34d4 <+20>: mov    x29, sp
Target 0: (ruby) stopped.
(lldb)

ここでdyldが missing symbol called と述べたのでトレースする。

NyohoNyoho
(lldb) bt
* thread #1, queue = 'com.apple.main-thread', stop reason = signal SIGABRT
  * frame #0: 0x0000000186dc34c8 dyld`__abort_with_payload + 8
    frame #1: 0x0000000186dce0cc dyld`abort_with_payload_wrapper_internal + 104
    frame #2: 0x0000000186dce100 dyld`abort_with_payload + 16
    frame #3: 0x0000000186d5f7f0 dyld`dyld4::halt(char const*, dyld4::StructuredError const*) + 304
    frame #4: 0x0000000186d944fc dyld`dyld4::APIs::_dyld_missing_symbol_abort() + 28
    frame #5: 0x0000000102287950 idn.bundle`nfkc_normalize(self=<unavailable>, str=4416356600) at stringprep.c:157:9
    frame #6: 0x0000000100a35fcc libruby.3.0.dylib`vm_call_cfunc_with_frame + 232
    frame #7: 0x0000000100a2fe94 libruby.3.0.dylib`vm_sendish + 1364
    frame #8: 0x0000000100a19950 libruby.3.0.dylib`vm_exec_core + 9556
    frame #9: 0x0000000100a2bb5c libruby.3.0.dylib`rb_vm_exec + 2088
    frame #10: 0x00000001008f6250 libruby.3.0.dylib`load_iseq_eval + 200
    frame #11: 0x00000001008f49a8 libruby.3.0.dylib`require_internal + 820
    frame #12: 0x00000001008f3ff0 libruby.3.0.dylib`rb_f_require_relative + 68
    frame #13: 0x0000000100a35fcc libruby.3.0.dylib`vm_call_cfunc_with_frame + 232
    frame #14: 0x0000000100a2fe94 libruby.3.0.dylib`vm_sendish + 1364
    frame #15: 0x0000000100a19950 libruby.3.0.dylib`vm_exec_core + 9556
    frame #16: 0x0000000100a2bb5c libruby.3.0.dylib`rb_vm_exec + 2088
    frame #17: 0x00000001008f6250 libruby.3.0.dylib`load_iseq_eval + 200
    frame #18: 0x00000001008f49a8 libruby.3.0.dylib`require_internal + 820
    frame #19: 0x00000001008f3ff0 libruby.3.0.dylib`rb_f_require_relative + 68
    frame #20: 0x0000000100a35fcc libruby.3.0.dylib`vm_call_cfunc_with_frame + 232
    frame #21: 0x0000000100a2fe94 libruby.3.0.dylib`vm_sendish + 1364
    frame #22: 0x0000000100a19950 libruby.3.0.dylib`vm_exec_core + 9556
    frame #23: 0x0000000100a2bb5c libruby.3.0.dylib`rb_vm_exec + 2088
    frame #24: 0x00000001008f6250 libruby.3.0.dylib`load_iseq_eval + 200
    frame #25: 0x00000001008f49a8 libruby.3.0.dylib`require_internal + 820
    frame #26: 0x00000001008f3f18 libruby.3.0.dylib`rb_f_require + 36
    frame #27: 0x0000000100a35fcc libruby.3.0.dylib`vm_call_cfunc_with_frame + 232
    frame #28: 0x0000000100a31bf0 libruby.3.0.dylib`vm_call_method_each_type + 816
    frame #29: 0x0000000100a2fe94 libruby.3.0.dylib`vm_sendish + 1364
    frame #30: 0x0000000100a19950 libruby.3.0.dylib`vm_exec_core + 9556
    frame #31: 0x0000000100a2bb5c libruby.3.0.dylib`rb_vm_exec + 2088
    frame #32: 0x0000000100a25f48 libruby.3.0.dylib`rb_f_eval + 500
    frame #33: 0x0000000100a35fcc libruby.3.0.dylib`vm_call_cfunc_with_frame + 232
    frame #34: 0x0000000100a2fe94 libruby.3.0.dylib`vm_sendish + 1364
    frame #35: 0x0000000100a19950 libruby.3.0.dylib`vm_exec_core + 9556
    frame #36: 0x0000000100a2bb5c libruby.3.0.dylib`rb_vm_exec + 2088
    frame #37: 0x00000001008f6250 libruby.3.0.dylib`load_iseq_eval + 200
    frame #38: 0x00000001008f51f4 libruby.3.0.dylib`rb_f_load + 272
    frame #39: 0x0000000100a35fcc libruby.3.0.dylib`vm_call_cfunc_with_frame + 232
    frame #40: 0x0000000100a2fe94 libruby.3.0.dylib`vm_sendish + 1364
    frame #41: 0x0000000100a19950 libruby.3.0.dylib`vm_exec_core + 9556
    frame #42: 0x0000000100a2bb5c libruby.3.0.dylib`rb_vm_exec + 2088
    frame #43: 0x00000001008a179c libruby.3.0.dylib`rb_ec_exec_node + 320
    frame #44: 0x00000001008a1600 libruby.3.0.dylib`ruby_run_node + 96
    frame #45: 0x0000000100003f1c ruby`main + 92
    frame #46: 0x0000000186d5b154 dyld`start + 2476
(lldb)
NyohoNyoho

frame #4 に dyld`dyld4::APIs::_dyld_missing_symbol_abort() + 28 があるのでこの直前のシンボルがないということだ。

直前は frame #5 の 0x0000000102287950 idn.bundle`nfkc_normalize(self=<unavailable>, str=4416356600) at stringprep.c:157:9 である。

というわけでidn.bundleの nfkc_normalize がおかしいことがわかった。

NyohoNyoho

idnといえば、idn-rubyというgemがHomebrewで入れたlibidnをうまく参照していなくておかしかったことがあったので、

gem i idn-ruby -- --with-idn-dir=/opt/homebrew/Cellar/libidn/1.42

とした。これでシンボルがないというエラーがなくなった。