GNU/Linux >> Linux の 問題 >  >> Linux

Windows でヒープ破損エラーを診断するにはどうすればよいですか?

@Carlos のソリューションは、小さな問題に最適です。しかし、大きな問題の場合、結果として生じる速度低下は、時には我慢できないものです。

この場合、配置できます

ASSERT(_CrtCheckMemory()); 

コードのどこかで、問題がすでに存在していると疑われます。このコマンドは、 new ごとにではなく、挿入された場所 (およびその場所のみ) でヒープをチェックします または delete _CRTDBG_CHECK_ALWAYS_DF の場合のように呼び出します .これにより、オプション _CRTDBG_CHECK_ALWAYS_DF と比較して、妥当な実行時間が維持されます。 .

アサートを配置するためにバイナリ検索のようなアプローチを使用することで、問題のあるコード行をかなり迅速に見つけることができます。

ただし、時々 _CrtSetDbgFlag(_CRTDBG_CHECK_ALWAYS_DF) および/または _CrtCheckMemory() 問題を検出できません。次に gflags を使用 ヒープ破損が発生した場所を示すことができる別の可能性があります。一言で言えば:

  • ページ ヒープを有効にします (通常は、管理者の権限が必要です) )、例:
    "C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\gflags.exe" /p /enable <full_path_to_exe_to_debug.exe> /full 
    
    ヒープが exe_to_debug.exe をチェックするというレポートがあります
  • デバッガでプログラムを実行します。範囲外のアクセスは、ヒープを破損してアクセス違反につながり、デバッガーで簡単に確認できます。
  • デバッグが完了したら、ページ ヒープを無効にします。例:
    "C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\gflags.exe" /p /disable <full_path_to_exe_to_debug.exe>
    
  • ヒープ チェックが有効になっているプログラムは、
    "C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\gflags.exe" /p
    
    で一覧表示できます。

デバッグ ヒープを使用し、main() の最初でこれを呼び出します。

_CrtSetDbgFlag(_CRTDBG_CHECK_ALWAYS_DF);

プログラムの速度が大幅に低下しますが、破損が発生するとすぐに壊れるはずです。

詳細については、次の記事を参照してください:https://msdn.microsoft.com/en-us/library/974tc9t1.aspx#BKMK_Check_for_heap_integrity_and_memory_leaks


Linux
  1. Linux 実行可能ファイル (バイナリ) を Windows exe ファイルに変換する方法は?

  2. InfluxDB を Windows にインストールする方法

  3. WSL (Ubuntu) Bash から Windows 実行可能ファイルを実行するにはどうすればよいですか?

  1. Windows 10にVim(vi)をインストールする方法

  2. Linux – Grubをアンインストールする方法は?

  3. Windowsでchkdskを実行する方法

  1. Windows10にPython3をインストールする方法

  2. Windows10でSSHキーを生成する方法

  3. WindowsでTelnetを使用する方法