当在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之前和之后只有一个线程。
答案 0 :(得分:1)
我不明白
mov
如何导致SIGSEGV。
没有。
您正在运行cpsr
设置为0x10,这是用户模式ARM状态,启用中断和 FIQ 。是您的调试器任务还是系统?您还没有提供足够的有关系统的信息。位于0x140b2和0x14dcf的位置(即,什么例程/代码)?堆栈已经大量更改,因此您没有运行一个循环。
中断/ FIQ可能会改变控制流程。另一种可能是页面错误。
如果知道任务,信号可以改变对stepi
的控制。你有一个多线程的应用程序?使用info threads
可能会有帮助。
有时调试器会在下一条指令处写一个临时断点并运行;这并不意味着他们只执行一条指令。信号,中断,页面错误都可能在命中临时断点之前改变执行。 stepi
并不意味着PC所处的指令导致异常。
答案 1 :(得分:1)
我发现问题是由远程gdb引起的。在开始运行程序之前,我需要file
可执行文件。之后它会正确执行。
(gdb) file myexe