簡體   English   中英

MOV指令上的ARM SIGSEGV

[英]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.

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