1

タイトルが示すように、マシン コードの命令を実行中または実行後に読み取る方法はありますか? たとえば、C コードの任意のブロックがあり、そのブロックに入ったときにどの命令がコンパイルおよび実行されたかを知りたい場合、それを行う方法はありますか? この件に関するご意見をお寄せいただきありがとうございます。

編集:私がやろうとしていることに関するいくつかの動機:マシンコードがどのように作成されているかを実際に知る必要なく、どのようにコンパイルされたか、または現在実行されている命令を大まかに把握するプログラムが必要です。つまり、実行中のマシンコードをコピーして後で使用できるように、一部のコンパイラが以前にプログラムをコンパイルする際に行った大変な作業を使用したいのです。

4

5 に答える 5

2

あまり知られていない事実: GDB には curses インターフェースが組み込まれています。

gdbtuior gdbCtrl+ XCtrl+を使用Aして入力し、Ctrl+Xを使用2してアセンブリとソースを一緒に表示し始めます。現在の命令が強調表示され、矢印キーを使用してナビゲートできます。

于 2010-01-11T05:13:08.593 に答える
1

実行時にこれを行うことについて質問しているのか、それともコンパイル済みの C コードのアセンブリ コードを含むテキスト ファイルを表示したいのか、私にはわかりません。

前者の場合は、デバッガーを使用してください (で逆アセンブルを使用するgdbgcc、Microsoft Visual Studio の統合デバッガーを使用します)。

後者の場合は、コンパイラの特定のコマンドを調べる必要があります。たとえば、Visual Studio では、フラグ/FAs;を使用するだけです。これにより、ソース コードと共にアセンブリ コードが出力されます。の場合gcc:

gcc -c -g -Wa,-a,-ad foo.c > foo.lst
于 2010-01-10T19:35:38.950 に答える
1

ほとんどすべてのデバッガーがこれを行うことができます。

gdb の場合、覚えておくと便利なトリックは次のとおりです。display/i $pc

それを一度行ってから、関数にブレークポイントを設定し、 と を使用して関数をステップ実行しstepiますnexti

PCでの指示はその都度自動で表示されます。

Ross-Harveys-MacBook-Pro:so ross$ cat > deb.c
int main(void) { return (long)main + 0x123; }
Ross-Harveys-MacBook-Pro:so ross$ cc -O deb.c
Ross-Harveys-MacBook-Pro:so ross$ gdb -q a.out
Reading symbols for shared libraries .. done
(gdb) break main
Breakpoint 1 at 0x100000f30
(gdb) display/i $pc
(gdb) r
Starting program: /Users/ross/so/a.out 
Reading symbols for shared libraries +. done

Breakpoint 1, 0x0000000100000f30 in main ()
1: x/i $pc  0x100000f30 <main+4>:   lea    -0xb(%rip),%rax        # 0x100000f2c <main>
(gdb) stepi
0x0000000100000f37 in main ()
1: x/i $pc  0x100000f37 <main+11>:  add    $0x123,%eax
(gdb) stepi
0x0000000100000f3c in main ()
1: x/i $pc  0x100000f3c <main+16>:  leaveq 
于 2010-01-10T19:36:06.163 に答える
0

特定の関数の実行パスを知りたい場合は、おそらく一部のプロセッサにそのような機能がありますが、通常はありません。これで、エミュレーターで実行し、エミュレーターを変更して、フェッチや読み取りなどのアドレスを出力することができます。

これがgcc/binutilsツールobjdump-Dfilename> out.listを使用した逆アセンブルの質問であり、デバッガーの実行や使用を気にしない場合

于 2010-01-10T19:37:20.630 に答える
0

ほとんどのデバッガーには、実行中のコードの逆アセンブリを表示するオプションがあります。

例: gdb では逆アセンブル コマンドを使用します。

于 2010-01-10T19:32:38.113 に答える