这个“accepted”并不完全正确。在某些情况下它是有效的。
(gdb) disas STARTADDRESS ENDADDRESS
最高票答案是正确的。如果您不想了解为什么它是正确的,请不要继续阅读。
(gdb) x/i 0xdeadbeef
使用一个适当的无意义十六进制地址。
我有一個STM32並使用PIC重定位了代碼。正常啟動地址為0x8000000,具有0x200向量表。所以正常進入點是0x8000200。然而,我已經將二進制編程到了0x80040200(相差兩個NOR閃存扇區),並希望在那裡調試。
gdb的問題是“file foo.elf”顯示代碼位於第一個範圍內。特殊命令(如'disassemble')實際上將查看主機上的二進制文件。對於交叉調試情況,gdb必須查看遠程內存,這可能很昂貴。因此,“x /i”(作為代碼檢查)似乎是最好的選擇。 gdb依賴的調試信息(程序開始/結束位置)不存在於隨機二進制塊中。
为了在嵌入式交叉系统上结合上述关于PIC代码的答案,
您需要创建多个elf文件,每个文件对应一个可能的目标位置。使用GDB的file
命令选择具有正确符号位置的文件。
这不适用于交叉开发
你可以使用 生成gcc调试符号。步骤如下:
- 构建正常的链接地址。
- 提取符号。
- 使用带有偏移量的
symbol-file
用于运行时地址。
(gdb) help symbol-file
Load symbol table from executable file FILE.
Usage: symbol-file [-readnow | -readnever] [-o OFF] FILE
OFF is an optional offset which is added to each section address.
然后,你可以切换符号文件以使用重新定位的运行地址来使用第一个答案。
如果您有这样一种情况,即代码已经被重定位,但数据是绝对的,您需要链接两次并选择重定位的elf文件(只有符号被重定位,代码是相同的)。对于NOR闪存而言,这是理想的XIP(执行就地)方式,因为内存设备的.text和.rodata与.data和.bss不同。也就是说,许多低中端嵌入式设备。然而,在GCC上,不支持此代码生成选项(至少在ARM上是如此)。您必须使用“静态基本”寄存器(例如,像U-boot一样使用r9
)。