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. 結論
現在私が習得している方法はこれだけですが、状況に応じてさまざまな方法を使ってバグを見つけています。