2011-09-30 46 views
3

我的應用程序中的一些線程位於優化函數中,當我調試應用程序時,gdb無法從這些函數中回溯。但我已經看過了彙編,並通過做這樣的事情可以部分地放鬆手了以前的函數的幀堆棧:Linux(MIPS):查看核心轉儲時暫時「更改」註冊內容

set $old_ra = $ra 
set $old_sp = $sp 
set $ra = *(unsigned long*)($sp+28) 
set $sp = $sp + 48 
bt 
set $ra = $old_ra 
set $sp = $old_sp 

這工作完全如果我做現場調試,併成功顯示了完成回溯。我希望在查看核心轉儲時能夠執行相同的離線操作。顯然,在一個核心轉儲中,戳一個寄存器的概念是沒有意義的,但是有沒有辦法告訴gdb「只用這個值作爲寄存器」,這樣我可以做一個類似的回溯?

回答

2

不開箱即用。我發現的唯一方法是物理修改核心文件。 ELF核心文件通常會有一個或多個包含進程'寄存器'的'reg'部分。所有你需要的是找出你想要更改的寄存器中的哪個部分,然後編輯該文件,將新值放到那裏並重新運行GDB。