如何开发调试器

问题描述 投票:0回答:6

我正在寻找一种方法来做一些事情,如附加到进程,设置断点,查看内存,以及gdb / lldb可以做的其他事情。但是,我不能找到办法做这些事情。

这个问题类似于this one,但对于MacOS而不是Windows。任何帮助表示赞赏!

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

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

c++ macos debugging
6个回答
1
投票

好吧,如果你想编写调试器,请查看gdb / lldb源代码。我建议使用后者,因为gdb中的历史遗留问题可能会影响到实际发生的任何事情。


1
投票

LLDB有一个可以从C++Python消费的API。也许这就是你要找的东西。

不幸的是,文档相当破旧,似乎没有使用示例。因此,这需要阅读一些来源和大量的反复试验。


1
投票

如果你真的想制作自己的调试器,另一种启动方式是弄清楚如何整理和解析gdb-remote协议包(例如https://sourceware.org/gdb/onlinedocs/gdb/Remote-Protocol.html)。这是gdb在远程调试时使用的协议,而lldb用于除Windows调试之外的所有内容。在MacOS上,lldb生成一个debugserver实例,它执行实际调试并使用gdb-remote协议包控制它。在Linux上,它使用lldb-server工具,它是Linux lldb发行版的一部分,用于同一目的。

gdb-remote协议具有您要执行的大多数操作的原语,启动进程,连接到进程,设置断点,读取内存和寄存器,并将您与控制进程的许多低级细节隔离开来。

您可以通过运行lldb调试会话来观察lldb如何使用此协议来帮助自己:

(lldb)log启用gdb-remote数据包

但您也可以查看lldb中的SB API。文档并不像它应该的那样先进,但是lldb源代码的examples / python目录中有很多例子可以帮助你入门,而且一般来说API非常直接且不言自明。


0
投票

使用调试器。例如gdblldb。他们有大量的文档来教你如何,但例如gdb -p <pid of process>将gdb附加到正在运行的进程。

如果你想从C ++程序中驱动gdb,那么在一个单独的进程(参见forkexec)中使用它需要的aguments(可能包括启用其机器可解析接口的那个)启动它。确保将pipes设置为其stdin / stdout,以便您可以读取其输出并发送命令。

如果您想从头开始编写自己的调试器,那么这是一项艰巨的任务。我建议首先阅读现有开源调试器的源代码。


0
投票

虽然您可以查看另一个调试器的源代码,但如果不了解底层概念,您可能会发现很难理解。因此,我建议您首先通过以下资源获得概念的良好基础:

Mac OS X Sys Internals现在相当过时,但是Mac的内部原版圣经

Mac OS X and iOS Internals再次,过时但有用。这个链接是Jonathan Levin(作者)自己的网站,由于他与出版商的问题,他现在免费提供。他已经购买了这些权利,并将其提供给所有人。

*OS Internals当前的Mac Internals圣经,也是Jonathan Levin的圣经。第三册和第三册已经出版,第二册即将出版!


0
投票

如果你想编写自己的调试器,你需要获得进程的任务端口(task_for_pid),然后你可以读/写/迭代到虚拟内存(mach_vm_readmach_vm_writemach_vm_region)。要做断点,你需要首先设置一个exception handler然后你可以操作线程上的debug registerstask_threadsthread_get_statethread_set_state)并在异常处理程序中处理它们。

Reference到一些不是我写的正确的调试器代码,因为断点(特别是指令)有点涉及。

MacDBG可能是另一个轻量级参考,但我自己没有使用它。

© www.soinside.com 2019 - 2024. All rights reserved.