linux偵錯程式有關暫存器操作的實現

2022-04-13 03:27:32 字數 2586 閱讀 7428

在這裡,依舊是我們的利器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...