快捷搜索:  汽车  科技

开发linux系统怎么调试(开发一个Linux调试器)

开发linux系统怎么调试(开发一个Linux调试器)译者: ictlyh作者: Simon Brand-添加调试循环 …… 58%-处理输入 …… 75%-总结 …… 91%

开发linux系统怎么调试(开发一个Linux调试器)(1)

尽管调试器已经得到了广泛的使用,却并没有太多的资源告诉你它们的工作原理以及如何开发,尤其是和其它那些比如编译器等工具链技术相比而言。 -- Simon Brand

本文导航
  • -系列文章索引 …… 19%

  • -准备环境 …… 26%

  • -启动可执行程序 …… 34%

  • -添加调试循环 …… 58%

  • -处理输入 …… 75%

  • -总结 …… 91%

编译自: http://blog.tartanllama.xyz/c /2017/03/21/writing-a-linux-debugger-setup/

作者: 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. 准备环境[1]

  2. 断点

  3. 寄存器和内存

  4. Elves 和 dwarves

  5. 源码和信号

  6. 源码层逐步执行

  7. 源码层断点

  8. 调用栈

  9. 读取变量

  10. 之后步骤

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

  • 猜您喜欢: