-1

私は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);
4

2 に答える 2

0

これを行うためのきれいな方法は本当にありません。コードをステップスルーする必要があります。

(gdb) stepi
(gdb) x/i $pc
(gdb) info registers
(gdb) stepi
(gdb) x/i $pc
(gdb) info registers
.....

スクリプトを作成して、すばやく実行し、データをファイルにダンプすることもできますが、それだけです。

于 2012-12-07T10:56:40.550 に答える
0

valgrind の方がうまくいくと思います。そのための既存のツールがない場合は、独自の計測器を追加して (それだけでなく) メモリ アクセスを報告するか、既存のものを変更することができます。

たとえば、http: //valgrind.org/docs/manual/lk-manual.htmlを参照してください。

--trace-mem= [デフォルト: いいえ]

有効にすると、Lackey は、プログラムによって行われるほぼすべてのメモリ アクセスのサイズとアドレスを出力します。

于 2012-12-07T18:29:37.303 に答える