我在Linux 2.6.35上遇到了與ARM v7上的BKPT指令相關的問題。主要原因是故障指令地址(bkpt)不正確,並且不符合ARM v7手冊。ARM v7 BKPT指令在Linux 2.6.35上無法正常工作
這裏是再現步驟:
重新定義OS SIGBUS處理程序,以我的SIGBUS處理程序:
void InitSigBusHandler() { struct sigaction sa; memset(&sa, 0, sizeof(sa)); sa.sa_flags = SA_SIGINFO; sigfillset(&sa.sa_mask); sa.sa_sigaction = SigBusHandler; sigaction(SIGBUS, &sa, NULL); }
使用內聯_asm,把 「BKPT」 指令到代碼主要()功能:
int main(int argc, char **argv) { InitSigBusHandler(); __asm ( "bkpt\n\t" ); return 0; }
這裏是我的SIGBUS處理程序:
void SigBusHandler( int signum, siginfo_t *pAct, void *pOldAct ) { write(2, (const char *)MSG_SIGBUS_IN_HANDLER, strlen((const char *)MSG_SIGBUS_IN_HANDLER) ); uint32_t faultAddr = (uint32_t)pAct->si_addr; memcpy((void *)buffer, (void *)MSG_SIGBUS_FAULT_ADDR, strlen(MSG_SIGBUS_FAULT_ADDR) ); write(2, (const char *)MSG_SIGBUS_FAULT_ADDR, strlen((const char *)MSG_SIGBUS_FAULT_ADDR) ); sprintf(buffer, "%x\n", faultAddr); write(2, buffer, strlen(buffer)); }
的問題是指令(BKPT)的故障ADRESS是錯誤的,不符合ARM V7規範。下面是該程序後,執行控制檯輸出工作:
在SIGBUS處理程序:
故障地址:86b0
在SIGBUS處理程序:
故障地址:86c0
在SIGBUS處理程序:
故障地址:86c0
在SIGBUS處理程序:
故障地址:86c0
在SIGBUS處理程序:
故障地址:86c0
在SIGBUS處理程序:
故障地址:86b0
在SIGBUS處理程序:
故障地址:86a8
在SIGBUS處理程序:
故障地址:86f0
在x86架構這個樣本正常工作。在ARM v7架構上,此示例有一個奇怪的行爲。
如果我在ARM v7上使用GDB,他會捕獲我的BKPT指令和正確的地址。
也許有人知道我做錯了什麼?
謝謝!這是有幫助的。 –