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

開發一個Linux調試器(一):準備環境

系統 Linux
在本項目中我會將重點放在 C 和 C++,但對于那些將源碼編譯為機器碼并輸出標準 DWARE 調試信息的語言也應該能起作用(如果你還不知道這些東西是什么,別擔心,馬上就會介紹到啦)。另外,我只關注如何將程序運行起來并在大部分情況下能正常工作,為了簡便,會避開類似健壯錯誤處理方面的東西。

[[194747]]

任何寫過比 hello world 復雜一些的程序的人都應該使用過調試器(如果你還沒有,那就停下手頭的工作先學習一下吧)。但是,盡管這些工具已經得到了廣泛的使用,卻并沒有太多的資源告訴你它們的工作原理以及如何開發,尤其是和其它那些比如編譯器等工具鏈技術相比而言。

此處有一些其它的資源可以參考:

  • http://eli.thegreenplace.net/2011/01/23/how-debuggers-work-part-1
  • https://t-a-w.blogspot.co.uk/2007/03/how-to-code-debuggers.html
  • https://www.codeproject.com/Articles/43682/Writing-a-basic-Windows-debugger
  • http://system.joekain.com/debugger/

我們將會支持以下功能:

  • 啟動、暫停、繼續執行
  • 在不同地方設置斷點
    • 內存地址
    • 源代碼行
    • 函數入口
  • 讀寫寄存器和內存
  • 單步執行
    • 指令
    • 進入函數
    • 跳出函數
    • 跳過函數
  • 打印當前代碼地址
  • 打印函數調用棧
  • 打印簡單變量的值

在***一部分,我還會大概介紹如何給你的調試器添加下面的功能:

  • 遠程調試
  • 共享庫和動態庫支持
  • 表達式計算
  • 多線程調試支持

在本項目中我會將重點放在 C 和 C++,但對于那些將源碼編譯為機器碼并輸出標準 DWARE 調試信息的語言也應該能起作用(如果你還不知道這些東西是什么,別擔心,馬上就會介紹到啦)。另外,我只關注如何將程序運行起來并在大部分情況下能正常工作,為了簡便,會避開類似健壯錯誤處理方面的東西。

系列文章索引

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

  1. 準備環境
  2. 斷點
  3. 寄存器和內存
  4. Elves 和 dwarves
  5. 源碼和信號
  6. 源碼層逐步執行
  7. 源碼層斷點
  8. 調用棧
  9. 讀取變量
  10. 之后步驟

LCTT 譯注:ELF —— 可執行文件格式(Executable and Linkable Format);DWARF(一種廣泛使用的調試數據格式,參考 WIKI)。

準備環境

在我們正式開始之前,我們首先要設置環境。在這篇文章中我會依賴兩個工具:Linenoise 用于處理命令行輸入,libelfin 用于解析調試信息。你也可以使用更傳統的 libdwarf 而不是 libelfin,但是界面沒有那么友好,另外 libelfin 還提供了基本完整的 DWARF 表達式求值器,當你想讀取變量的值時這能幫你節省很多時間。確認你使用的是 libelfin 我的 fbreg 分支,因為它提供 x86 上讀取變量的額外支持。

一旦你在系統上安裝或者使用你喜歡的編譯系統編譯好了這些依賴工具,就可以開始啦。我在 CMake 文件中把它們設置為和我其余的代碼一起編譯。

啟動可執行程序

