[英]Why is gcc emmiting code aligned to a 2 byte boundary for the ARM instruction set?
[英]ARM SIGSEGV on a MOV instruction
在android模擬器上進行遠程調試時,在mov
指令上有一個SIGSEGV。
我不了解此動作是如何導致SIGSEGV的。 下面是gdb會話:
0x000080c0 in ?? ()
(gdb) disassemble 0x80c0,0x80e0
Dump of assembler code from 0x80c0 to 0x80e0:
=> 0x000080c0: mov r0, sp
0x000080c4: mov r1, #0
0x000080c8: add r2, pc, #4
0x000080cc: add r3, pc, #4
0x000080d0: b 0x18998
0x000080d4: b 0x189a0
0x000080d8: andeq r11, r1, r0
0x000080dc: andeq r11, r1, r8
End of assembler dump.
(gdb) stepi
Cannot access memory at address 0x0
Program received signal SIGSEGV, Segmentation fault.
0x000140b2 in ?? ()
(gdb) info register
r0 0xfffffffc 4294967292
r1 0xbeb91c13 3199802387
r2 0x0 0
r3 0x80d8 32984
r4 0x80d8 32984
r5 0xfffffffc 4294967292
r6 0x1b224 111140
r7 0xfffffffc 4294967292
r8 0x0 0
r9 0x0 0
r10 0x0 0
r11 0x0 0
r12 0x0 0
sp 0xbeb91acc 0xbeb91acc
lr 0x14dcf 85455
pc 0x140b2 0x140b2
cpsr 0x80000030 -2147483600
執行前的狀態中的更多信息:
(gdb) info register
r0 0x0 0
r1 0xbe877c14 3196550164
r2 0x0 0
r3 0x0 0
r4 0x0 0
r5 0x0 0
r6 0x0 0
r7 0x0 0
r8 0x0 0
r9 0x0 0
r10 0x0 0
r11 0x0 0
r12 0x0 0
sp 0xbe877b00 0xbe877b00
lr 0x0 0
pc 0x80c0 0x80c0
cpsr 0x10 16
因此執行不是憑空完成的。
編輯:如@artlessnoise所示,這是更多詳細信息:我在Android模擬器上運行,該設備是Nexus One,它是android的4.4版。
這里的gdb會話是程序的開始。 它在命令之后:
(gdb) target remote localhost:5003
在stepi之前和之后,我只有一個線程。
我不明白是怎么
mov
的事業SIGSEGV。
沒有。
您正在將cpsr
設置為0x10運行,這是用戶模式ARM狀態,具有中斷和FIQ啟用。 您的調試器任務是系統意識的嗎? 您尚未提供有關系統的足夠信息。 0x140b2和0x14dcf位置是什么(即,什么例程/代碼)? 堆棧發生了很大的變化,因此您沒有運行單個周期。
中斷/ FIQ可能會改變控制流程。 另一種可能是頁面錯誤。
如果知道任務,信號可以改變對stepi
控制。 您有多線程應用程序嗎? 使用info threads
可能會有所幫助。
有時調試器會在下一條指令中編寫一個臨時斷點並運行; 這並不意味着他們只執行一條指令。 信號,中斷,頁面錯誤都可能在命中臨時斷點之前改變執行。 stepi
並不表示PC所在的指令已引起異常。
我發現問題出在遠程gdb。 開始運行程序之前,我需要file
可執行文件。 之后,它會正確執行。
(gdb) file myexe
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.