精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

開發一個Linux調試器(二):斷點

系統 Linux
在該系列的第一部分,我們寫了一個小的進程啟動器,作為我們調試器的基礎。在這篇博客中,我們會學習在 x86 Linux 上斷點是如何工作的,以及如何給我們工具添加設置斷點的能力。

[[195217]]

在該系列的***部分,我們寫了一個小的進程啟動器,作為我們調試器的基礎。在這篇博客中,我們會學習在 x86 Linux 上斷點是如何工作的,以及如何給我們工具添加設置斷點的能力。

系列文章索引

隨著后面文章的發布,這些鏈接會逐漸生效。

  • 準備環境
  • 斷點
  • 寄存器和內存
  • Elves 和 dwarves
  • 源碼和信號
  • 源碼層逐步執行
  • 源碼層斷點
  • 調用棧
  • 讀取變量 10.之后步驟

斷點是如何形成的?

有兩種類型的斷點:硬件和軟件。硬件斷點通常涉及到設置與體系結構相關的寄存器來為你產生斷點,而軟件斷點則涉及到修改正在執行的代碼。在這篇文章中我們只會關注軟件斷點,因為它們比較簡單,而且可以設置任意多斷點。在 x86 機器上任一時刻你最多只能有 4 個硬件斷點,但是它們能讓你在讀取或者寫入給定地址時觸發,而不是只有當代碼執行到那里的時候。

我前面說軟件斷點是通過修改正在執行的代碼實現的,那么問題就來了:

  • 我們如何修改代碼?
  • 為了設置斷點我們要做什么修改?
  • 如何告知調試器?

***個問題的答案顯然是 ptrace。我們之前已經用它為我們的程序設置跟蹤并繼續程序的執行,但我們也可以用它來讀或者寫內存。

當執行到斷點時,我們的更改要讓處理器暫停并給程序發送信號。在 x86 機器上這是通過 int 3 重寫該地址上的指令實現的。x86 機器有個中斷向量表(interrupt vector table),操作系統能用它來為多種事件注冊處理程序,例如頁故障、保護故障和無效操作碼。它就像是注冊錯誤處理回調函數,但是是在硬件層面的。當處理器執行 int 3 指令時,控制權就被傳遞給斷點中斷處理器,對于 Linux 來說,就是給進程發送 SIGTRAP 信號。你可以在下圖中看到這個進程,我們用 0xcc 覆蓋了 mov 指令的***個字節,它是 init 3 的指令代碼。

 

斷點

謎題的***一個部分是調試器如何被告知中斷的。如果你回顧前面的文章,我們可以用 waitpid 來監聽被發送給被調試的程序的信號。這里我們也可以這樣做:設置斷點、繼續執行程序、調用 waitpid 并等待直到發生 SIGTRAP。然后就可以通過打印已運行到的源碼位置、或改變有圖形用戶界面的調試器中關注的代碼行,將這個斷點傳達給用戶。

實現軟件斷點

我們會實現一個 breakpoint 類來表示某個位置的斷點,我們可以根據需要啟用或者停用該斷點。

  1. class breakpoint { 
  2. public
  3.     breakpoint(pid_t pid, std::intptr_t addr) 
  4.         : m_pid{pid}, m_addr{addr}, m_enabled{false}, m_saved_data{} 
  5.     {} 
  6.     void enable(); 
  7.     void disable(); 
  8.     auto is_enabled() const -> bool { return m_enabled; } 
  9.     auto get_address() const -> std::intptr_t { return m_addr; } 
  10. private: 
  11.     pid_t m_pid; 
  12.     std::intptr_t m_addr; 
  13.     bool m_enabled; 
  14.     uint64_t m_saved_data; //data which used to be at the breakpoint address 
  15. }; 

這里的大部分代碼都是跟蹤狀態;真正神奇的地方是 enable 和 disable 函數。

