JetBrains Fleet 1.48 ヘルプ

Rust コードをデバッグする

Rust アプリケーションを作成して実行しました。それが期待どおりに機能しないことに気づいたとしましょう。例: 間違った値が返されるか、例外が発生してクラッシュします。コードにエラーがあるようです。デバッグする時期が来ました。

デバッグとは

一般的に、デバッグとは、プログラム内のエラーを検出して修正するプロセスです。

対処しなければならないエラーにはさまざまな種類があります。構文エラーなど、コンパイラーによって処理されるため、簡単に検出できるものもあります。また、スタックトレースを調べることでエラーをすぐに特定できる場合も簡単に検出でき、原因を突き止めるのに役立ちます。

ただし、非常に扱いにくく、発見して修正するのに非常に長い時間がかかるエラーもあります。例: プログラムの初期段階で発生した微妙なロジックエラーは、かなり後になって初めて明らかになる場合があり、その場合、問題を解決するのは非常に困難になります。

ここでデバッガーが役立ちます。デバッガーは、プログラムの内部動作を詳しく調べることで、効率的にバグを見つけることができるツールです。これは、指定されたポイントで実行を一時停止し、プログラムの状態を分析し、必要に応じて実行をステップごとに進めることで可能になります。デバッグ中は、すべてを制御できます。このマニュアルでは、デバッグを始めるための基本的なシナリオについて説明します。

コードを調べる

簡単なデバッグのケースを試してみましょう。次のアプリケーションがあるとします。

use std::env; fn main() { println!("Average finder v.0.1"); let args: Vec<String> = env::args().skip(1).collect(); let avg = find_average(&args); println!("The average is {}", avg); } fn find_average(args: &[String]) -> f64 { let mut result = 0.0; for s in args { result += to_float(s); } result } fn to_float(s: &str) -> f64 { s.parse().unwrap() }

プログラムは、コマンドライン引数として渡されるすべての値の平均を計算することになっています。

問題なくコンパイルおよび実行されます。ただし、結果は期待したものではありません。たとえば、入力として 1 2 3 を渡すと、結果は 6.0 になります。

まず、エラーがどこから発生しているかを考える必要があります。問題は print ステートメントにはないと考えられます。おそらく、予期しない結果は findAverage 関数から発生しています。原因を見つけるために、実行時のその動作を調べてみましょう。

ブレークポイントの設定

バグを調査するには、間違った結果を生成しているコード部分に到達したときにプログラムを一時停止する必要があります。これは、ブレークポイントを設定することによって行われます。ブレークポイントは、状態を調べるためにプログラムが一時停止されるコード行を示します。

  • findAverage 関数が呼び出される行のガターをクリックします。

    A breakpoint is set at the line that calls the findAverage method

デバッグモードでプログラムを実行する

それでは、デバッグモードでプログラムを起動してみましょう。

プログラムの実行およびデバッグ時に引数を渡す必要があるため、実行 / デバッグ構成にこれらの引数が含まれていることを確認してください。

{ "configurations": [ { "type": "cargo", "name": "find_average_debug", "cargoArgs": ["run"], "executableArgs": ["1","2","3"], }, ] }

実行ガターアイコンをクリックして、デバッグオプションを選択できます。または、⌘ R を押して実行構成を選択し、⌥⏎を押します。

Starting the app in debug mode from the Run and Debug popup

プログラムの状態を分析する

デバッガーセッションが開始されると、ブレークポイントに到達するまでプログラムは正常に実行されます。ブレークポイントに到達すると、JetBrains Fleet はプログラムを一時停止し、プログラムが中断された行をハイライトし、デバッグツールを表示します。

Debug tool window appears. The line with the breakpoint is highlighted

ハイライトされた行はまだ実行されていません。これで、プログラムはあなたからのさらなる指示を待ちます。中断状態では、プログラムの状態を保持する変数を調べることができます。

findAverage 関数はまだ呼び出されていないため、result などのすべてのローカル変数はまだスコープ内にありません。変数の内容は変数パネルに表示されます。

Rust variables panel

プログラムのステップスルー

デバッグツールに慣れてきたため、今度は findAverage 関数に踏み込み、内部で何が起こっているのかを調べます。

  1. 関数にステップインするには、デバッグツールウィンドウのツールバーのステップインボタンをクリックするか、⌘ ; を押します。

    Step into button located in the top part of the Debug tool

    実行ポイントを 1 ステップ進めたため、エディターのハイライトが別の行に移動します。

  2. ステップを続けて、ローカル変数 result がどのように宣言され、ループの各反復でどのように変更されるかを見てみましょう。

    New values in the Variables panel

    現在、変数には値が含まれています。これは、現在値を持つ result に追加されます。これまでのところエラーはありません。合計は正しく計算されています。

  3. さらに 2 つの手順を実行すると、return ステートメントに到達し、どこが省略されているかがわかります。入力数で割らずに、の値を持つ result を返します。これが、プログラム出力が正しくない原因でした。

  4. エラーを修正しましょう。

    result / args.len() as f64

デバッガーセッションを停止し、プログラムを再実行する

プログラムが正常に動作することを確認するには、デバッガーセッションを停止してプログラムを再実行します。

  1. デバッグツールウィンドウのツールバーで、停止ボタンをクリックするか、⌘⇧ \ を押します。

    Debugger session is stopped using the Stop button located in the Debug tool
  2. ⌘ R を押して実行構成を選択し、実行モードで起動します。

    After you click a Run button in the gutter, a menu with run/debug options appears
  3. ここでプログラムが正しく機能することを確認します。

    Compiling find_average v0.1.0 (/Users/jetbrains/my_directory/find_average) Finished dev [unoptimized + debuginfo] target(s) in 0.20s Running `target/debug/find_average 1 2 3` Average finder v.0.1 The average is 2
2025 年 5 月 22 日