0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[DEBUG] 直感的なエラー対処への洞察

Posted at

In a nutshell

エラー対処は論理的アプローチが重要だが,直感的なパターン認識も有効である.
本記事では,エラーの兆候ごとに疑うべき原因を整理し,迅速なデバッグを支援する.
言語ごとの特有のエラーも網羅し,環境依存の問題にも対応できるようにまとめた.

はじめに

エラーへの対処は論理的に行う必要がある.ロジックやアーキテクチャからエラーの原因を導くことが重要であるのは自明だが,全てのケースに十分な時間を割くことは難しい.

そこで,「このパターンのときには,この原因を疑う」という直感的なエラー対処の指針を持つことが有用である.ケースバイケースであり,誤りでも構わないが,迅速なデバッグの助けとなる洞察を得られる.

以下に,具体的なエラーの兆候と,それに対応する疑うべき原因をまとめる.

エラーハンドリングの基本原則

  • 再現手順の確認: どの入力や環境でエラーが発生するか特定する.
  • ログの活用: エラーメッセージやスタックトレースを記録し,原因を特定する.
  • 最小限のコードで再現: 問題の箇所を切り出し,シンプルな形で確認する.
  • 例外処理の適用: try-catch(Pythonなら try-except)を活用し,適切にエラーを処理する.
  • 環境・バージョンの確認: OSやライブラリの違いによる影響をチェックする.
  • 仮説と検証を繰り返す: 修正を試し,同じエラーが再現するか検証する.

直感的なエラー対処パターン

出力が "0x..." のようなアドレス表記

疑うべき原因: メモリ関連の問題 や 存在しない箇所へのアクセス
具体例:

  • segmentation fault -> nullptr 参照や解放済みメモリのアクセス
  • 0xC0000005 (Access Violation) -> Windows環境での不正メモリアクセス
  • std::bad_alloc -> メモリ不足や無限ループによる過剰なメモリ確保

出力が "nan" や "inf"

疑うべき原因: 数値計算エラー
具体例:

  • 0除算 (x / 0)
  • ルートの中に負の数 (sqrt(-1))
  • 浮動小数点のオーバーフロー (exp(1000))
  • log(0), 1/0, atan2(0, 0)

ファイルパス関連のエラー

疑うべき原因: 権限,パスの違い,環境依存
具体例:

  • FileNotFoundError -> 相対パスとカレントディレクトリを確認
  • Permission denied -> OSの権限や管理者権限をチェック
  • IsADirectoryError -> ディレクトリの指定ミス

処理が途中で止まる (無限ループ or ハング)

疑うべき原因: 無限ループ,デッドロック
具体例:

  • while (true) で抜け出す条件がない
  • mutex.lock() したまま unlock() していない
  • マルチスレッドで join() の順番が間違っている

特定の環境だけで動かない

疑うべき原因: OS依存,ライブラリのバージョン違い
具体例:

  • WindowsとLinuxで改行コード (\r\n vs \n)
  • Pythonのバージョン (3.7 では動くが 3.11 では動かない等)
  • CUDAのバージョンが違うため GPU が認識されない

エラーが出ないが期待通りの動作をしない

疑うべき原因: 変数の上書き,スコープミス,初期化忘れ
具体例:

  • int x; cout << x; -> 未初期化の変数
  • if (a = 10) -> = の誤使用 (== ではなく = を使ってしまった)
  • global_variable がローカル変数で上書きされる

特定の入力だけでエラーが発生する

疑うべき原因: 境界条件,例外処理漏れ
具体例:

  • リストの末尾アクセス (arr[arr.size()])
  • 負の数やゼロが入った場合の処理 (1/xsqrt(x) )
  • JSON のキーが存在しない (dict["key"]KeyError)

特定のOSでビルドが通らない

疑うべき原因: 環境変数,パスの違い,コンパイラ依存
具体例:

  • g++ では動くが MSVC では動かない
  • #include <unistd.h> が Windows でエラー
  • make コマンドが Windows では mingw32-make

特定の言語に由来するエラー

Vue.jsで特徴的なエラー

疑うべき原因: コンポーネントのライフサイクル,データバインディング,依存関係の管理
具体例:

  • Cannot read property of undefined -> data() で定義していない変数を参照
  • Property or method is not defined -> Vueインスタンスに登録されていない関数や変数を使用
  • Vue warn: Error in render function -> テンプレートで存在しない変数を参照

Pythonで特徴的なエラー

疑うべき原因: インデントミス,型の不一致,モジュールのインポート
具体例:

  • IndentationError: unexpected indent -> インデントが不正
  • TypeError: unsupported operand type(s) -> 文字列と数値を加算しようとした
  • ModuleNotFoundError -> インストールされていないモジュールをインポートしようとした

Node.jsで特徴的なエラー

疑うべき原因: 非同期処理,モジュールのロード,環境設定
具体例:

  • Cannot find module -> require() で指定したモジュールが見つからない
  • UnhandledPromiseRejectionWarning -> async/await のエラーハンドリング不足
  • EADDRINUSE -> 使用済みのポートでサーバーを起動

C++で特徴的なエラー

疑うべき原因: ポインタの誤使用,未定義動作,コンパイル時の型不一致
具体例:

  • Segmentation fault (core dumped) -> nullptr の参照,未確保のメモリへのアクセス
  • std::bad_alloc -> メモリ不足による new 失敗
  • error: no matching function for call to -> 関数のオーバーロードやテンプレートの型不一致
  • undefined reference to -> ヘッダのみの関数を定義し忘れた,リンカエラー

Javaで特徴的なエラー

疑うべき原因: クラスとオブジェクトの管理,例外処理,型の厳格なチェック
具体例:

  • NullPointerException -> null のオブジェクトメンバを参照
  • ClassCastException -> 型変換の失敗(例: StringInteger にキャスト)
  • ArrayIndexOutOfBoundsException -> 配列の範囲外アクセス
  • NoClassDefFoundError -> クラスがコンパイル済みだが実行時に見つからない

Rustで特徴的なエラー

疑うべき原因: 所有権の管理,型の厳密性,コンパイル時チェックの強化
具体例:

  • error[E0382]: borrow of moved value -> 所有権が移動した値を再利用
  • thread 'main' panicked at -> unwrap()NoneErr を取得
  • expected struct, found reference -> 参照と所有値のミスマッチ
  • cannot borrow as mutable -> 可変借用の制約違反

Kotlinで特徴的なエラー

疑うべき原因: Null Safety,Coroutine の誤用,型システムの制約
具体例:

  • kotlin.KotlinNullPointerException -> !! を使用して null を強制アンラップ
  • Unresolved reference: X -> 変数がスコープ内にない
  • IllegalStateException: coroutine scope has been cancelled -> Coroutine のキャンセル後に処理を続けようとした
  • lateinit property X has not been initialized -> lateinit の変数を初期化前に参照

Summary

  • エラーハンドリングの基本原則: 再現手順・ログの確認,最小限のコードでの検証が鍵
  • 直感的なエラー対処パターン: メモリ・数値計算・ファイル・無限ループ・環境依存などの分類
  • 特定の入力や環境でのみ発生するエラー: 境界条件,OSやバージョン差異を考慮する
  • 言語別のエラー: Vue.js, Python, Node.js, C++, Java, Rust, Kotlinの主要エラーと対処法を整理
  • 環境依存のエラー: WindowsとLinuxの違い,ライブラリのバージョンによる影響を解説
  • 迅速なデバッグのための指針: ケースごとに疑うべきポイントを把握し,仮説検証を繰り返す
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?