233

Visual Studioでは、実行時にC ++のデバッガーで変数を検査するときに、「baadf00d」が表示され、「CC」と「CD」が表示されました。

私が理解していることから、「CC」は、メモリがnew()またはalloc()になり、ユニット化されたことを示すためだけにDEBUGモードになっています。「CD」は削除または解放されたメモリを表します。RELEASEビルドで「baadf00d」を見ただけです(しかし、間違っている可能性があります)。

たまに、メモリリークやバッファオーバーフローなどに対処する状況に陥り、このような情報が役に立ちます。

デバッグの目的でメモリが認識可能なバイトパターンに設定されているのはいつ、どのモードであるかを誰かが指摘してくれるでしょうか。

4

3 に答える 3

345

このリンクには詳細があります:

https://en.wikipedia.org/wiki/Magic_number_(programming)#Debug_values

* 0xABABABAB:割り当てられたヒープメモリの後に「人の土地がない」ガードバイトをマークするためにMicrosoftのHeapAlloc()によって使用されます
* 0xABADCAFE:すべての空きメモリを初期化して誤ったポインタをキャッチするためのこの値の起動
* 0xBAADF00D:初期化されていない割り当てられたヒープメモリをマークするためにMicrosoftのLocalAlloc(LMEM_FIXED)によって使用されます
* 0xBADCAB1E:デバッガーへの接続が切断されたときにMicrosofteVCデバッガーに返されるエラーコード
* 0xBEEFCACE:Microsoft.NETによってリソースファイルのマジックナンバーとして使用されます
* 0xCCCCCCCC:初期化されていないスタックメモリをマークするためにMicrosoftのC++デバッグランタイムライブラリによって使用されます
* 0xCDCDCDCD:初期化されていないヒープメモリをマークするためにMicrosoftのC++デバッグランタイムライブラリによって使用されます
* 0xDDDDDDDD:解放されたヒープメモリをマークするためにMicrosoftのC++デバッグヒープによって使用されます
* 0xDEADDEAD:ユーザーが手動でクラッシュを開始したときに使用されるMicrosoftWindowsSTOPエラーコード。
* 0xFDFDFDFD:割り当てられたヒープメモリの前後に「人のいない土地」のガードバイトをマークするためにMicrosoftのC++デバッグヒープによって使用されます
* 0xFEEEFEEE:解放されたヒープメモリをマークするためにMicrosoftのHeapFree()によって使用されます
于 2008-09-24T14:14:34.710 に答える
114

実際には、デバッグ割り当てに追加されたかなりの有用な情報があります。この表はより完全です:

http://www.nobugs.org/developer/win32/debug_crt_heap.html#table

