私はgdbが初めてです。ac プログラムの実行中に実際のシーケンスで使用されるメモリ アドレスを出力したいと考えています。私の質問を例で説明しましょう。main() と test() の 2 つの関数を含む次の c コードがあるとします。gdb 内で、「main の逆アセンブル」を使用して main() 関数を逆アセンブルするか、「test の逆アセンブル」を使用して test() 関数を個別に逆アセンブルできることを知っています。私の質問は、これら 2 つの関数を 1 つのコードとして逆アセンブルするにはどうすればよいかということです。実行中に使用されたすべてのメモリアドレスとそれらのアクセスシーケンスを確認できますか? 具体的に言うと、main() が test() を呼び出していて、test() も自分自身を複数回呼び出しているので、例 2 のようなものを見たいと思っています。それらは仮想メモリアドレスですか、それとも物理メモリアドレスですか? ヘルプやガイダンスをいただければ幸いです。
例 1:
#include "stdio.h"
int test(int q)
{
if(q<16)
test(q+5);
return q;
}
void main()
{
unsigned int a=5;
unsigned int b=5;
unsigned int c=5;
test(a);
}
例 2:
<Memory Address> <assembly instruction> <c instructions>
0x12546a mov //for unsigned int a=5;
0x12546b mov //for unsigned int b=5;
0x12546c mov //for unsigned int c=5;
0x12546d jmp //for test(q=a=5);
0x12546e cmpl //for if(q<16)
0x12546f jmp //for test(q+5);
0x12546d jmp //for test(q=10);
0x12546e cmpl //for if(q<16)
0x12546f jmp //for test(q+5);
0x12547a jmp //for test(q=15);
0x12547b cmpl //for if(q<16)
0x12547c jmp //for test(q+5);
0x12547d jmp //for test(q=20);
0x12547e cmpl //for if(q<16)
0x12547f jmp //return q);
0x12548a jmp //return q);
0x12548b jmp //return q);
0x12548c jmp //return q);