0

複数のオブジェクト ファイルからリンカによって作成されたプログラムのソースを段階的にデバッグしたいと考えています。

簡単にするために、1 つのソースはスタートアップ ルーチンが配置されているアセンブリ ファイルであり、もう 1 つは C ファイルであると仮定します。プログラムは以下のmakefileでビルドされます

 PREFIX=/opt/arm/bin
 LDSCRIPT=ld.script
 AS_BASEN=$(basename startup.s)
 C_BASEN=$(basename main.c)
 ASFLAGS=-g
 CCFLAGS=-g -nostartfiles
 LDFLAGS=--fatal-warnings    

 $(C_BASEN).bin: $(C_BASEN).elf
    $(PREFIX)/arm-objcopy -O binary $< $@

 $(C_BASEN).elf: $(LDSCRIPT) $(AS_BASEN).o $(C_BASEN).o
    $(PREFIX)/arm-ld $(LDFLAGS) -T $(LDSCRIPT) $(AS_BASEN).o $(C_BASEN).o -o $@

 $(C_BASEN).o: $(C_BASEN).c
    $(PREFIX)/arm-gcc $(CFLAGS) -c $< -o $@

 $(AS_BASEN).o: $(AS_BASEN).s Makefile
    $(PREFIX)/arm-as $(ASFLAGS) $< -o $@

私の問題はopenocdに依存していないと思いますが、完全を期すためにopenocd固有の部分を述べます。openocd デーモンが開始された後、次のコマンドでデバッグ セッションを開始します。

 nc localhost 4444 <<eof
 soft_reset_halt
 load_image `pwd`/main.bin $memory_location
 step $memory_location
 exit
 eof
 ddd --debugger 'arm-gdb -ex "target remote localhost:3333"' 

ここで、$memory_location は .text セクションの最初のアドレスです。開いた後ddd、プログラムは目的のアドレスで停止し、通常どおりアセンブリ ラインを 1 ステップ実行できます。最後に、Cファイルにある関数にジャンプするジャンプ命令に到達します。もう1ステップ後、プログラムが実行されている間、gdbは応答しなくなります。

たぶん、あなたの専門家の 1 人が、私が何を変更しなければならないかのヒントを教えてくれるので、この時点で gdb が c ソースに切り替わり、段階的な実行を続けることができます。

4

1 に答える 1

0

たぶん、これらのツールの異なるバージョンを試すことができます(ツール内のバグが予想される動作を妨げる場合)。こちらをご覧くださいhttp://www.comsytec.com/products/gnu-binaries/gcc-binaries.html

于 2012-04-11T18:15:50.737 に答える