直面した場合は、 gflags(GFlagsおよびPageHeapanother thread overwriting memory of the crashing thread
)を使用すると便利です。クラッシュする前に実行された数行を通知する代わりに、アルゴリズムが正しく割り当てられたメモリブロックを上書きした場所を正確に通知します。
最初に、このタイプのチェックをアクティブにします。
gflags /p /enable your_app.exe /full
また
gflags /p /enable your_app.exe /full /backwards
正しくアクティブ化されていることを確認してください
gflags /p
アプリケーションを実行し、ダンプファイルを収集します
次に、gflagsによるチェックを無効にします。
gflags /p /disable your_app.exe
アップデート1
It does not immediately detect problems like *p = 0; where p is an invalid pointer
少なくともいくつかの問題が検出されました。
例えば:
#include <stdio.h>
int main(int argc, char *argv[])
{
int *p = new int;
printf("1) p=%p\n",p);
*p = 1;
delete p;
printf("2) p=%p\n",p);
*p = 2;
printf("Done\n");
return 0;
}
gflagsを有効にして実行すると、ダンプファイルが取得され、問題が正しく識別されます。
STACK_TEXT:
0018ff44 00401215 00000001 03e5dfb8 03dfdf48 mem_alloc_3!main+0x5b [c:\src\tests\test.cpp\mem_alloc\mem_alloc\mem_alloc.3.cpp @ 11]
0018ff88 75f8339a 7efde000 0018ffd4 77bb9ef2 mem_alloc_3!__tmainCRTStartup+0x10f [f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c @ 586]
0018ff94 77bb9ef2 7efde000 2558d82c 00000000 kernel32!BaseThreadInitThunk+0xe
0018ffd4 77bb9ec5 004013bc 7efde000 00000000 ntdll!__RtlUserThreadStart+0x70
0018ffec 00000000 004013bc 7efde000 00000000 ntdll!_RtlUserThreadStart+0x1b
STACK_COMMAND: ~0s; .ecxr ; kb
FAULTING_SOURCE_CODE:
7: printf("1) p=%p\n",p);
8: *p = 1;
9: delete p;
10: printf("2) p=%p\n",p);
> 11: *p = 2;
12: printf("Done\n");
13: return 0;
14:
15: }
アップデート2
@fmunkertからの別の例:
#include <stdio.h>
int main()
{
int *p = new int;
printf("1) p=%p\n",p);
*p = 1;
p++;
printf("2) p=%p\n",p);
*p = 2; // <==== Illegal memory access
printf("Done\n");
return 0;
}
gflags /p /enable mem_alloc.3.exe /full /unaligned
STACK_TEXT:
0018ff44 00401205 00000001 0505ffbe 04ffdf44 mem_alloc_3!main+0x52 [c:\src\tests\test.cpp\mem_alloc\mem_alloc\mem_alloc.3.cpp @ 12]
0018ff88 75f8339a 7efde000 0018ffd4 77bb9ef2 mem_alloc_3!__tmainCRTStartup+0x10f [f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c @ 586]
0018ff94 77bb9ef2 7efde000 2577c47c 00000000 kernel32!BaseThreadInitThunk+0xe
0018ffd4 77bb9ec5 004013ac 7efde000 00000000 ntdll!__RtlUserThreadStart+0x70
0018ffec 00000000 004013ac 7efde000 00000000 ntdll!_RtlUserThreadStart+0x1b
STACK_COMMAND: ~0s; .ecxr ; kb
FAULTING_SOURCE_CODE:
8: printf("1) p=%p\n",p);
9: *p = 1;
10: p++;
11: printf("2) p=%p\n",p);
> 12: *p = 2; // <==== Illegal memory access
13: printf("Done\n");
14: return 0;
15:
16: }
残念ながら、/ unalignedオプションを使用すると、プログラムが正しく動作しない可能性があります(Pageheap.exeの使用方法)。
一部のプログラムは、8バイトのアラインメントについて想定しており、/unalignedパラメーターで正しく機能しなくなります。Microsoft Internet Explorerは、そのようなプログラムの1つです。