在這裡,依舊是我們的利器ptrace
#ifndef debugger_reg_h
#define debugger_reg_h
#include
#include
#include
#include
enum class reg
;static constexpr std::size_t n_registers=27;
struct reg_descriptor
;//這裡要看自己的平台下的reg.h或者user.h,我的是:
/usr/include/x86_64-linux-gnu/sys/reg.h,一定要對應起來,貼乙個我的環境:ubuntu16.04下reg.h:
define r15 0
define r14 1
define r13 2
define r12 3
define rbp 4
define rbx 5
define r11 6
define r10 7
define r9 8
define r8 9
define rax 10
define rcx 11
define rdx 12
define rsi 13
define rdi 14
define orig_rax 15
define rip 16
define cs 17
define eflags 18
define rsp 19
define ss 20
define fs_base 21
define gs_base 22
define ds 23
define es 24
define fs 25
define gs 26//為了方便獲取暫存器的值,名字等後邊的使用
const
std::arrayg_register_descriptors
, ,,,
,,,,
,,,,
,,,,
,,,,
,,,,
,,
,}};uint64_t get_register_value(pid_t pid,reg r);
void set_register_value(pid_t,reg r,uint64_t value);
uint64_t get_register_value_from_dwarf_register(pid_t pid, unsigned regnum);
std::string get_register_name(reg r);
reg get_register_from_name(const std::string& name);
#endif //debugger_reg_我們先來看看get_register_value(pid_t pid,reg r)的實現
uint64_t get_register_value(pid_t pid,reg r)
); /**
* 用存放了子程序reg結構體內容的regs獲取我們制定的暫存器的值,下面這樣**首先將regs的位址強轉成
* 乙個指向uint64_t的指標,這個指標加1,就相當於偏移了sizeof(uint64_t),這裡偏移了it-begin(g_register_descriptors),
* 也就是我們需要檢視的暫存器
*/return *(reinterpret_cast(®s)+(it-begin(g_register_descriptors)));好像這個函式沒啥說的,直接看注釋就好。
void set_register_value(pid_t pid,reg r,uint64_t value)
); *(reinterpret_cast(®s)+(it-begin(g_register_descriptors)))=value;//給結構體中相應的暫存器賦值
ptrace(ptrace_setregs,pid, nullptr,®s);//將修改後的regs結構體整個賦值給子程序當前的暫存器,這裡我們只修改了我們傳進去的暫存器的值
}上邊兩個函式理解了,下邊這三個就不用詳細解釋了,直接看**:
uint64_t get_register_value_from_dwarf_register(pid_t pid, unsigned regnum)
); if(it==end(g_register_descriptors));}
ptrace(ptrace_getregs,pid, nullptr,®s);
return *(reinterpret_cast(®s)+(it-begin(g_register_descriptors)));
}std::string get_register_name(reg r)
); return it->name;
}reg get_register_from_name(const std::string&name)
); return it->r;
}到這裡我們的有關暫存器操作的函式就實現了,下一篇我們將介紹斷點的實現。
除錯暫存器和測試暫存器
1 除錯暫存器 80386為除錯提供了硬體支撐。在80386晶元內有8個32位的除錯暫存器dr0 dr7,如圖2.6所示。這些暫存器可以使系統程式設計人員定義4個斷點,用它們可以規定指令執行和資料讀寫的任何組合。dr0 dr3是線性斷點位址暫存器,其中儲存著4個斷點位址。dr5 dr6是兩個備用的除...
暫存器對映與直接操作暫存器
一 儲存器對映 與重對映 儲存器本身不具有位址資訊,它的位址是由晶元廠商或使用者分配,給 物理儲存器分配 邏輯位址的過程就稱為儲存器對映 通過這些邏輯位址就可以訪問到相應的儲存器的物理儲存單元。如果給儲存器再分配乙個位址就叫儲存器重對映。如stm32,對於 片上外設,它們以四個位元組為乙個單元,共3...
暫存器(通用暫存器)
因為學習使用的是王爽的 組合語言 第3版 因此也只能提到8086cpo的暫存器。對於其他而言,原理都是相通的。對於8086暫存器,有14個暫存器,主要是 ax bx cx dx si di sp bp ip cs ss ds es psw。一 通用暫存器 8086的通用暫存器有ax bx cx dx...