バグを見つける方法 (WinDbg)—Qt

 1 はじめに

プログラムを書いていると必ずさまざまなバグが発生しますが、そのバグをいかに早く発見するかはプログラマーに必要なスキルの一つです。

2. いくつかの方法

2.1. 論理分析

プログラムの問題点に基づいて、問題が発生する可能性のあるいくつかの箇所を分析し、論理的な分析によってバグを発見し、バグを解決します。多くのバグは不注意によって引き起こされ、通常は論理分析によって発見できます。

2.2. VS デバッグ

私は卒業以来 Qt を使って開発してきたので、コードを書くのには Qt Creator を使うことに慣れていますが、デバッグに使うのは非常に難しく、Qt Creator 環境で頻繁にクラッシュしたり、場所が見つからなかったりします。有用なヒントはまったくありません。そのとき、VS 環境を構成し、VS 上でデバッグします。一般的に、どこが死んでいるのか、どのライブラリが不足しているのかがわかります。VS デバッグの実際の yyds。

2.3. WinDbg (ダンプファイル)

テスト中やユーザーの手元にあるなど、プログラムが自分の手元になく、突然問題が発生した場合も考えられます。問題を論理的に分析することに加えて、ダンプ ファイルを保存するコードを追加することもできます。開発中にプログラムを使用したり、問題が発生したときにツールを使用したりできます。WinDbg を開いてバグの場所を確認します。

使用方法を次に説明します。

2.3.1 WinDbg プレビューのダウンロード

WinDbg Preview は、よりモダンな視覚効果、より高速な Windows、成熟したスクリプト エクスペリエンスを備えた WinDbg の新しいバージョンです。ダウンロード アドレスは以下にあり、確実な方法でインストールできます。

Windows 用デバッグ ツールをダウンロード - WinDbg - Windows ドライバー | Microsoft Learn

2.3.2. ダンプファイルを保存するコードを追加する 

 まずproファイルに含めます

  QMAKE_CXXFLAGS_RELEASE += $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO
  QMAKE_LFLAGS_RELEASE += $$QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO
  LIBS += -lDbgHelp

次に、main.cpp ファイルを追加します。

long  __stdcall CrashInfocallback(_EXCEPTION_POINTERS *pexcp)
{
    QString appName = QCoreApplication::applicationDirPath();
    appName.append("/dmpDir");
    QDir dir(appName);
    if(!dir.exists()){
        dir.mkpath(appName);
    }
    appName.append("/")
            .append(QCoreApplication::applicationName())
            .append(".")
            .append(QString::number(QDateTime::currentMSecsSinceEpoch()))
            .append("_CRASH_DUMP.DMP");

    //create Dump file
    HANDLE hDumpFile = ::CreateFile(
        (LPCWSTR)appName.utf16(),
        GENERIC_WRITE,
        0,
        NULL,
        CREATE_ALWAYS,
        FILE_ATTRIBUTE_NORMAL,
        NULL
    );
    if (hDumpFile != INVALID_HANDLE_VALUE)
    {
        //Dump info
        MINIDUMP_EXCEPTION_INFORMATION dumpInfo;
        dumpInfo.ExceptionPointers = pexcp;
        dumpInfo.ThreadId = GetCurrentThreadId();
        dumpInfo.ClientPointers = TRUE;
        //write Dump
        ::MiniDumpWriteDump(
            GetCurrentProcess(),
            GetCurrentProcessId(),
            hDumpFile,
            MiniDumpNormal,
            &dumpInfo,
            NULL,
            NULL
        );
    }
    return 0;
}
int main(int argc, char *argv[])
{
    ::SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)CrashInfocallback);

    QApplication a(argc, argv);

    ...

    return a.exec();
}

2.3.3. エラー解析

エラー発生後、対応するディレクトリにダンプファイルが生成されます。

(1) WinDbg Preview がインストールされている場合は、ダンプ ファイルをダブルクリックすると WinDbg Preview が開きます。

(2)設定パス:ツールバーの [設定] をクリックするか、[ファイル] の下の [設定] をクリックします。

      (図 1)、図 2 に示すようにパスを構成します。

 (3)  図 3 に示すように、 「!analyze -v」をクリックして分析します。

  (4) 分析が完了すると、図 4 に示す結果が表示されます。

図1

図2 

画像3 

 

 図4

 3. 結論

 現在私が習得している方法はこれだけですが、状況に応じてさまざまな方法を使ってバグを見つけています。

おすすめ

転載: blog.csdn.net/xiaopei_yan/article/details/128445733