だから私はデバッガーを書いています。デバッガーでは、永続的なブレークポイントが必要です。現在、ブレークポイントを 1 つだけ設定する作業を行っています。デバッガーに続行するように指示すると、これを行います...
ptrace( PTRACE_GETREGS, child, NULL, ®s);
printf("%lx\n", regs.rip);
ptrace( PTRACE_SINGLESTEP, child, NULL, NULL);
ptrace( PTRACE_GETREGS, child, NULL, ®s);
printf("%lx\n", regs.rip);
ptrace( PTRACE_POKETEXT, child, (void *)original_addr, (original_data & ~0xff) | 0xcc);
しかし、私は出力を得ます...
40053d
40053d
リップが実際に更新されていないことを意味します。これは、ブレークポイントを反復するよりも多くの回数続行すると、ブレークポイントにまだあるという事実と一致しています。何かご意見は?
編集:ここに問題があります。子は、wait() 呼び出しを確認するまで SINGLESTEP を実際に実行しません。その時点で実行し、単一の命令を実行するときに親に制御を返します。wait を呼び出さなかったので、その時点では更新されませんでした。したがって、同じものを2回印刷するだけです。その後、チェックポイント ステータスに達し、命令の開始時に元の %rip に更新されます。乾杯。