
任何写过比 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/
在最后一部分,我还会大年夜概介绍若何给你的调试器添加下面的功能:
- 长途调试
- 共享库和动态库支撑
- 表达式计算
- 多线程调试支撑
跟着后面文┞仿的宣布,这些链接会逐渐生效。
- 预备情况
- 断点
- 存放器和内存
- Elves 和 dwarves
- 源码和旌旗灯号
- 源码层慢慢履行
- 源码层断点
- 调用栈
- 攫取变量
- 之后步调
LCTT 译注:ELF —— 可履行文件格局(Executable and Linkable Format);DWARF(一种广泛应用的调试数据格局,参考 WIKI)。
在本项目中我会将重点放在 C 和 C++,但对于那些将源码编译为机械码并输出标准 DWARE 调试信息的说话也应当能起感化(如不雅你还不知道这些器械是什么,别担心,立时就会介绍到啦)。别的,我只存眷若何将法度榜样运行起来并在大年夜部分情况下能正常工作,为了简便,会避开类似结实缺点处理方面的器械。
预备情况
在我们正式开端之前,我们起重要设置情况。在这篇文┞仿中我会依附两个对象:Linenoise 用于处理敕令行输入,libelfin 用于解析调试信息。你也可以应用更传统的 libdwarf 而不是 libelfin,然则界面没有那么竽暌寡好,别的 libelfin 还供给了根本完全的 DWARF 表达式求值器,当你想攫取变量的值时这能帮你节俭很多时光。确认你应用的是 libelfin 我的 fbreg 分支,因为它供给 x86 上攫取变量的额外支撑。
一旦你在体系上安装或者应用你爱好的编译体系编译好了这些依附对象,就可以开妒攀啦。我在 CMake 文件中把它们设置为和我其余的代码一路编译。
我们的敕令类似 gdb 以及 lldb 的格局。要持续履行法度榜样,用户须要输入 continue 或 cont 甚至只需 c。如不雅他们想在一个地址中设置断点,他们会输入 break 0xDEADBEEF,个中 0xDEADBEEF 就是所需地址的 16 进制格局。让我们来增长对这些敕令的支撑吧。
启动可履行法度榜样
在真正调试任何法度榜样之前,我们须要启动被调试的法度榜样。我们会应用经典的 fork/exec 模式。
- int main(int argc, char* argv[]) {
- if (argc < 2) {
- std::cerr << "Program name not specified";
- return -1;
- }
- auto prog = argv[1];
- auto pid = fork();
- if (pid == 0) {
- //we're in the child process
- //execute debugee
- }
- else if (pid >= 1) {
- //we're in the parent process
- //execute debugger
- }
我们调用 fork 把我们的法度榜样分成两个过程。如不雅我们是在子过程,fork 返回 0,如不雅我们是在父过程,它会返回子过程的过程 ID。
如不雅我们是在子过程,我们要用欲望调试的法度榜样调换正在履行的法度榜样。
- ptrace(PTRACE_TRACEME, 0, nullptr, nullptr);
推荐阅读
人工智能与万物互联已成为智能化、网联化迈入纵深的使能技巧,为集成电路家当带来四大年夜计谋机会:形成计谋新需求、开辟技巧新偏向、构建研发新模式、塑造竞争新格局。我国正处于家当晋升的关键时代,应充分把握新形>>>详细阅读
本文标题:开发一个Linux调试器(一):准备环境
地址:http://www.17bianji.com/lsqh/35868.html
1/2 1

网友点评
精彩导读
科技快报
品牌展示