ダンプファイルを開くときに、Windowsクラッシュダンプを調査していて、Visual Studioデバッガに「不正な命令0xC000001D
」が表示されます。私は手動でデバッガのメモリウィンドウ内のいくつかの無効な値を持つ関数のコードが、クラッシュダンプを上書きすることにより、デバッガで上記の例を作成したWindows XPでは、通常のC++プログラムでコードセグメントを上書きすることはできますか?
void g(int x) {
00401E80 push ebp
00401E81 mov ebp,esp
if(x > 20) {
00401E83 cmp dword ptr [x],14h
00401E87 jle g+14h (401E94h)
x *= 4;
>00401E89 db 0fh // illegal instruction here
00401E8A db 0fh
00401E8B xadd eax,esp
00401E8E add cl,byte ptr [ecx+9EB0845h]
x += 42;
00401E94 mov ecx,dword ptr [x]
...
:それは、このエラーは、次の例に沿って分解をそれぞれ示すコード位置私は調査で同じdb 0fh
のエントリを示していますが、明らかに無効な命令を示しています。このコードは、無効な命令より前の命令がすべて有効でソースコードと一致しているという点で、ダンプファイルに表示されるコードと似ています。台無しのコードセグメントにする(Windows XP上のVisual C++ 2005) - メモリページアクセス制限の周り混乱しないこと -
は今質問は、それがすべてで正常にコンパイルされたC++プログラム内で可能であるですプロセス?
コードから上記の例の関数アドレスに書き込もうとすると、コード違反のメモリページが書き込み保護されているように見えるアクセス違反が常に発生します。
{
void* fnAddr = &g; // non-portable but OK in VC++
unsigned int x = 0xDEADBEEF;
// Simulate memory corruption: Try to write something to the code segment:
memcpy((char*)fnAddr+4, &x, sizeof(x)); // generated 0xC0000005 Access Violation
g(42); // call messed up function - never get here
}
実際にコードセグメント内の何かを誤って上書きする可能性のある状況がありますか?
私は、実際のプログラムは多くの仮想関数、いくつかのメンバ関数ポインタなどを含んでいて、問題は悲しいかなか再現できないと付け加えるべきです。さもないと。 - しかし、ダンプファイルはコードセグメントに不正な命令を表示するので、コードセグメントを混乱させる可能性は考えられませんでした。
ファイルが問題ないようです。 RAMエラーは起こりそうもないようですが、テストします。たぶんダンプファイルは、私が私にそれを見せていると思うものを私に見せてくれないでしょう。 –