正如我們上面學到的,我們要用 int 3 指令 - 編碼為 0xcc - 替換當前指定地址的指令。我們還要保存該地址之前的值,以便后面恢復該代碼;我們不想忘了執行用戶(原來)的代碼。

  1. void breakpoint::enable() { 
  2.     m_saved_data = ptrace(PTRACE_PEEKDATA, m_pid, m_addr, nullptr); 
  3.     uint64_t int3 = 0xcc; 
  4.     uint64_t data_with_int3 = ((m_saved_data & ~0xff) | int3); //set bottom byte to 0xcc 
  5.     ptrace(PTRACE_POKEDATA, m_pid, m_addr, data_with_int3); 
  6.     m_enabled = true

PTRACE_PEEKDATA 請求告知 ptrace 如何讀取被跟蹤進程的內存。我們給它一個進程 ID 和一個地址,然后它返回給我們該地址當前的 64 位內容。 (m_saved_data & ~0xff) 把這個數據的低位字節置零,然后我們用它和我們的 int 3 指令按位或(OR)來設置斷點。***我們通過 PTRACE_POKEDATA 用我們的新數據覆蓋那部分內存來設置斷點。

disable 的實現比較簡單,我們只需要恢復用 0xcc 所覆蓋的原始數據。

  1. void breakpoint::disable() { 
  2.     ptrace(PTRACE_POKEDATA, m_pid, m_addr, m_saved_data); 
  3.     m_enabled = false

在調試器中增加斷點

為了支持通過用戶界面設置斷點,我們要在 debugger 類修改三個地方:

  1. 給 debugger 添加斷點存儲數據結構
  2. 添加 set_breakpoint_at_address 函數
  3. 給我們的 handle_command 函數添加 break 命令

我會將我的斷點保存到 std::unordered_map<std::intptr_t, breakpoint> 結構,以便能簡單快速地判斷一個給定的地址是否有斷點,如果有的話,取回該 breakpoint 對象。

  1. class debugger { 
  2.     //... 
  3.     void set_breakpoint_at_address(std::intptr_t addr); 
  4.     //... 
  5. private: 
  6.     //... 
  7.     std::unordered_map<std::intptr_t,breakpoint> m_breakpoints; 

在 set_breakpoint_at_address 函數中我們會新建一個 breakpoint 對象,啟用它,把它添加到數據結構里,并給用戶打印一條信息。如果你喜歡的話,你可以重構所有的輸出信息,從而你可以將調試器作為庫或者命令行工具使用,為了簡便,我把它們都整合到了一起。

  1. void debugger::set_breakpoint_at_address(std::intptr_t addr) { 
  2.     std::cout << "Set breakpoint at address 0x" << std::hex << addr << std::endl; 
  3.     breakpoint bp {m_pid, addr}; 
  4.     bp.enable(); 
  5.     m_breakpoints[addr] = bp; 

現在我們會在我們的命令處理程序中增加對我們新函數的調用。

  1. void debugger::handle_command(const std::string& line) { 
  2.     auto args = split(line,' '); 
  3.     auto command = args[0]; 
  4.     if (is_prefix(command, "cont")) { 
  5.         continue_execution(); 
  6.     } 
  7.     else if(is_prefix(command, "break")) { 
  8.         std::string addr {args[1], 2}; //naively assume that the user has written 0xADDRESS 
  9.         set_breakpoint_at_address(std::stol(addr, 0, 16)); 
  10.     } 
  11.     else { 
  12.         std::cerr << "Unknown command\n"
  13.     } 

我刪除了字符串中的前兩個字符并對結果調用 std::stol,你也可以讓該解析更健壯一些。std::stol 可以將字符串按照所給基數轉化為整數。

從斷點繼續執行

如果你嘗試這樣做,你可能會發現,如果你從斷點處繼續執行,不會發生任何事情。這是因為斷點仍然在內存中,因此一直被重復***。簡單的解決辦法就是停用這個斷點、運行到下一步、再次啟用這個斷點、然后繼續執行。不過我們還需要更改程序計數器,指回到斷點前面,這部分內容會留到下一篇關于操作寄存器的文章中介紹。

測試它

當然,如果你不知道要在哪個地址設置,那么在某些地址設置斷點并非很有用。后面我們會學習如何在函數名或者代碼行設置斷點,但現在我們可以通過手動實現。

測試你調試器的簡單方法是寫一個 hello world 程序,這個程序輸出到 std::err(為了避免緩存),并在調用輸出操作符的地方設置斷點。如果你繼續執行被調試的程序,執行很可能會停止而不會輸出任何東西。然后你可以重啟調試器并在調用之后設置一個斷點,現在你應該看到成功地輸出了消息。

查找地址的一個方法是使用 objdump。如果你打開一個終端并執行 objdump -d <your program>,然后你應該看到你的程序的反匯編代碼。你就可以找到 main 函數并定位到你想設置斷點的 call 指令。例如,我編譯了一個 hello world 程序,反匯編它,然后得到了如下的 main 的反匯編代碼:

  1. 0000000000400936 <main>: 
  2.   400936:   55                      push   %rbp 
  3.   400937:   48 89 e5                mov    %rsp,%rbp 
  4.   40093a:   be 35 0a 40 00          mov    $0x400a35,%esi 
  5.   40093f:   bf 60 10 60 00          mov    $0x601060,%edi 
  6.   400944:   e8 d7 fe ff ff          callq  400820 <_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@plt> 
  7.   400949:   b8 00 00 00 00          mov    $0x0,%eax 
  8.   40094e:   5d                      pop    %rbp 
  9.   40094f:   c3                      retq 

正如你看到的,要沒有輸出,我們要在 0x400944 設置斷點,要看到輸出,要在 0x400949 設置斷點。

總結

現在你應該有了一個可以啟動程序、允許在內存地址上設置斷點的調試器。后面我們會添加讀寫內存和寄存器的功能。再次說明,如果你有任何問題請在評論框中告訴我。

你可以在這里 找到該項目的代碼。

責任編輯:龐桂玉 來源: Linux中國
相關推薦

2017-09-25 08:04:31

Linux調試器源碼級斷點

2017-06-22 10:44:55

Linux調試器準備環境

2017-10-09 10:26:01

Linux調試器堆棧展開

2017-10-09 10:56:49

Linux調試器處理變量

2017-10-12 18:20:44

Linux調試器高級主題

2017-07-25 10:30:32

Linux調試器Elves和dwarv

2017-08-28 14:40:57

Linux調試器源碼和信號

2017-07-05 14:37:07

Linux調試器寄存器和內存

2017-08-28 15:29:19

Linux調試器源碼級逐步執行

2017-04-19 21:35:38

Linux調試器工作原理

2011-08-25 16:34:27

Lua調試器

2010-03-01 11:06:52

Python 調試器

2020-03-16 10:05:13

EmacsGUDLinux

2009-12-14 10:57:34

Ruby調試器

2011-08-31 16:51:12

Lua調試器

2019-12-06 14:30:41

GNU調試器GDB修復代碼

2023-02-28 11:39:55

CMake腳本項目

2024-03-13 08:00:00

Linux調試器應用程序

2011-08-31 16:47:07

Lua調試器

2009-06-23 11:05:05

Mircosoft C
點贊
收藏

51CTO技術棧公眾號

欧美一区二区三区爱爱| 中文字幕中文在线不卡住| 91干在线观看| 中文字幕精品亚洲| 久久99成人| 欧美丝袜一区二区| 一区二区精品免费视频| 性欧美18一19性猛交| 久久亚洲国产精品一区二区| 精品国产一区二区三区在线观看| 国产高潮视频在线观看| 国产精品扒开腿做爽爽爽视频软件| 亚洲视频在线一区二区| 精品一区二区三区国产| 91国偷自产中文字幕久久| 99视频+国产日韩欧美| 日韩在线播放一区| 一本色道综合久久欧美日韩精品| 57pao成人永久免费| 欧美日韩国内自拍| 97碰在线视频| 欧美成人二区| 久久婷婷久久一区二区三区| 99re国产| 91亚洲国产成人久久精品麻豆| 国产亚洲精品自拍| 九九热这里只有在线精品视| 人妻无码一区二区三区免费| 欧美a级网站| 日韩久久精品一区| 亚洲一区二区在线视频观看| 成人影院入口| 欧美日韩午夜视频在线观看| 男人添女荫道口女人有什么感觉| 麻豆tv入口在线看| 欧美国产成人精品| 日本一区二区三区视频在线观看| 高清一区二区三区四区| 国产一区二区福利视频| 国产精品老女人精品视频| 国产精品午夜影院| 好看的亚洲午夜视频在线| 久久九九有精品国产23| 天天干天天操天天拍| 一区不卡字幕| 精人妻无码一区二区三区| 99精品热6080yy久久| 欧美理论片在线观看| 人与动物性xxxx| 首页国产精品| 日韩中文字幕视频| 国产成人在线网址| 欧美电影《轻佻寡妇》| 综合国产在线视频| 国产欧美一区二区三区在线观看视频| 美日韩中文字幕| 亚洲欧美www| 国产精品无码久久久久一区二区| 日韩高清三区| 亚洲欧美日韩区| 成人无码av片在线观看| 日韩精品首页| xxxxxxxxx欧美| 亚洲怡红院在线观看| 亚洲精品一二三区区别| 欧美精品在线免费| 黄色小视频在线免费看| 国产精品久久久久久久免费软件 | 日韩三级电影视频| 亚洲午夜视频在线观看| 免费 成 人 黄 色| 裤袜国产欧美精品一区| 欧美午夜理伦三级在线观看| 中文字幕成人在线视频| 日本在线一区二区三区| 欧美精品一区二区三| 91网站免费视频| 日韩午夜电影网| 欧美精品一区二区免费| 日韩少妇裸体做爰视频| 噜噜噜久久亚洲精品国产品小说| 国产精品久久色| 国产三级视频在线播放| av在线不卡观看免费观看| 欧美男人的天堂| 色影院视频在线| 亚洲乱码国产乱码精品精可以看| 午夜免费福利小电影| 欧美日韩尤物久久| 精品免费视频一区二区| xxxx日本黄色| 婷婷综合社区| 91精品国产91久久久久久吃药| 男操女视频网站| 国产99精品国产| 日本在线播放不卡| 羞羞电影在线观看www| 欧美视频二区36p| 欧美大片久久久| 免费观看成人www动漫视频| 一本色道久久综合亚洲精品小说| 这里只有精品久久| 国产午夜福利100集发布| 卡通欧美亚洲| 这里只有精品电影| 久久亚洲AV成人无码国产野外 | 色欲一区二区三区精品a片| 伊人久久大香线蕉av超碰演员| 国产成人亚洲综合| 国产调教打屁股xxxx网站| 免费a级毛片在线播放| 一区2区3区在线看| 手机看片福利盒子久久| 色婷婷在线视频观看| 亚洲精品社区| 国产在线拍揄自揄视频不卡99 | 粉嫩av一区二区三区在线播放| 国产免费一区二区| 日本黄色片在线观看| 精品久久久中文| 性久久久久久久久久久久久久| 最新国产精品视频| 久久久久久亚洲精品不卡| 大桥未久在线视频| 99精品视频一区| 成年人免费观看的视频| 中国字幕a在线看韩国电影| 欧美一级片免费看| 日本精品中文字幕| 亚洲AV无码精品色毛片浪潮| 国产精品网曝门| 国产无套内射久久久国产| av综合网址| 日本一二三区视频| 亚洲破处大片| 国产精品久久久久久久久久新婚 | 制服丝袜亚洲色图| 欧美激情 一区| 美女久久一区| 日韩成人在线视频观看| 在线观看av中文字幕| 你懂的网址国产 欧美| 成人国内精品久久久久一区| 中文字幕网av| 精品国产中文字幕第一页| 欧美在线视频观看| 青春有你2免费观看完整版在线播放高清| 亚洲二区视频在线| 97精品久久人人爽人人爽| 国内综合精品午夜久久资源| 国产日韩欧美在线观看| 国产精品秘入口| 色婷婷综合久久久中文字幕| 久久久精品动漫| 不卡视频在线播放| 亚洲欧洲99久久| 手机在线国产视频| 国产精品影视天天线| 91久久精品国产91久久性色| 国产98在线| 欧美亚洲高清一区二区三区不卡| 制服 丝袜 综合 日韩 欧美| 奇米综合一区二区三区精品视频| 天堂资源在线亚洲资源| 亚洲一区导航| 欧美人在线观看| 久久6免费视频| 色偷偷综合网| 国产在线久久久| av在线麻豆| 亚洲精品一线二线三线无人区| 日本中文字幕免费| 9色porny自拍视频一区二区| 18禁男女爽爽爽午夜网站免费| 国产乱色精品成人免费视频 | 成人xxxx视频| 人人超在线公开视频| 亚洲激情在线观看| 无码人妻熟妇av又粗又大| 国产欧美精品在线观看| 国产农村妇女精品久久| 日韩亚洲国产欧美| 午夜精品一区二区在线观看 | 麻豆精品精品国产自在97香蕉| 久久视频免费在线| 天天躁日日躁成人字幕aⅴ| 国产精品久久久久久久久久久久 | 国产成人综合亚洲| 哥也色在线视频| 亚洲免费视频观看| 国产情侣一区二区| 日韩欧美在线播放| 亚洲色婷婷一区二区三区| 26uuu精品一区二区三区四区在线| 中文字幕第36页| 亚洲一本视频| 一区二区视频在线播放| 精品欧美午夜寂寞影院| 国产精品视频在线观看| а_天堂中文在线| 在线国产精品视频| 日本精品一二区| 在线不卡一区二区| 9i精品福利一区二区三区| 一区二区三区在线看| 欧洲美一区二区三区亚洲| 成人免费毛片a| 女同激情久久av久久| 免费久久99精品国产自在现线| 综合一区中文字幕| 国产一区二区欧美| 国产精品久久一区二区三区| 精品国产黄a∨片高清在线| 97av在线影院| 91精品国产91久久久久久青草| 在线国产精品播放| 久久久久国产精品嫩草影院| 欧美mv日韩mv国产网站app| 在线视频免费观看一区| 狠狠色狠色综合曰曰| 欧美毛片在线观看| 1024成人网| 国精产品一区一区| 国产亚洲欧美激情| 国产精品无码网站| 成人精品高清在线| 国产又粗又猛大又黄又爽| 蜜臀av国产精品久久久久| 99免费视频观看| 性娇小13――14欧美| 国产美女网站在线观看| 欧美日韩专区| 在线观看三级网站| 欧美在线首页| 日韩最新中文字幕| 91精品国产视频| 一区二区三区不卡在线| 日韩电影在线视频| 五月天亚洲综合| 欧美伦理在线视频| 欧美在线视频二区| 国产成人av| 青青草国产精品| 精品国产精品国产偷麻豆| 欧美亚洲国产免费| 国产亚洲欧美日韩在线观看一区二区| 免费试看一区| 一本色道久久综合狠狠躁的番外| 久久久99爱| 在线日本制服中文欧美| 欧美日韩综合网| 精品99在线| 一区精品在线| 亚洲欧美色图| 免费看欧美黑人毛片| 亚洲精品激情| 爱福利视频一区二区| 日韩精品福利网| 欧美午夜aaaaaa免费视频| 毛片av中文字幕一区二区| 日韩欧美亚洲另类| 处破女av一区二区| 亚洲国产精品自拍视频| 久久久久久电影| 又嫩又硬又黄又爽的视频| 国产精品超碰97尤物18| 久久久久久av无码免费网站| 欧美丝袜第一区| 一级黄色片在线播放| 欧美一区二区三区免费大片 | 国产性色一区二区| 貂蝉被到爽流白浆在线观看| 亚洲免费电影在线| 国产亚洲精品久久久久久打不开| 午夜精品久久久久久| 成人免费毛片视频| 在线综合亚洲欧美在线视频 | 伊人伊成久久人综合网小说| 国产日产一区二区| 97人人做人人爱| 国产精品蜜月aⅴ在线| av噜噜色噜噜久久| 亚洲精品国产动漫| 青青草免费在线视频观看| 久久成人精品| 爽爽爽在线观看| 91丨九色丨蝌蚪富婆spa| 日本爱爱小视频| 狠狠躁夜夜躁人人爽超碰91| 一级片视频网站| 日韩国产在线看| 黄色网在线免费观看| 91大神在线播放精品| 只有精品亚洲| 欧美精品人人做人人爱视频| 在线一区免费| 亚洲三级视频网站| 成人黄色av网站在线| 久久免费手机视频| 欧美日韩精品中文字幕| 97人人爽人人爽人人爽| 国产丝袜一区视频在线观看| 国产二区三区在线| 国产精品毛片a∨一区二区三区|国| 2021年精品国产福利在线| 先锋影音亚洲资源| 国产日本精品| 色综合久久久无码中文字幕波多| 久久久国产精品午夜一区ai换脸| 免费网站看av| 欧美日韩视频在线一区二区| 日本韩国一区| 久久人人爽人人爽人人片av高请 | 亚洲一区精品视频| 国产偷自视频区视频一区二区| 久久黄色一级视频| 中文字幕+乱码+中文字幕一区| 国产又大又黄又粗| 精品国内二区三区| 超鹏97在线| 国产日韩欧美影视| 日韩精品免费一区二区三区| 国产精品少妇在线视频| www.日韩在线| 豆国产97在线 | 亚洲| 这里只有精品视频在线观看| 日本综合在线| 国产精品日韩在线| 精品九九在线| 麻豆av免费在线| 久久综合九色综合欧美98| 精品91久久久| 亚洲精美色品网站| а_天堂中文在线| 国产精品一区二区免费看| 韩日精品在线| www日本在线观看| 亚洲一区二区3| 亚洲国产精品suv| 欧美激情第6页| 懂色av中文字幕| 麻豆传媒一区二区三区| 中文字幕av不卡在线| 亚洲国产精品ⅴa在线观看| 波多野结衣 久久| 亚洲一级一级97网| 国产成人精品一区二区三区免费| 亚洲国产一区在线| 精品综合免费视频观看| 欧美黑人性猛交xxx| 欧美大片一区二区| 国产无遮挡裸体视频在线观看| 国产成人看片| 99国产精品私拍| japanese中文字幕| 欧美日韩一区二区电影| 毛片免费不卡| 99在线视频播放| 在线综合欧美| 亚洲精品午夜视频| 欧美日韩激情一区二区三区| 黄色网址视频在线观看| 成人激情直播| 国产亚洲一级| 天堂网av2018| 日韩美女一区二区三区四区| 高清毛片在线观看| 午夜精品美女久久久久av福利| 久久成人综合网| 精品午夜福利视频| 亚洲欧洲激情在线| 欧美一区二区三区婷婷| 国产片侵犯亲女视频播放| 91性感美女视频| 在线观看免费黄色小视频| 色综合久久天天综线观看| 婷婷精品在线| 日本黄大片一区二区三区| 一区二区三区成人在线视频| 四虎精品成人影院观看地址| 国产精品视频久| 狠久久av成人天堂| 一区二区精品免费| 日韩欧美国产电影| 欧美日韩免费看片| 手机成人av在线| 9人人澡人人爽人人精品| 一区二区三区日| 日韩av电影手机在线| 亚洲五月综合| 中文幕无线码中文字蜜桃| 91精品国产aⅴ一区二区| 亚洲承认视频| 国产女主播自拍| 国产精品激情偷乱一区二区∴| 四虎在线视频免费观看| 国产在线观看精品| 老色鬼久久亚洲一区二区| 欧美色图一区二区| 国产一区二区三区18|