簡単な紹介
私はこの記事を書いた理由でのスタートをしてみましょう。ある日、同僚は彼が彼が遭遇した問題のデバッグに役立つために私に尋ねました。私は彼がコードを入力して見て、私は次の行に気づきました:
int test = GetLastError();
彼は関数の前に失敗した場合、エラーコードを知りたいと思ったので、彼はそのようにしました。彼は、エラーコードを知りたいと思ったたびに、この行を追加します。私は彼が彼のウォッチウィンドウですべてのこれらの行と使用@ERR疑似レジスタを削除することが示唆されました。彼は私が人々の聞いたことがないので、疑似レジスタ書き込みのために、多くの人が知らない、オフィスでこの記事を聞いて回る、これが何であるかを知りませんでした。
疑似レジスタとは何ですか?
擬似レジスタは、現在のハードウェア・レジスタではなく、同一のハードウェア・レジスタ・ディスプレイとして。擬似レジスタは、デバッガでいくつかの値(エラーコード、スレッド情報ブロックを...)を参照して使用することができます。@ERR疑似レジスタで見てみましょう。お気に入りのアプリケーションにデバッガを起動します。デバッガが実行を壊すので、コード内の場所ブレークポイント、。「モニター」ウィンドウを(まだ開いていない場合)を開きます(これを行うには、リストから「モニタ」を選択し、空のスペースにツールバーを右クリックし、)。ウォッチウィンドウで@ERRを追加します。あなたは、値]列に0が表示されるはずです。今、この値を参照するようにコードを確認してください。それは、常に現在のスレッドのGetLastError()の数字が表示されます。あなたのコードが間違っているのであれば、この値が変更されます。
あなたがエラーなしこれが、あなたのコードをテストしたい場合、私はあなたがそれにいくつかを置く提案する(ただし、後でそれらを削除することを忘れないでください)。次を挿入することができます。
FILE *fp = fopen("c:\\a_file_that_does_not_exist.txt", "r");
あなたはこの行を行う場合は、@ERR値が2となるでしょう。意味の表示>「エラー検索」(「あなたがシステムをお知りになりたい場合は、ファイルが指定された見つけることができません」)がエラー値 - 「ツール」に移動します。私のような怠惰なお尻、そしてあなたのような巧妙な男の子/女の子、あなたはERR、時間@疑似レジスタ@ERRに入れることができます。レジスタの値を変更しますそうすることで、擬似エラー文字列です。これであなたもエラーを見ていません。私は、視聴ウィンドウに配置された「ERR、時間@」になっています。
条件式
疑似レジスタはまた条件式のために使用することができます。これを試すには、fopenの後に次の行を追加します。
if (fp)
{
fclose(fp);
}
ただ、好奇心のために(または、この記事とは関係ありません):ERRは何をしますか?どのように間違った番号を取得するには?それはありません)を正確にやって(ERRし、GetLastError @同じことが判明しました。これらの機能は、アセンブリコードの3行まで持っています:
mov eax,fs:[00000018h]
mov eax,dword ptr [eax+34h] ret
したがって、FSでERR @:[18時間]で取得尖ったスレッド環境ブロックDWORD 0x34のオフセット。
疑似レジスタ@TIB
@ERRレジスタは、疑似レジスタではありません。もう一つの重要な疑似レジスタは@TIBです。これは、スレッド情報は、マルチスレッドのデバッグに非常に有用で、現在のスレッドをブロックです。あなたが複数のスレッドによって呼び出される関数にブレークポイントを配置する場合は、関係なく、どのスレッドのブレークポイントを通じ、デバッガは、実行するたびに中断します。コードをステップ実行しながらも、他のスレッドがこの関数を呼び出した場合、デバッガはまた、ブレークポイントをスキップすることができます。この問題を解決するには、次の操作を行う必要があります。スレッドが中断を実行する場合は、ウォッチウィンドウで@TIBを追加します。あなたは、このような「0x7ffa6000」または従来のディスプレイでは「2147115008」として、いくつかの値が表示されます。ブレークポイントメニュー(Altキーを押しながらF9)に移動して、ブレークポイントを選択します。あなたは今@ TIB == 0x7ffa6000条件フィルタを追加することができます。そうすることで、デバッガはこのスレッドの実行を中断します。同じ機能を使用して他のすべてのスレッドは、割り込みが発生することはありません。
しかし、これはWindows98のでは動作しません。Windows98のために、あなたはインテルCPU FS登録参照してくださいする必要があり、それがスレッドごとに一意です。あなたは表現@ FS ==値を使用することができます。
疑似レジスタの完全なリストについて
Pseudoregister | 説明 |
@ERR |
最後のエラー値。返された同じ値GetLastError() API関数 |
@TIB |
現在のスレッドのスレッド情報ブロック。必要なデバッガが「FS:0」を処理しないためのフォーマット |
@CLK |
文書化されていないクロック・レジスタ; 唯一のウォッチウィンドウで使用可能 |
@EAX 、@EBX 、@ECX 、@EDX 、@ESI 、@EDI 、@EIP 、@ESP 、@EBP 、@EFL |
インテルのCPUレジスタ |
@CS 、@DS 、@ES 、@SS 、@FS 、@GS |
インテルCPUのセグメントレジスタ |
@ST0 、@ST1 、@ST2 、@ST3 、@ST4 、@ST5 、@ST6 、@ST7 |
インテルCPUの浮動小数点レジスタ |