我 正在 寻找 一 种 方法 来 执行 诸如 附加 到 进程 、 设置 断点 、 查看 内存 以及 gdb/lldb 可以 执行 的 其他 操作 。 但是 , 我 找 不到 一 种 方法 来 执行 这些 操作 。
此 问题 类似 于 this one , 但 适用 于 MacOS 而 非 Windows 。 如 有 任何 帮助 , 我们 将 不胜 感激 !
- 注意 : 我 想 制作 调试 器 , 而 不是 使用 调试 器 。 * *
另 一 件 事 是 , 我 不 希望 这个 调试 器 是 超级 复杂 的 , 所有 我 需要 的 只是 读/写 内存 , 断点 处理 , 并 查看 GPR
6条答案
按热度按时间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是非常简单明了的。
snvhrwxg2#
LLDB有一个API,可以从C++或Python使用。也许这就是你正在寻找的。
不幸的是,文档相当陈旧,似乎没有使用示例。因此,这将需要阅读一些源代码和大量的尝试和错误。
70gysomp3#
如果您想编写自己的调试器,则需要获得进程的任务端口(
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可能是另一个轻量级的参考,但我自己还没有使用过。
iaqfqrcu4#
好吧,如果你想写一个调试器,看一下gdb/lldb源代码。我建议使用后者,因为gdb中的历史遗留问题可能会影响实际的运行。
lrl1mhuk5#
使用一个调试器。比如
gdb
或lldb
。他们有很多文档来教你 how 位,但是例如gdb -p <pid of process>
会将gdb附加到一个正在运行的进程。如果你想驱动
gdb
,例如 * 从 * 一个C++程序,然后在一个单独的进程中启动它(参见fork
和exec
),并使用它所需要的参数(可能包括启用其机器可解析接口的参数)。确保你设置了pipe
到它的stdin
/stdout
,这样你就可以读取它的输出并向它发送命令。相反,如果你想从头开始编写自己的调试器,那么这是一个巨大的任务。我建议从阅读现有开源调试器的源代码开始。
bvhaajcl6#
虽然您可以查看另一个调试器的源代码,但如果不了解底层概念,您可能会发现很难理解。因此,我建议您从以下资源中获得良好的概念基础开始:
Mac OS X Sys Internals现在相当过时,但Mac内部的原始圣经
Mac OS X and iOS Internals同样,过时但有用。这个链接是乔纳森·莱文(作者)自己的网站,由于出版商的问题,他现在免费提供这个链接。他后来买回了版权,让所有人都可以使用。
*OS Internals目前的圣经Mac内部,也由乔纳森莱文。书籍三和我已经出版,与书籍二随后不久!