开发linux系统怎么调试(开发一个Linux调试器)
开发linux系统怎么调试(开发一个Linux调试器)译者: ictlyh作者: Simon Brand-添加调试循环 …… 58%-处理输入 …… 75%-总结 …… 91%
尽管调试器已经得到了广泛的使用,却并没有太多的资源告诉你它们的工作原理以及如何开发,尤其是和其它那些比如编译器等工具链技术相比而言。 -- Simon Brand
本文导航-
-系列文章索引 …… 19%
-
-准备环境 …… 26%
-
-启动可执行程序 …… 34%
-
-添加调试循环 …… 58%
-
-处理输入 …… 75%
-
-总结 …… 91%
作者: Simon Brand
译者: ictlyh
任何写过比 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]
-
断点
-
寄存器和内存
-
Elves 和 dwarves
-
源码和信号
-
源码层逐步执行
-
源码层断点
-
调用栈
-
读取变量
-
之后步骤
LCTT 译注:ELF —— 可执行文件格式executable and Linkable Format[2];DWARF(一种广泛使用的调试数据格式,参考 WIKI[3])。
准备环境在我们正式开始之前,我们首先要设置环境。在这篇文章中我会依赖两个工具:Linenoise[4] 用于处理命令行输入,libelfin[5] 用于解析调试信息。你也可以使用更传统的 libdwarf 而不是 libelfin,但是界面没有那么友好,另外 libelfin 还提供了基本完整的 DWARF 表达式求值器,当你想读取变量的值时这能帮你节省很多时间。确认你使用的是 libelfin 我的 fbreg 分支,因为它提供 x86 上读取变量的额外支持。
[1]: 准备环境 - http://blog.tartanllama.xyz/c /2017/03/21/writing-a-linux-debugger-setup/
[2]: 可执行文件格式 - https://en.wikipedia.org/wiki/Executable_and_Linkable_Format
[3]: WIKI - https://en.wikipedia.org/wiki/DWARF
[4]: Linenoise - https://github.com/antirez/linenoise
[5]: libelfin - https://github.com/TartanLlama/libelfin/tree/fbreg
[6]: 这里 - https://github.com/TartanLlama/minidbg/tree/tut_setup
[7]: Simon Brand - https://www.linkedin.com/in/simon-brand-36520857