debugging 如何开发调试器

h6my8fg2  于 2022-11-14  发布在  其他
关注(0)|答案(6)|浏览(294)

我 正在 寻找 一 种 方法 来 执行 诸如 附加 到 进程 、 设置 断点 、 查看 内存 以及 gdb/lldb 可以 执行 的 其他 操作 。 但是 , 我 找 不到 一 种 方法 来 执行 这些 操作 。
此 问题 类似 于 this one , 但 适用 于 MacOS 而 非 Windows 。 如 有 任何 帮助 , 我们 将 不胜 感激 !

    • 注意 : 我 想 制作 调试 器 , 而 不是 使用 调试 器 。 * *

另 一 件 事 是 , 我 不 希望 这个 调试 器 是 超级 复杂 的 , 所有 我 需要 的 只是 读/写 内存 , 断点 处理 , 并 查看 GPR

wgxvkvu9

wgxvkvu91#

如果您真的想创建自己的调试器,另一种开始的方法是弄清楚如何编译和解析gdb-remote协议包(例如https://sourceware.org/gdb/onlinedocs/gdb/Remote-Protocol.html)。这是gdb在远程调试时使用的协议,lldb用于除Windows调试之外的所有操作。在MacOS上,lldb生成一个debugserver示例,该示例执行实际的调试并使用gdb-remote协议包对其进行控制。在Linux上,它使用lldb-server工具,该工具是Linuxlldb发行版的一部分,用于相同的目的。
gdb-remote协议为你想要执行的大多数操作提供了原语,启动一个进程,连接到一个进程,设置断点,读取内存和寄存器,并将你与控制进程的大量底层细节隔离开来。
您可以使用以下命令运行lldb调试会话,观察lldb如何使用此协议,从而帮助您解决问题:
(lldb)日志启用gdb远程数据包
但是你也可以看看lldb中的SB API。文档并不像它应该的那样高级,但是在lldb源代码的examples/python目录中有一堆例子可以让你开始,通常API是非常简单明了的。

snvhrwxg

snvhrwxg2#

LLDB有一个API,可以从C++Python使用。也许这就是你正在寻找的。
不幸的是,文档相当陈旧,似乎没有使用示例。因此,这将需要阅读一些源代码和大量的尝试和错误。

70gysomp

70gysomp3#

如果您想编写自己的调试器,则需要获得进程的任务端口(task_for_pid),则可以读取/写入/迭代到虚拟内存(mach_vm_readmach_vm_writemach_vm_region).要执行断点,您需要首先设置exception handler,然后才能在线程上操作debug registerstask_threadsthread_get_statethread_set_state),并在异常处理程序中处理它们。
Reference对某些调试器代码来说,我编写了一些不正确调试器代码,因为断点(尤其是指令断点)有点复杂。
MacDBG可能是另一个轻量级的参考,但我自己还没有使用过。

iaqfqrcu

iaqfqrcu4#

好吧,如果你想写一个调试器,看一下gdb/lldb源代码。我建议使用后者,因为gdb中的历史遗留问题可能会影响实际的运行。

lrl1mhuk

lrl1mhuk5#

使用一个调试器。比如gdblldb。他们有很多文档来教你 how 位,但是例如gdb -p <pid of process>会将gdb附加到一个正在运行的进程。
如果你想驱动gdb,例如 * 从 * 一个C++程序,然后在一个单独的进程中启动它(参见forkexec),并使用它所需要的参数(可能包括启用其机器可解析接口的参数)。确保你设置了pipe到它的stdin/stdout,这样你就可以读取它的输出并向它发送命令。
相反,如果你想从头开始编写自己的调试器,那么这是一个巨大的任务。我建议从阅读现有开源调试器的源代码开始。

bvhaajcl

bvhaajcl6#

虽然您可以查看另一个调试器的源代码,但如果不了解底层概念,您可能会发现很难理解。因此,我建议您从以下资源中获得良好的概念基础开始:
Mac OS X Sys Internals现在相当过时,但Mac内部的原始圣经
Mac OS X and iOS Internals同样,过时但有用。这个链接是乔纳森·莱文(作者)自己的网站,由于出版商的问题,他现在免费提供这个链接。他后来买回了版权,让所有人都可以使用。
*OS Internals目前的圣经Mac内部,也由乔纳森莱文。书籍三和我已经出版,与书籍二随后不久!

相关问题