我被要求在C中编写一个程序,该程序应该用C语言调试另一个程序,然后将每个行,循环或函数的每个变量的值存储在一个日志文件中。
我一直在网上搜索,我发现了使用gdb进行调试的文章。
我是否可以在程序中以某种方式使用GDB,然后逐行存储每个变量的值。
我已经掌握了C / C ++的基本知识,所以请简单回复一下。
由于
答案 0 :(得分:4)
调试器依赖于硬件的某些特殊功能,必须由操作系统公开(如果有的话)。
基本思想是硬件配置为在目标程序的每条指令之后,或在某些类型的指令(例如系统调用)或满足硬件的指令之后将控制转移到调试器存根断点条件。通常,这看起来像中断,管理程序异常等 - 非常特定于平台的细节。
正如评论中所提到的,在Linux上,您使用内核的ptrace功能与硬件和内核提供的调试器支持进行交互,从而抽象出许多硬件特有的细节并管理权限问题。通常,您必须与正在调试的进程具有相同的用户标识,或者是超级用户(root)。 Linux的ptrace还为您提供了间接的能力,可以访问目标应用程序的内存(字面意思是地址空间),这对调试器功能至关重要,而这些功能通常不能通过其他用户模式程序执行在多任务操作系统上。
其他操作系统将采用不同的方法。一些嵌入式目标使用调试盒,通过几根线将您的开发机器连接到嵌入式板。在其他情况下,内置于硬件中的调试功能由目标处理器上运行的小程序管理,然后通过串行或网络端口与驻留在开发机器上的完整调试程序进行对话。
诸如GDB之类的程序不仅可以完成设置调试停止条件,转储寄存器和转储程序指令的基础知识。它的大部分代码都是根据编译器可选地留下的调试元数据来注释它显示的内容,通过堆栈帧返回,并为用户提供强大的工具来配置所有这些 - 当然,它在目标中完成大部分工作 - 独立的方式,目标唯一代码主要局限于几个可互换的目录。
你确实可以从另一个程序“驱动”GDB - 很多很多GUI类型的调试器就是这样做的,它作为GDB的图形前端存在。但是,如果您被分配编写调试器,那么按照您的分配可能会或可能不会这样做。