2012-04-11 44 views
0

我想逐步調試由鏈接器從多個目標文件形成的程序的來源。使用gdb(目標分支)通過openocd調試多源(asm和c)程序

爲簡單起見,我假設一個源文件是一個程序集文件,其中啓動例程位於另一個文件夾中,另一個文件是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 $< [email protected] 

$(C_BASEN).elf: $(LDSCRIPT) $(AS_BASEN).o $(C_BASEN).o 
    $(PREFIX)/arm-ld $(LDFLAGS) -T $(LDSCRIPT) $(AS_BASEN).o $(C_BASEN).o -o [email protected] 

$(C_BASEN).o: $(C_BASEN).c 
    $(PREFIX)/arm-gcc $(CFLAGS) -c $< -o [email protected] 

$(AS_BASEN).o: $(AS_BASEN).s Makefile 
    $(PREFIX)/arm-as $(ASFLAGS) $< -o [email protected] 

建立Altough我認爲我的問題是OpenOCD的的independet我州爲了完整起見,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打開後,程序停在所需的地址,我可以照常單步穿過裝配線。最後我到達跳轉指令,跳轉到位於c文件中的函數。再過一步之後,gdb不再響應,而是執行程序。

也許你們中的一位專家可以給我一個提示,我必須改變,以便gdb在這一點切換到c源,在那裏我可以繼續逐步執行。

回答

0

也許你可以嘗試這些工具的不同版本(如果它們內部的某個bug抑制了預期的行爲)。試試看這裏http://www.comsytec.com/products/gnu-binaries/gcc-binaries.html

+0

嘿謝謝你的貢獻。如果我很快就解決不了問題,我會考慮更新我的手臂工具鏈。雖然,根據我的經驗,大多數時候錯誤並不在程序本身,而是缺少缺少背景信息。所以我還是會等待一段時間的回覆。 – user1146332 2012-04-12 09:33:29