ま、そんなところで。

ニッチな技術系メモとか、車輪を再発明してみたりとか.

UbuntuのVSCodeでlldbを使ってRustコードをデバッグしたらブレークポイントが効かなくて困った

Rustコードのブレークポイントで止まらないんだけど・・・

UbuntuVSCodeをつかったRustの開発環境を作ってたんですが、lldbでデバッグしようとすると、どうもブレークポイントで止まらなくてハマりました.

location zero

ターミナルからlldbを直接たたいてブレーク設定しようとしても、どうもダメっぽいのですね.
ブレークポイントを追加しても位置表示が「Location: 0」となっていて、有効化できないのです.

lldbを直接起動して、listコマンドしてみてもコードが表示されず.
あー、これはどうやら完全にシンボルが見えてないご様子.

誰かが同じ問題にぶつかってやしないかな〜と、Google先生で検索を試みてもまったくそれらしい情報がないのです.
仕方ないので、諦めてしばらくの間デバッガはgdbをつかってました.

最近、思い立ってもう一度じっくり調べてみたところ、ようやく原因が判明.
lldbでデバッグできるようになるworkaroundもみつけることができたのでメモ.

環境

環境 : Ubuntu 20.04
VS-Code : 1.57.1
CodeLLDB : 1.6.5
Rust-Analyzer: v0.2.662

ソースコードをsymlinkを含むパスにおいていることが原因

どうやらソースコードがsymlinkを含むパスにあると、デバッグ時にlldbがシンボルを見つけられないようなのです.
よもやよもや、です.
実行は出来てるのに、同じファイル内にあるシンボルが見えてないとは・・・

似たような問題が3年ほど前のCodeLLDBのバグ報告で議論されてました.
mountしてる拡張ディスク上にプロジェクトを配置してた人がこの問題にぶつかっていたようです.

どうもこれ、CodeLLDBではなくlldbの問題なんだそうで.
確かに、lldb単体でも起きるのでCodeLLDBは関係ないっぽいですね.
いまでもOpen状態なところをみると、lldb側で対応してないのか根本的な解決には至ってないということでしょうね.

github.com

Workaroundみつけた!

スレッドの方にユーザ設定のsettings.jsonでlldb.launch.sourceMapを設定したら動くよ・・とあったので試してみましたが、どうもダメっぽいですね・・・

// settings.json
{
    // これはダメっぽい...
    "lldb.launch.sourceMap": {
        "/home/fuga/workspace/gitprjs": "/home/fuga/work"
    },
}

幸いこれをヒントにworkaroundをみつけることができました.
launch.jsonデバッグ設定にsourceMapエレメントを定義してlldbにパスの対応を教えてやれば、この問題を回避できるようです.

// launch.json
{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "lldb",
            "request": "launch",
            "name": "Debug lldb executable 'g_game'",
            "cargo": {
                "args": [
                    "build",
                    "--bin=g_game",
                    "--package=g_game"
                ],
                "filter": {
                    "name": "g_game",
                    "kind": "bin"
                }
            },
            "args": [],
            "cwd": "${workspaceFolder}",
            "stopOnEntry": false,
            "sourceLanguages": ["rust"],
            // *** ここを追加 ***
            "sourceMap": {
                // 以下のsymlinkの場合.
                // work -> /home/fuga/workspace/gitprjs
                // real path -> symlink path の対応をそれぞれ絶対パスで定義してやる.
                "/home/fuga/workspace/gitprjs": "/home/fuga/work"
            }
        }
    ]
}

Linux環境で(Macもかな?)作業ディレクトリパスにsymlinkを使っていないと出くわすことのない問題なので、誰も気づかなかったのかもしれませんね.
ともかく、gdbとくらべて表示される情報量が多いlldbでデバッグできるようになったので、まずは良しとします.