簡體   English   中英

斷點在帶有QEMU模擬cortex-a8的gdb中不起作用

[英]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,要么就采取了例外。 在每台機器的指令級別查看執行將告訴您它是什么。

這里有一些可能的可能性:

  • 可執行文件的構建假定其具有RAM,而realview-pb-a8沒有RAM-這通常表現為“對堆棧(或全局變量)的寫入靜默不執行任何操作,並且從堆棧/全局讀取返回0”,因此如果您在全局函數中有一個函數指針,或者嘗試將返回地址推入堆棧,然后彈出它,最終結果為0
  • 可執行文件的可執行文件,假定它在提供SVC API的操作系統下運行-在這種情況下,代碼將執行SVC指令,並且您的代碼將崩潰,因為在SVC異常向量中沒有任何可處理的內容
  • 為錯誤的CPU類型構建的可執行文件並執行UNDEFs指令(這將導致執行地址為undef向量的0x4,但是我感到gdbstub中存在qemu錯誤,這可能意味着執行UNDEF的步驟直到在UNDEF向量上執行第一個insn后,insn才會停止)
  • 假定FPU始終處於啟用狀態的可執行文件。 當QEMU執行這樣的“裸機”二進制文件時,CPU在硬件啟動的狀態下啟動,該硬件禁用了FPU。 因此,除非可執行文件的啟動代碼已明確打開FPU,否則使用FPU的任何指​​令都將為UNDEF。

我已經按照您的情況以大概的順序列出了這些內容,但是無論如何,只要通過機器指令一步一步就可以確定發生了什么。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM