linux 源码 调试,开发一个Linux调试器(六):源码级逐步执行
我們計(jì)算編寫(xiě)這些函數(shù)異常簡(jiǎn)單的版本,但真正的調(diào)試器有 thread plan 的概念,它封裝了所有的單步信息。例如,調(diào)試器可能有一些復(fù)雜的邏輯去決定斷點(diǎn)的地位,然后有一些回調(diào)函數(shù)用于斷定單步操作是否完成。這個(gè)中有異常多的基本舉措措施,我們只采取一種樸實(shí)的辦法。我們可能會(huì)心外埠跳過(guò)斷點(diǎn),但如不雅你愿意的話,你可以花一些時(shí)光把所有的細(xì)節(jié)都處理好。
系列文┞仿索引
跟著后面文┞仿的宣布,這些鏈接會(huì)逐漸生效。預(yù)備情況
斷點(diǎn)
存放器和內(nèi)存
Elves 和 dwarves
源碼和旌旗燈號(hào)
源碼級(jí)慢慢履行
源碼級(jí)斷點(diǎn)
調(diào)用棧展開(kāi)
攫取變量
下一步
揭秘指令級(jí)慢慢履行
在前幾篇博文中我們進(jìn)修了 DWARF 信息以及它若何使我們將機(jī)械碼和上層源碼接洽起來(lái)。這一次我們經(jīng)由過(guò)程為我們的調(diào)試器添加源碼級(jí)慢慢調(diào)試將該常識(shí)應(yīng)用于實(shí)際。
我們正在超出了自我。起首讓我們經(jīng)由過(guò)程用戶接口揭秘指令級(jí)單步履行。我決定將它切分為能被其它部分代碼應(yīng)用的 single_step_instruction 和確保是否啟用了某個(gè)斷點(diǎn)的 single_step_instruction_with_breakpoint_check 兩個(gè)函數(shù)。void?debugger::single_step_instruction()?{
ptrace(PTRACE_SINGLESTEP,?m_pid,?nullptr,?nullptr);
wait_for_signal();
}
void?debugger::single_step_instruction_with_breakpoint_check()?{
//起首,檢查我們是否須要停用或者啟用某個(gè)斷點(diǎn)
if?(m_breakpoints.count(get_pc()))?{
step_over_breakpoint();
}
else{
single_step_instruction();
}
}
正如以往,另一個(gè)敕令被集成到我們的 handle_command 函數(shù):elseif(is_prefix(command,"stepi"))?{
single_step_instruction_with_breakpoint_check();
auto?line_entry?=?get_line_entry_from_pc(get_pc());
print_source(line_entry->file->path,?line_entry->line);
}
應(yīng)用新增的┞封些函數(shù)我們可以開(kāi)端實(shí)現(xiàn)我們的源碼級(jí)慢慢履行函數(shù)。
實(shí)現(xiàn)慢慢履行
對(duì)于彪炳 step_out,我們只是在函數(shù)的返回地址處設(shè)一個(gè)斷點(diǎn)然后持續(xù)履行。我臨時(shí)還不想推敲調(diào)用棧展開(kāi)的細(xì)節(jié) - 這些都邑在后面的部分介紹 - 但可以說(shuō)返回地址就保存在棧幀開(kāi)端的后 8 個(gè)字節(jié)中。是以我們會(huì)攫取棧指針然后在內(nèi)存相對(duì)應(yīng)的地址攫取值:void?debugger::step_out()?{
auto?frame_pointer?=?get_register_value(m_pid,?reg::rbp);
auto?return_address?=?read_memory(frame_pointer+8);
bool?should_remove_breakpoint?=?false;
if?(!m_breakpoints.count(return_address))?{
set_breakpoint_at_address(return_address);
should_remove_breakpoint?=?true;
}
continue_execution();
if?(should_remove_breakpoint)?{
remove_breakpoint(return_address);
推薦閱讀
run(getData) 在 JavaScript 的世比賽,所有代碼都是單線程履行的,因?yàn)檫@個(gè)“缺點(diǎn)”,導(dǎo)致 JavaScript 的所有收集操作,瀏覽器事宜,都必須是異步履行。異步操作會(huì)在將來(lái)的某個(gè)>>>詳細(xì)閱讀
地址:http://www.17bianji.com/lsqh/36973.html
總結(jié)
以上是生活随笔為你收集整理的linux 源码 调试,开发一个Linux调试器(六):源码级逐步执行的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: linux sysconf函数,linu
- 下一篇: linux apt qt下载,Linux