Slide 1

Slide 1 text

Ruby on cygwin (2025/07 月 号) fd0 (Daisuke Fujimura) 2025-07-03 @ 表参道.rb #111

Slide 2

Slide 2 text

2 • fd0 (Daisuke Fujimura) • 仕事では引き続き 1 ミリも Ruby を書いていません • YOUTRUST さんのオフィスを 見 学したかったため、 ふらっと会社帰りに寄りました 誰?

Slide 3

Slide 3 text

3 • 表参道.rb #106 の資料を参照してください • 今度は半年ぶりの参戦 • Cygwin というプラットフォーム向けの Ruby について 喋った • 3.3 以降のアップデートに苦戦してる • 今年のゆるい 目 標 : 3.4 系で動かせるようにしたい 前回まであらすじ

Slide 4

Slide 4 text

4 • 結果 : 3.4.3 で SEGV 発 生 原因判明 & 対策あり • 少なくとも SIGSEGV は発 生 しなくなった • 原因 : OpenSSL 3.x • Ruby が原因ではないため、3.4.3 より以前の Cygwin 向けバイナリも同様の対策で動くはず (未確認) それからどうなった

Slide 5

Slide 5 text

5 • Agent に直接 gdb を扱わせて原因究明できないか?とか雑に考えてた • ChatGPT 「gdb の出 力 をくれたら、次にやるべきコマンドを指 示 できる」 • ひたすら gdb <-> ChatGPT の伝書鳩になる • 再現する簡単な script をつくってくれた • それまでは毎回 gem install で native extension をビルドさせてた… • わかったことをバグ報告として ML に投げた [cygwin:258346] • 翌朝に OpenSSL の test 版で解消するよと有識者 [cygwin:258347] • 試してみたら 見 事に解消した ∩( ・ω・)∩バンジャーイ わかるまでの流れ

Slide 6

Slide 6 text

6 $ cat thread_openssl.rb Thread.new do require ‘openssl’ end.join GC.start Sleep 0.1 $ 再現スクリプト

Slide 7

Slide 7 text

7 Thread 8 "thread_openssl*" received signal SIGSEGV, Segmentation fault. [Switching to Thread 3968.0x1f48] 0x0000000000000000 in ?? () (gdb) where #0 0x0000000000000000 in ?? () #1 0x00007ffe4ad2a0e4 in pthread_testcancel () at /usr/src/debug/cygwin-3.6.3-1/ winsup/cygwin/thread.cc:399 #2 pthread_rwlock_wrlock (rwlock=0xa002a9410) at /usr/src/debug/cygwin-3.6.3-1/ winsup/cygwin/thread.cc:4352 #3 0x00007ffe4ae0b0d4 in _sigfe () at sigfe.s:35 #4 0x00000003ff54e3f9 in CRYPTO_THREAD_write_lock (lock=) at crypto/ threads_pthread.c:110 #5 0x00000003ff541922 in init_thread_remove_handlers (handsin=handsin@entry=0x0) at crypto/initthread.c:178 #6 0x00000003ff541d43 in OPENSSL_thread_stop () at crypto/initthread.c:235 #7 0x00000003ff53fdd3 in DllMain (hinstDLL=, fdwReason=, lpvReserved=) at crypto/dllmain.c:38 : 問題のスタックトレース

Slide 8

Slide 8 text

8 • OpenSSL の OPENSSL_thread_stop() から Cygwin の pthread_testcancel() が call されるパスで発 生 • 2011 年に話題に挙がっていたことはあった [cygwin:194454] • Cygwin 側の OpenSSL パッケージ (test 版) は対処として DllMain() から呼び出しを削除 [cygwin-announce:012341] • かなり hacky だけど crash するよりはマシでは? [https:// github.com/msys2/MSYS2-packages/pull/3448] kwsk

Slide 9

Slide 9 text

9 • Patch を適 用 した Cygwin 側の OpenSSL パッケージが stable に なる or Patch が本家に merge されるのがいつになるかはわからな い [cygwin:258347] • というわけで↑待ち • (Cygwin 版公式パッケージである) 3.2 系は 2026/03/31 が EOL • OpenSSL 1.1 とリンクすれば動きそうだがセキュリティ的には NG ということは近々 3.4 系で出せる?