我正在寻找一种方法来做一些事情,如附加到进程,设置断点,查看内存,以及gdb / lldb可以做的其他事情。但是,我不能找到办法做这些事情。
这个问题类似于this one,但对于MacOS而不是Windows。任何帮助表示赞赏!
注意:我想制作一个调试器,而不是使用一个。
另一件事是我不希望这个调试器超级复杂,我只需要读/写内存,断点处理和查看GPR
如果你真的想制作自己的调试器,另一种启动方式是弄清楚如何整理和解析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非常直接且不言自明。
使用调试器。例如gdb
或lldb
。他们有大量的文档来教你如何,但例如gdb -p <pid of process>
将gdb附加到正在运行的进程。
如果你想从C ++程序中驱动gdb
,那么在一个单独的进程(参见fork
和exec
)中使用它需要的aguments(可能包括启用其机器可解析接口的那个)启动它。确保将pipe
s设置为其stdin
/ stdout
,以便您可以读取其输出并发送命令。
如果您想从头开始编写自己的调试器,那么这是一项艰巨的任务。我建议首先阅读现有开源调试器的源代码。
虽然您可以查看另一个调试器的源代码,但如果不了解底层概念,您可能会发现很难理解。因此,我建议您首先通过以下资源获得概念的良好基础:
Mac OS X Sys Internals现在相当过时,但是Mac的内部原版圣经
Mac OS X and iOS Internals再次,过时但有用。这个链接是Jonathan Levin(作者)自己的网站,由于他与出版商的问题,他现在免费提供。他已经购买了这些权利,并将其提供给所有人。
*OS Internals当前的Mac Internals圣经,也是Jonathan Levin的圣经。第三册和第三册已经出版,第二册即将出版!
如果你想编写自己的调试器,你需要获得进程的任务端口(task_for_pid
),然后你可以读/写/迭代到虚拟内存(mach_vm_read
,mach_vm_write
,mach_vm_region
)。要做断点,你需要首先设置一个exception handler然后你可以操作线程上的debug registers(task_threads
,thread_get_state
,thread_set_state
)并在异常处理程序中处理它们。
Reference到一些不是我写的正确的调试器代码,因为断点(特别是指令)有点涉及。
MacDBG可能是另一个轻量级参考,但我自己没有使用它。