同じCPUで実行されているデバッガーを使用してCPUレジスターを読み取るにはどうすればよいですか?

アセンブリについて学習しているときに、GDBを次の方法で使用しました。

gdb ./a.out (a is a compiled C script that only prints hello world)
break main
run
info registers

同じCPUを使用してレジスタを印刷しているときに、プログラムで使用されるレジスタを表示できるのはなぜですか? GDB(またはオペレーティングシステム)を使用してもレジスタが上書きされず、上書きされたレジスタのみが表示されるべきではありませんか?
私が考えることができる唯一の答えは、私のCPUがデュアルコアであり、コアの1つが使用されており、もう1つがプログラムのために保持されているという事実です。

ベストアンサー
オペレーティングシステムは、各実行スレッドのレジスタの状態を維持します。 gdbでレジスタを調べているとき、デバッガは実際にOSに保存された状態からレジスタ値を読み取るよう要求しています。あなたのプログラムはその時点では実行されていません、それはデバッガーです。

システムに他のプロセスがないと仮定しましょう。これが起こることの単純化されたビューです:

>デバッガーが起動してCPUを取得します
>デバッガーは、OSにプログラムのロードを要求します
>デバッガーはOSにブレークポイントの配置を要求します
>デバッガーは、プログラムの実行を開始するようOSに要求します。 OSはgdbレジスタの状態を保存し、プログラムに制御を渡します。
>プログラムがブレークポイントに到達します。 OSが制御を取得し、プログラムのレジスター状態を保存し、gdbレジスターを再ロードし、cpuをgdbに戻します。
>デバッガーは、保存された状態からプログラムのレジスターを読み取るようOSに要求します。

このメカニズムは、マルチタスクオペレーティングシステムの通常の役割の一部であり、デバッグに固有のものではないことに注意してください。 OSスケジューラが別のプログラムを実行する必要があると判断すると、現在の状態を保存して別のプログラムを読み込みます。これはコンテキストスイッチと呼ばれ、1秒間に何度も発生する可能性があり、CPUコアが1つしかない場合でもプログラムが同時に実行されるように見えます。

転載記事の出典を記入してください: 同じCPUで実行されているデバッガーを使用してCPUレジスターを読み取るにはどうすればよいですか? - コードログ