アドレス オフセット HeapAlloc() 後 malloc() 後 free() 中 HeapFree() 後 コメント
0x00320FD8 -40 0x01090009 0x01090009 0x01090009 0x0109005A Win32 ヒープ情報
0x00320FDC -36 0x01090009 0x00180700 0x01090009 0x00180400 Win32 ヒープ情報
0x00320FE0 -32 0xBAADF00D 0x00320798 0xDDDDDDDD 0x00320448 次の CRT ヒープ ブロックへの Ptr (以前に割り当てられた)
0x00320FE4 -28 0xBAADF00D 0x00000000 0xDDDDDDDD 0x00320448 前の CRT ヒープ ブロックへの Ptr (後で割り当てられる)
0x00320FE8 -24 0xBAADF00D 0x00000000 0xDDDDDDDD 0xFEEEFEEE malloc()呼び出しのファイル名
0x00320FEC -20 0xBAADF00D 0x00000000 0xDDDDDDDD 0xFEEEFEEE malloc()呼び出しの行番号
0x00320FF0 -16 0xBAADF00D 0x00000008 0xDDDDDDDD 0xFEEEFEEE malloc() のバイト数
0x00320FF4 -12 0xBAADF00D 0x00000001 0xDDDDDDDD 0xFEEEFEEE タイプ (0=解放、1=通常、2=CRT 使用など)
0x00320FF8 -8 0xBAADF00D 0x00000031 0xDDDDDDDD 0xFEEEFEEE リクエスト番号、0 から増加
0x00320FFC -4 0xBAADF00D 0xFDFDFDFD 0xDDDDDDDD 0xFEEEFEEE ノーマンズランド
0x00321000 +0 0xBAADF00D 0xCDCDCDCD 0xDDDDDDDD 0xFEEEFEEE 必要な 8 バイト
0x00321004 +4 0xBAADF00D 0xCDCDCDCD 0xDDDDDDDD 0xFEEEFEEE 必要な 8 バイト
0x00321008 +8 0xBAADF00D 0xFDFDFDFD 0xDDDDDDDD 0xFEEEFEEE ノーマンズランド
0x0032100C +12 0xBAADF00D 0xBAADF00D 0xDDDDDDDD 0xFEEEFEEE Win32 ヒープ割り当ては 16 バイトに切り上げられます
0x00321010 +16 0xABABABAB 0xABABABAB 0xABABABAB 0xFEEEFEEE Win32 ヒープ簿記
0x00321014 +20 0xABABABAB 0xABABABAB 0xABABABAB 0xFEEEFEEE Win32 ヒープ簿記
0x00321018 +24 0x00000010 0x00000010 0x00000010 0xFEEEFEEE Win32 ヒープ簿記
0x0032101C +28 0x00000000 0x00000000 0x00000000 0xFEEEFEEE Win32 ヒープ簿記
0x00321020 +32 0x00090051 0x00090051 0x00090051 0xFEEEFEEE Win32 ヒープ簿記
0x00321024 +36 0xFEEE0400 0xFEEE0400 0xFEEE0400 0xFEEEFEEE Win32 ヒープ簿記
0x00321028 +40 0x00320400 0x00320400 0x00320400 0xFEEEFEEE Win32 ヒープ簿記
0x0032102C +44 0x00320400 0x00320400 0x00320400 0xFEEEFEEE Win32 ヒープ簿記
于 2008-12-09T17:41:30.450 に答える
6

0xCC特に、これらは 1980 年代のIntel 8088 / 8086プロセッサ命令セット0xCDの遺物です。ソフトウェア割り込みオペコード の特殊なケースです。特殊な 1 バイト バージョンでは、プログラムで割り込みを生成できます 30xCCINT 0xCD0xCC

ソフトウェア割り込み番号は、原則として任意ですINT 3が、伝統的にデバッガーのブレークまたはブレークポイント機能に使用され、今日まで残っている慣例です。INT 3デバッガーが起動されるたびに、そのオペコードが実行されたときにデバッガーがトリガーされるように、割り込みハンドラーがインストールされます。通常、現在実行中のプログラミングを一時停止し、インタラクティブなプロンプトを表示します。

通常、x86INTオペコードは 2 バイト0xCDで、その後に 0 ~ 255 の目的の割り込み番号が続きます。を発行することはできますが、未使用メモリの信頼できる「フィル バイト」として機能するには、オペコードが 1 バイトのみである必要がある0xCD 0x03ためINT 3、Intel は特別なバージョンを追加することにしました。追加のバイトはありません。0xCC

ここでのポイントは、意図した命令が含まれていないメモリにプロセッサが誤ってジャンプした場合に、正常に回復できるようにすることです。マルチバイト命令は、この目的には適していません。誤ったジャンプが、適切に形成された命令ストリームを続行する必要がある可能性のあるバイト オフセットに到達する可能性があるためです。

明らかに、1 バイトのオペコードはこれに対して自明に機能しますが、風変わりな例外もある可能性があります。たとえば、フィル シーケンス (このページでも説明されています) を考慮すると、命令ポインター0xCDCDCDCDがどこに到達しても(おそらく最後に満たされたバイトを除いて)、CPU は有効な2 バイトx86 命令の実行を再開できます。この場合、ソフトウェア割り込み 205 (0xCD) を生成します。CD CD

さらに奇妙ですが、CD CC CD CC100% 解釈可能であり、どちらINT 3かを指定すると、INT 204シーケンスCC CD CC CDの信頼性が低くなり、示されているように 75% しかありませんが、一般に、int サイズのメモリ フィラーとして繰り返されると 99.99% です。

INT命令を示す同時代の8088/8086命令セットマニュアルのページ
マクロ アセンブラー リファレンス、1987 年

于 2018-01-15T00:25:48.377 に答える