关于MOV指令的ARM SIGSEGV

时间:2013-12-03 16:14:34

标签: android gdb arm remote-debugging

当在Android模拟器上进行远程调试时,在mov指令上有一个SIGSEGV。

我不明白mov是如何导致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之前和之后只有一个线程。

2 个答案:

答案 0 :(得分:1)

  

我不明白mov如何导致SIGSEGV。

没有。

您正在运行cpsr设置为0x10,这是用户模式ARM状态,启用中断 FIQ 。是您的调试器任务还是系统?您还没有提供足够的有关系统的信息。位于0x140b2和0x14dcf的位置(即,什么例程/代码)?堆栈已经大量更改,因此您没有运行一个循环。

系统调试

中断/ FIQ可能会改变控制流程。另一种可能是页面错误。

任务感知

如果知道任务,信号可以改变对stepi的控制。你有一个多线程的应用程序?使用info threads可能会有帮助。

有时调试器会在下一条指令处写一个临时断点并运行;这并不意味着他们只执行一条指令。信号,中断,页面错误都可能在命中临时断点之前改变执行。 stepi并不意味着PC所处的指令导致异常。

答案 1 :(得分:1)

我发现问题是由远程gdb引起的。在开始运行程序之前,我需要file可执行文件。之后它会正确执行。

(gdb) file myexe