※ ChatGPTを利用し、要約された質問です(原文:_CrtCheckMemoryのエラーについて)
_CrtCheckMemoryのエラーについて
このQ&Aのポイント
現在、あるプログラムのヒープ破壊と思われるエラーで悩んでおり、VC++のヒープチェック機能でデバッグしようとしています。
ちょっと摘み食いするだけのつもりでしたので、GNUMAKEをそのまま使ってコンパイルしているのですが、なぜかヒープ破壊の検出がうまくいかないようです。
どなたか、ご教授願います。環境は、Win7 Home 32bit、visual studio community 2017、Mingw
現在、あるプログラムのヒープ破壊と思われるエラーで悩んでおり、VC++のヒープチェック機能でデバッグしようとしています。
メイン開発ツールはMingwなのですが、AddressSanitizerなどが未実装のようなので、ヒープチェックのためだけにVisual Studio Communityを導入しました。
ちょっと摘み食いするだけのつもりでしたので、GNUMAKEをそのまま使ってコンパイルしているのですが、なぜかヒープ破壊の検出がうまくいかないようです。
期待しているのは、ヒープチェックのAssertでヒープ破壊のタイミングを見つけることです。
他のサイトの情報を見ると、Assertが引っかかったタイミングで、ちゃんとソースファイル名と行番号が表示されるはずなのですが、なぜか以下のような情報を吐くだけで、CrtCheckMemoryのソース?が挙げられるだけです。
Debug Assertion Failed!
File: debug_heap.cpp
Line: 280
Expression _CrtCheckMemory()
問題を切り分けるため、ヒープ破壊するだけの「CrtCheckMemory_TEST.c」をつくり、以下のコマンドでコンパイルしましたが、結果は同じでした。
"C:\Program Files\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvarsall.bat" x86
cl.exe /DUNICODE /D_UNICODE /D_DEBUG /MTd /c /FoCrtCheckMemory_TEST.obj CrtCheckMemory_TEST.c
cl.exe /D_DEBUG /MTd /FeCrtCheckMemory_TEST.exe CrtCheckMemory_TEST.obj
1つ目は、コマンドラインからコンパイルするための環境変数を設定するバッチファイルを起動しています。
2つめは、UNICODE指定とデバッグフラグを立てて、/MTd(これがチェックのためのライブラリだと思っています。)オプションでオブジェクトファイルを作っています。
3つめは実行ファイルを生成しています。
なにか、オプションの指定し忘れなどがあるのでしょうか。
どなたか、ご教授願います。
環境は、Win7 Home 32bit、visual studio community 2017、Mingw
以下に、問題のソースを載せておきます。
#include <tchar.h>
#include <stdio.h>
#include <locale.h>
#if defined (_MSC_VER) && (_DEBUG)
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#endif
int main(int argc, char **argv){
TCHAR *text;
setlocale( LC_ALL, "Japanese" );
#if defined (_MSC_VER) && (_DEBUG)
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF | _CRTDBG_CHECK_ALWAYS_DF );
_tprintf( _T("_CrtSetDbgFlag()実行\n") );
#endif
if(argc>1){
printf( "argv=%s\n", argv[0] );
}
text = malloc(10);
_tprintf( _T("メモリ破壊開始\n") );
text[-6] = 7;
_tprintf( _T("メモリ破壊終了\n") );
_ASSERTE( _CrtCheckMemory( ) );
return 0;
}
お礼
ありがとうございます。 道理で、わけのわからないライブラリでエラーを検出するわけですね・・・ フラグの意味を完全に誤解していました。 問題の位置を特定できました。