在真正調試任何程序之前,我們需要啟動被調試的程序。我們會使用經典的 fork/exec 模式。

  1. int main(int argc, char* argv[]) { 
  2.     if (argc < 2) { 
  3.         std::cerr << "Program name not specified"
  4.         return -1; 
  5.     } 
  6.     auto prog = argv[1]; 
  7.     auto pid = fork(); 
  8.     if (pid == 0) { 
  9.         //we're in the child process 
  10.         //execute debugee 
  11.     } 
  12.     else if (pid >= 1)  { 
  13.         //we're in the parent process 
  14.         //execute debugger 
  15.     } 

我們調用 fork 把我們的程序分成兩個進程。如果我們是在子進程,fork 返回 0,如果我們是在父進程,它會返回子進程的進程 ID。

如果我們是在子進程,我們要用希望調試的程序替換正在執行的程序。

  1. ptrace(PTRACE_TRACEME, 0, nullptr, nullptr); 
  2. execl(prog.c_str(), prog.c_str(), nullptr); 

這里我們***次遇到了 ptrace,它會在我們編寫調試器的時候經常遇到。ptrace 通過讀取寄存器、內存、逐步調試等讓我們觀察和控制另一個進程的執行。其 API 非常簡單;你需要給這個簡單函數提供一個枚舉值指定你想要進行的操作,然后是一些取決于你所提供的值可能會被使用也可能會被忽略的參數。函數原型看起來類似:

  1. long ptrace(enum __ptrace_request request, pid_t pid, void *addr, void *data); 

request 是我們想對被跟蹤進程進行的操作;pid 是被跟蹤進程的進程 ID;addr 是一個內存地址,用于在一些調用中指定被跟蹤程序的地址;data 是 request 相應的資源。返回值通常是一些錯誤信息,因此在你實際的代碼中你也許應該檢查返回值;為了簡潔我這里就省略了。你可以查看 man 手冊獲取更多(關于 ptrace)的信息。

上面代碼中我們發送的請求 PTRACE_TRACEME 表示這個進程應該允許父進程跟蹤它。所有其它參數都會被忽略,因為 API 設計并不是很重要,哈哈。

下一步,我們會調用 execl,這是很多諸多的 exec 函數格式之一。我們執行指定的程序,通過命令行參數傳遞它的名稱,然后用一個 nullptr 終止列表。如果你愿意,你還可以傳遞其它執行你的程序所需的參數。

在完成這些后,我們就會和子進程一起結束;在我們結束它之前它會一直執行。

添加調試循環

現在我們已經啟動了子進程,我們想要能夠和它進行交互。為此,我們會創建一個 debugger 類,循環監聽用戶輸入,然后在我們父進程的 main 函數中啟動它。

  1. else if (pid >= 1)  { 
  2.     //parent 
  3.     debugger dbg{prog, pid}; 
  4.     dbg.run(); 
  5.  
  1. class debugger { 
  2. public
  3.     debugger (std::string prog_name, pid_t pid) 
  4.         : m_prog_name{std::move(prog_name)}, m_pid{pid} {} 
  5.     void run(); 
  6. private: 
  7.     std::string m_prog_name; 
  8.     pid_t m_pid; 
  9. }; 

在 run 函數中,我們需要等待,直到子進程完成啟動,然后一直從 linenoise 獲取輸入直到收到 EOF(CTRL+D)。

  1. void debugger::run() { 
  2.     int wait_status; 
  3.     auto options = 0; 
  4.     waitpid(m_pid, &wait_status, options); 
  5.     char* line = nullptr; 
  6.     while((line = linenoise("minidbg> ")) != nullptr) { 
  7.         handle_command(line); 
  8.         linenoiseHistoryAdd(line); 
  9.         linenoiseFree(line); 
  10.     } 

當被跟蹤的進程啟動時,會發送一個 SIGTRAP 信號給它,這是一個跟蹤或者斷點中斷。我們可以使用 waitpid 函數等待這個信號發送。

當我們知道進程可以被調試之后,我們監聽用戶輸入。linenoise 函數它自己會用一個窗口顯示和處理用戶輸入。這意味著我們不需要做太多的工作就會有一個支持歷史記錄和導航命令的命令行。當我們獲取到輸入時,我們把命令發給我們寫的小程序 handle_command,然后我們把這個命令添加到 linenoise 歷史并釋放資源。

處理輸入

我們的命令類似 gdb 以及 lldb 的格式。要繼續執行程序,用戶需要輸入 continue 或 cont 甚至只需 c。如果他們想在一個地址中設置斷點,他們會輸入 break 0xDEADBEEF,其中 0xDEADBEEF 就是所需地址的 16 進制格式。讓我們來增加對這些命令的支持吧。

  1. void debugger::handle_command(const std::string& line) { 
  2.     auto args = split(line,' '); 
  3.     auto command = args[0]; 
  4.     if (is_prefix(command, "continue")) { 
  5.         continue_execution(); 
  6.     } 
  7.     else { 
  8.         std::cerr << "Unknown command\n"
  9.     } 

split 和 is_prefix 是一對有用的小程序:

  1. std::vector<std::string> split(const std::string &s, char delimiter) { 
  2.     std::vector<std::string> out{}; 
  3.     std::stringstream ss {s}; 
  4.     std::string item; 
  5.     while (std::getline(ss,item,delimiter)) { 
  6.         out.push_back(item); 
  7.     } 
  8.     return out
  9. bool is_prefix(const std::string& s, const std::string& of) { 
  10.     if (s.size() > of.size()) return false
  11.     return std::equal(s.begin(), s.end(), of.begin()); 

我們會把 continue_execution 函數添加到 debuger 類。

  1. void debugger::continue_execution() { 
  2.     ptrace(PTRACE_CONT, m_pid, nullptr, nullptr); 
  3.     int wait_status; 
  4.     auto options = 0; 
  5.     waitpid(m_pid, &wait_status, options); 

現在我們的 continue_execution 函數會用 ptrace 告訴進程繼續執行,然后用 waitpid 等待直到收到信號。

總結

現在你應該編譯一些 C 或者 C++ 程序,然后用你的調試器運行它們,看它是否能在函數入口暫停、從調試器中繼續執行。在下一篇文章中,我們會學習如何讓我們的調試器設置斷點。如果你遇到了任何問題,在下面的評論框中告訴我吧!

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

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

2017-06-28 14:21:22

Linux調試器斷點

2017-10-09 10:26:01

Linux調試器堆棧展開

2017-10-09 10:56:49

Linux調試器處理變量

2017-10-12 18:20:44

Linux調試器高級主題

2017-09-25 08:04:31

Linux調試器源碼級斷點

2017-08-28 14:40:57

Linux調試器源碼和信號

2017-07-25 10:30:32

Linux調試器Elves和dwarv

2017-08-28 15:29:19

Linux調試器源碼級逐步執行

2017-07-05 14:37:07

Linux調試器寄存器和內存

2017-04-19 21:35:38

Linux調試器工作原理

2020-10-10 06:32:43

IDEA插件環境

2020-03-16 09:31:10

Linux系統CentOS

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調試器

2016-08-04 14:08:57

前端javascripthtml

2011-08-31 16:51:12

Lua調試器

2019-12-06 14:30:41

GNU調試器GDB修復代碼

2023-02-28 11:39:55

CMake腳本項目
點贊
收藏

51CTO技術棧公眾號

午夜精品视频在线观看一区二区| 日韩最新在线视频| 无码人妻精品一区二区三区在线| 午夜国产在线视频| 日本成人超碰在线观看| 久久精品在线视频| 国产成人av免费观看| 羞羞视频在线观看免费| 97久久精品人人做人人爽50路| 国产精品看片资源| 五月天综合在线| 日韩在线观看一区| 精品网站999www| 亚洲天堂伊人网| 欧美性xxx| 亚洲一区二区三区精品在线| 日韩精品久久久免费观看| www.com在线观看| 日韩高清不卡一区| 97视频在线观看播放| 中文字幕乱码av| 亚洲香蕉视频| 亚洲成人黄色网址| 91 视频免费观看| 亚洲第一影院| 午夜精品爽啪视频| 亚洲爆乳无码精品aaa片蜜桃| 国产福利在线看| 成人网在线播放| 91亚洲精品久久久久久久久久久久| 中文字幕在线观看视频网站| 伊人久久大香线| 在线视频欧美日韩精品| 538国产视频| 91大神精品| 欧美一区二区三区婷婷月色| 中文字幕国产传媒| 最新日韩三级| 色婷婷久久久亚洲一区二区三区 | 一本久久综合亚洲鲁鲁五月天| 欧美性受xxxx黑人猛交88| 国产精品免费观看| 久久蜜桃av一区二区天堂| 国产美女99p| 国产成人精品一区二三区四区五区| 日本欧美加勒比视频| 国产成人久久久| 在线观看亚洲天堂| 亚洲一区观看| 91av在线免费观看视频| 国产成人无码精品| 99在线观看免费视频精品观看| 欧美国产亚洲精品久久久8v| 国产这里有精品| 欧美日本一区二区视频在线观看| 久久综合久中文字幕青草| 午夜激情视频在线播放| 999久久久精品国产| 最新日韩中文字幕| 污污的视频在线免费观看| 日韩www.| 久久亚洲精品小早川怜子66| 粉嫩av性色av蜜臀av网站| 911久久香蕉国产线看观看| 精品国产欧美一区二区三区成人| 成人欧美一区二区三区黑人一| 日本午夜一区| 久久综合电影一区| 国产精品第108页| 亚洲欧美日韩一区在线观看| 国产999精品视频| 中文字幕av网站| 国产在线日韩欧美| 99热在线国产| 熟妇人妻系列aⅴ无码专区友真希| 99国产精品国产精品毛片| 欧美二区三区在线| 97电影在线| 亚洲精品国产一区二区精华液| 人妻激情另类乱人伦人妻| 9999在线视频| 欧美午夜精品久久久久久超碰| 国产一级片自拍| 日韩免费高清视频网站| 日韩黄色高清视频| 91社区视频在线观看| 你懂的国产精品| 97在线观看视频国产| 在线免费一区二区| 国产精品一区二区91| 久久青青草原| 精品黄色免费中文电影在线播放| 亚洲午夜免费福利视频| 亚洲国产精品毛片av不卡在线| 日本免费一区二区三区等视频| 欧美成人一区二区三区| 蜜桃av免费看| 欧美一区久久| 国产成人免费av| 国产高清不卡视频| 国产亚洲精久久久久久| 中文字幕色呦呦| 625成人欧美午夜电影| 91精品蜜臀在线一区尤物| 疯狂揉花蒂控制高潮h| 亚洲v在线看| 琪琪第一精品导航| 国产chinasex对白videos麻豆| 91捆绑美女网站| 免费在线精品视频| 日日av拍夜夜添久久免费| 日韩精品一区二| 欧美aaa级片| 香蕉精品999视频一区二区| 亚洲a成v人在线观看| 国产在线91| 亚洲va中文字幕| 日韩av福利在线观看| 精品久久不卡| 2019中文字幕在线| 欧美一级淫片aaaaaa| 欧美国产1区2区| 3d动漫一区二区三区| 免费观看性欧美大片无片| 国产一区二区三区视频| 黄色片视频网站| 国产剧情av麻豆香蕉精品| 亚洲精品高清国产一线久久| 亚洲天堂av影院| 精品国产91九色蝌蚪| 国产一区二区播放| 久久99深爱久久99精品| 日韩精品资源| 日本综合字幕| 亚洲精品一二区| 国产成人在线观看网站| 不卡电影一区二区三区| 久艹在线免费观看| 日韩精品成人在线观看| 成年人精品视频| 国产美女免费看| 中文字幕在线不卡一区| 最新天堂中文在线| 久久国产亚洲精品| 国产狼人综合免费视频| 在线中文资源天堂| 欧美日本在线播放| 人妻互换一区二区激情偷拍| 免费在线观看视频一区| 婷婷久久五月天| 成人久久网站| 精品国产区一区二区三区在线观看 | 亚洲精品无码久久久久久久| 亚洲最新色图| 亚洲自拍小视频免费观看| 怡红院红怡院欧美aⅴ怡春院| 在线不卡欧美精品一区二区三区| 99久久久无码国产精品不卡| 美腿丝袜一区二区三区| 中文字幕在线中文字幕日亚韩一区| 丁香婷婷久久| 精品国产欧美一区二区五十路 | 999国产精品亚洲77777| 中文字幕日韩精品有码视频| 亚洲一区二区激情| 亚洲蜜臀av乱码久久精品蜜桃| 污视频在线观看免费网站| 欧美日韩蜜桃| 九色综合婷婷综合| а√天堂资源国产精品| 日韩亚洲综合在线| 亚洲精品人妻无码| 欧美色道久久88综合亚洲精品| 青青草福利视频| 麻豆精品一区二区| 伊人再见免费在线观看高清版| 亚洲精品午夜| 国产97免费视| 成人福利在线观看视频| 精品999在线播放| 日韩在线播放中文字幕| 国产精品美女久久久久久久久久久| 日本一二三四区视频| 一区二区亚洲| 相泽南亚洲一区二区在线播放 | 日韩欧美中文字幕一区| 四虎永久在线精品| 亚洲国产精品精华液2区45| 亚洲综合123| 亚洲欧美视频一区二区三区| 制服丝袜综合日韩欧美| 麻豆一区二区| 国产精品一区二区久久国产| 色爱综合区网| 亚洲天堂第二页| www.色呦呦| 色婷婷综合久久久久中文| 欧美日韩午夜视频| 久久久三级国产网站| 三年中文在线观看免费大全中国| 一级成人国产| 最新视频 - x88av| 欧美日韩爱爱| 99中文视频在线| 日本美女久久| 2019亚洲日韩新视频| 影音先锋中文在线视频| 亚洲人在线视频| 亚洲av无码乱码国产精品| 欧美羞羞免费网站| 在线看成人av| 亚洲精品国产精品乱码不99 | 久久久精品高清| 免费久久99精品国产自在现线| 欧美精品久久96人妻无码| 国产日产精品一区二区三区四区的观看方式| 91在线精品视频| 美女视频一区| 国产999精品久久久| 97天天综合网| 欧美激情视频免费观看| 黄色在线观看网站| 一区二区三区日韩在线| 日韩中文字幕综合| 欧美成人一区二区三区| 国产精品无码久久av| 欧美性一区二区| www.国产com| 亚洲午夜精品网| www.av视频| 亚洲色图视频免费播放| 国产黄色片在线| 国产婷婷色一区二区三区| 黄色在线观看av| av亚洲精华国产精华| 中国特级黄色片| 国产乱妇无码大片在线观看| 91亚洲免费视频| 久久成人免费电影| 欧美三级午夜理伦三级富婆| 日本午夜一本久久久综合| 少妇高清精品毛片在线视频| 99成人精品| 男女激情无遮挡| 午夜一区不卡| 少妇性饥渴无码a区免费| 国产精品久久777777毛茸茸| 久久亚洲中文字幕无码| 一区二区三区福利| 91视频 -- 69xx| 久久国产毛片| 狠狠热免费视频| 久久精品国产精品亚洲精品| 午夜精品中文字幕| 国产一区二区精品久久91| 青青草原播放器| 国产精品996| av在线播放网址| 91在线视频播放地址| 99久久国产精| 国产欧美日韩在线视频| 亚洲综合图片一区| 亚洲一区在线观看视频| 精品成人免费视频| 日韩欧美999| 在线观看国产精品视频| 日韩一区二区精品| 手机av免费在线观看| 亚洲人成网站在线播| 尤物在线视频| 欧美疯狂xxxx大交乱88av| av福利在线导航| 青青精品视频播放| 四虎精品一区二区免费| dy888夜精品国产专区| 婷婷精品在线观看| 亚洲成人18| 国内自拍视频一区二区三区 | 久久精品久久精品久久| 精品福利免费观看| 中文字幕在线观看免费| 日韩一区二区三区免费观看| 婷婷久久久久久| 色哟哟网站入口亚洲精品| 日韩伦理av| 国产精品扒开腿做爽爽爽的视频| 亚洲精品大片| 国产亚洲欧美一区二区三区| 精品久久视频| 日韩成人三级视频| 久久久久欧美精品| 亚洲av毛片在线观看| 99re8在线精品视频免费播放| 大吊一区二区三区| 亚洲福中文字幕伊人影院| 中文亚洲av片在线观看| 精品久久免费看| 欧美日韩在线看片| 91福利视频在线观看| 91精品网站在线观看| 久久久精品国产一区二区三区| 91精品婷婷色在线观看| 久久婷婷国产精品| 国产aⅴ综合色| 国产又粗又长免费视频| 岛国视频午夜一区免费在线观看| 一炮成瘾1v1高h| 亚洲美腿欧美激情另类| 欧美videosex性欧美黑吊| 国产精品视频永久免费播放| 欧美日韩破处| 久久久久久久香蕉| 丝瓜av网站精品一区二区| 91福利视频免费观看| 国产精品嫩草影院av蜜臀| xxxx.国产| 亚洲国产精品999| 欧美人与动牲性行为| 国产一区二中文字幕在线看| 亚洲精品合集| 日韩a∨精品日韩在线观看| 国产麻豆91精品| 小嫩苞一区二区三区| 在线观看一区不卡| 水莓100国产免费av在线播放| 欧美精品日韩www.p站| 亚洲毛片在线免费| 亚洲精品乱码视频| 日韩精彩视频在线观看| 亚洲蜜桃精久久久久久久久久久久| 亚洲综合清纯丝袜自拍| 性生活视频软件| 久久影视电视剧免费网站| 日韩色性视频| 最近看过的日韩成人| 久久国内精品视频| 国产精品麻豆免费版现看视频| 色婷婷激情久久| 国产在线网站| 国产成人精品一区二区| 精品国产中文字幕第一页| 久久精品网站视频| 国产亚洲va综合人人澡精品| av大片在线免费观看| 国产视频欧美视频| 超碰一区二区| 日韩电影大全在线观看| 日产国产欧美视频一区精品| www亚洲色图| 欧美猛男男办公室激情| 麻豆传媒视频在线观看免费| 91在线观看免费网站| 欧美日韩亚洲一区| 国产女人18毛片水真多18| 婷婷丁香激情综合| 日本私人网站在线观看| 国产精品国语对白| 91一区二区| 9191在线视频| 午夜精品福利在线| 久久国产精品高清一区二区三区| 国产精品99久久久久久www| 日韩av久操| xxxx视频在线观看| 欧美日韩性视频| 91激情在线| 97se在线视频| 男人的天堂成人在线| 神马久久久久久久久久久| 欧美一级二级三级乱码| a级片在线免费观看| 日本视频一区在线观看| 激情亚洲综合在线| 精品少妇爆乳无码av无码专区| 亚洲精品乱码久久久久久按摩观| 欧美黑人疯狂性受xxxxx野外| 亚洲欧美日韩综合一区| 粉嫩绯色av一区二区在线观看 | 蜜桃传媒一区二区| 日本不卡一区二区| 久久精品国产亚洲av无码娇色| 亚洲欧美日韩在线高清直播| 亚洲精品伦理| 人妻久久久一区二区三区| 国产蜜臀av在线一区二区三区| h狠狠躁死你h高h| 亲爱的老师9免费观看全集电视剧| 婷婷综合视频| 中文字幕在线免费看线人| 欧美婷婷六月丁香综合色| 黄网av在线| 亚欧精品在线| 99九九99九九九视频精品| 91theporn国产在线观看| 97超视频免费观看| 羞羞答答成人影院www| a级大片在线观看| 日韩欧美三级在线| 成人在线黄色| 激情深爱综合网|