[英]Breakpoint not working in gdb with QEMU simulating cortex-a8
我正在測試一些在ARM7TDMI中運行的簡單代碼,因為我沒有在QEMU上找到ARM7TDMI模擬器,所以我改用Cortex-a8(我不確定這是否會導致bug,完全是新手)。
這是我運行QEMU的方式:
qemu-system-arm -machine realview-pb-a8 -cpu cortex-a8 -nographic -monitor null -serial null -semihosting -kernel main.elf -gdb tcp::51234 -S
我要測試的代碼非常簡單,函數LoadContext()
和SaveContext()
是為IAR IDE用arm組件編寫的,而IAR IDE使用ARM7TDMI作為核心。 我將此組裝文件編譯為帶有IAR的目標文件,並將下面的代碼與arm-none-eabi-gcc
,這會導致不可預測的錯誤嗎? (只想使用gcc和QEMU代替IAR ...)
int main(void)
{
Running = &taskA;
Running->PC = task1;
Running->SP = &(Running->StackSeg[STACK_SIZE-1]);
LoadContext();
}
void task1(void)
{
register int reg_var = 1;
volatile int vol_var = 1;
SaveContext();
reg_var++;
vol_var++;
SaveContext();
reg_var++;
vol_var++;
LoadContext();
}
因此,當我在gdb中設置斷點時,它無法正常工作,我認為它將陷入無休止的循環。 我檢查了初始化過程,它是:
(gdb)
0x000082f6 in __libc_init_array ()
(gdb)
0x000080e2 in _start ()
(gdb)
0x000080e4 in _start ()
(gdb)
0x000080e6 in _start ()
(gdb)
main () at src/context-demo.c:12
12 int main(void) {
(gdb)
0x000081ea 12 int main(void) {
(gdb)
0x00000008 in ?? ()
(gdb)
0x0000000c in ?? ()
(gdb)
0x00000010 in ?? ()
(gdb)
0x00000014 in ?? ()
(gdb) c
Continuing.
^C
Program received signal SIGINT, Interrupt.
0x00000004 in ?? ()
(gdb) c
Continuing.
^C
Program received signal SIGINT, Interrupt.
0x00000004 in ?? ()
(gdb)
有人對這里發生的事情有任何想法嗎? 任何幫助表示贊賞,謝謝!
如果告訴gdb告訴它正在執行的匯編指令,您會發現調試起來容易得多(每次gdb停止運行,“ display / 3i $ pc”將打印接下來的3條指令),並執行單個指令的單個步驟(“ stepi”)。
某種原因導致您意外地以低地址0x8結尾,因此您需要找出那是什么。 您要么真的跳到了0x8,要么就采取了例外。 在每台機器的指令級別查看執行將告訴您它是什么。
這里有一些可能的可能性:
我已經按照您的情況以大概的順序列出了這些內容,但是無論如何,只要通過機器指令一步一步就可以確定發生了什么。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.