アルパカ三銃士

〜アルパカに酔いしれる獣たちへ捧げる〜

xcode をインストールしてない macOS で lldb を使うまで

mac を開発端末にしたいけど xcode をインストールしたくないという場合、xcode を appstore からインストールするのではなく、command line tools のみをインストールする必要がある。

インストールするために xcode-select -- install を実行する。これをやることで mac 上で homebrew が使えるようになったりする。

私の環境には homebrew 経由でインストールした lldb (/usr/local/opt/llvm/bin/lldb) があった。最近 neovim のコードを読むことにハマってるので久しぶりにデバッグするしようとしたら次のエラーメッセージが表示された。

$ lldb -p $(pgrep nvim)
(lldb) process attach --pid 35912
error: attach failed: unable to locate debugserver

今まで xcode をインストールした状態でデバッグを行ってたので、このケースに初めて遭遇した。debugserver がないとのこと。検索すると command line tools をインストールしてるなら /Library/Developer/CommandLineTools/Library/PrivateFrameworks/LLDB.framework/Versions/A/Resources/debugserver に存在するという情報を入手した。(確かにあった)

それで今度はこの debugserver を lldb に認識して貰う必要があるが、検索してもなかなかヒットせずかなり困った。

おばあちゃんから「こういうときは lldb のコードから探そうね〜」と教えてもらってたため読んでみると環境変数経由で指定できそうだと分かった。(ソースコードここ! - GDBRemoteCommunication.cpp#L943

試しにコマンドライン上で直接指定しながら実行してみた。

$ LLDB_DEBUGSERVER_PATH=/Library/Developer/CommandLineTools/Library/PrivateFrameworks/LLDB.framework/Versions/A/Resources/debugserver lldb -p $(pgrep nvim)
(lldb) process attach --pid 35912
Process 35912 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = signal SIGSTOP
    frame #0: 0x00007fff63e0c78e libsystem_kernel.dylib`kevent + 10
libsystem_kernel.dylib`kevent:
->  0x7fff63e0c78e <+10>: jae    0x7fff63e0c798            ; <+20>
    0x7fff63e0c790 <+12>: movq   %rax, %rdi
    0x7fff63e0c793 <+15>: jmp    0x7fff63e06457            ; cerror_nocancel
    0x7fff63e0c798 <+20>: retq

Executable module set to "/Users/codehex/go/src/github.com/neovim/neovim/build/bin/nvim".
Architecture set to: x86_64h-apple-macosx.

上手くいったっぽい!あとで自分の .zshrc に下記を記述しておく。

export LLDB_DEBUGSERVER_PATH=/Library/Developer/CommandLineTools/Library/PrivateFrameworks/LLDB.framework/Versions/A/Resources/debugserver

検索していく過程で ~/.lldbinit というファイルで lldb の設定をカスタマイズ & 保存していけることが分かった。

どんな感じで書いていけば良いんだろうとドキュメントを探したけど見つからなかった。(man コマンドでもなし)

なのでサンプルを見つけられるように、ここに GitHub 経由でサンプルを見つけられるようにリンクを残しておく。

https://github.com/search?p=1&q=lldbinit&type=Commits

途中で見つけた良さげなページ

後で読みたい

reverse.put.as