WebKitのiOSビルドにlldbがattachできないときの解決方法

初めてQiitaに記事を投稿してみました。いろいろ未熟ではありますが、結構ニッチな部分の記事なので、誰かの役に立てたらいいな、と思い少し記事を書かせていただきました。よろしくお願いします。

# TL;DR

iOS用のWebKitにデバッガーがattachできない問題は、権限の問題です。

まず

```
$ sudo DevToolsSecurity -enable
```

を実行したあと、リカバリーモードでブートして、コンソールで以下の命令を実行しましょう。

```
$ csrutil enable --without debug
```

# 問題編

私はあるWebKitのバグを再現し、デバッガーでログをみようとしていました。

このバグはiOSでしか再現ができないバグで、私はWebKitの公式ページを頼りにiOSのデバッグビルドを作成してログを確認しようとしました。

https://webkit.org/building-webkit/

https://webkit.org/running-webkit/

https://webkit.org/debugging-webkit/

この記事によると、iOSシミュレーターのビルドをデバッグするためには以下のような手順が必要とのことでした。

1. ビルドする。
    
    ```
    $ build-webkit --ios-simulator --debug
    ```
    
    iOSシミュレーター用のビルドであるため--ios-simulatorを、そしてデバッグビルドでログを確認したかったので--debugのフラグを設定しました。

2. 実行する
    
    ```
    $ run-safari --ios-simulator --debug
    ```
    
    これでiPhoneのシミュレーターが起動し、先程ビルドしたSafariが立ち上がりました。ここまでは順調です。

3. デバッガーをattachする
    
    ```
    $ xcrun --sdk iphonesimulator lldb --attach-name MobileSafari
    ```
    
    これでlldbがattachできるはず……！でしたが、以下のようなエラーメッセージに遭遇してしまいました。
    
    ```
    (lldb) process attach --name "MobileSafari"
    error: attach failed: attach failed (Not allowed to attach to process.  Look in the console messages (Console.app), near the debugserver entries, when the attach failed.  The subsystem that denied the attach permission will likely have logged an informative message about why it was denied.)
    ```
    
    これは……まず Not allowed to attach to process というメッセージで検索してみたら、以下のようなページを発見することができました。
    
    https://developer.apple.com/forums/thread/120282?page=2
    
    真っ先に出てくる回答は、権限周りの問題なので以下のようなコマンドを実行してみよう、とのことでした。
    
    ```
    $ sudo DevToolsSecurity -enable
    ```
    
    まあ、アップル公式サイトでの回答だったので期待してましたが、同じエラーが出てしまいました。
    
    いろいろ他にも試してみましたが、検索して引っかかる方法ではダメだったり、そもそも同じくすることができなかったり（ビルド環境の構築のためにXcodeは入れてみましたが、Xcodeではそもそもビルドすらできませんでした）やってみてもうまくいきませんでした。

# 解決編

WebKitに関わるエンジニアのためのSlackチャンネルがあります。そこで質問してみようとも思いましたが、英語の作文をする前に検索してみることにしました。そうしたら、それらしき答えが……！そのままコピペするのはダメだと思いますので、箇条書きにすると、以下のような内容でした。

* MobileSafariにはデバッグプロテクトがかかっている。
* それを無効にするには、Macをリカバリーモードで起動して以下のコマンドを実行すること
    ```
    $ csrutil enable --without debug
    ```
* 詳しくは以下のリンクを参照すること
    https://developer.apple.com/documentation/security/disabling_and_enabling_system_integrity_protection

* 以上の方法ではない方法でデバッガーをattachしたいなら、MobileSafariではなくWKWebViewを含むアプリを作ること

私はiOSにも疎いので、csrutilをdebugに限ってdisableすることにしました。

そして……無事デバッガーをattachできました！

```
$ xcrun --sdk iphonesimulator lldb --attach-name MobileSafari
(lldb) process attach --name "MobileSafari"
Process 1183 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = signal SIGSTOP
    frame #0: 0x00000001cc055fcc libsystem_kernel.dylib`mach_msg_trap + 8
libsystem_kernel.dylib`mach_msg_trap:
->  0x1cc055fcc <+8>: ret

libsystem_kernel.dylib`mach_msg_overwrite_trap:
    0x1cc055fd0 <+0>: mov    x16, #-0x20
    0x1cc055fd4 <+4>: svc    #0x80
    0x1cc055fd8 <+8>: ret
Target 0: (MobileSafari) stopped.
Executable module set to "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/Applications/MobileSafari.app/MobileSafari".
Architecture set to: arm64e-apple-ios-simulator.
(lldb)
```

なにか他の問題が発生したようですが、まずlldbは正常に動くみたいです。めでたしめでたし！

# もっと効率よく解決方法を見つけるには

まず思ったのは、WebKitなどの特殊な環境で検証するアプリケーションであれば、闇雲にGoogleに検索をかけるよりは、この分野の情報が集まってるサイトで検索を始めてみたほうがいいということです。多分一番手っ取り早い方法はSlackで質問を投げてみることではないでしょうか。

あとは、普通のアプリケーションとSafariが違う権限下に動いてるということを理解することです。当然この出来事がなかったらちゃんと知ることはできなかったと思いますが、ブラウザのアプリケーションが普通のサードパーティ製アプリケーションと違ってファーストパーティーとして特別に管理された権限で動いてることは、Safariに限らず多くのOSで見られます。その事実を思い出すことができたらもう少し早く正解を見つけ出すことができたのではないかと思います。