如何在ARM架构的GDB中跳过BKPT指令?
解决GDB中跳过BKPT指令的方法
当你用__asm__ __volatile__ ("bkpt #0");触发SIGTRAP导致GDB反复暂停时,continue和skip不管用是因为每次执行到该指令都会重新触发陷阱,试试下面几个实用方法:
临时手动跳过(单次生效)
当GDB停在BKPT指令时,先确认当前架构下BKPT指令的长度(比如ARM32的BKPT是2字节,ARM64是4字节),然后直接修改程序计数器(PC)跳过该指令:set $pc = $pc + 2 # ARM32用这个,ARM64换成+4 continue执行后程序就会跳过BKPT继续运行。
自动跳过该位置的所有BKPT(永久生效直到重启GDB)
先找到BKPT指令的内存地址(可以用info line或者反汇编查看对应地址),然后给这个地址设置断点并绑定自动执行的命令:break *0xXXXXXX # 替换成你的BKPT指令实际地址 commands set $pc += 2 # 根据架构调整偏移量 continue end之后每次运行到该BKPT时,GDB会自动修改PC并继续执行,不会再暂停。
全局忽略SIGTRAP信号(慎用)
如果你的调试场景不需要依赖SIGTRAP的其他断点(比如普通软件断点),可以直接让GDB忽略SIGTRAP的暂停:handle SIGTRAP nostop这个方法会让所有SIGTRAP触发时都不暂停,适合不需要其他调试断点的场景。
内容的提问来源于stack exchange,提问作者EdikGres
相关产品推荐
相关产品推荐

