gdb调试命令_方舟多语言调试器

方舟多语言调试器 Maple Multi-Language Debugger

方舟编译器孵化器/maple_engine​gitee.com
ed5d205980e7670ee6a3838947bdab65.png

方舟多语言调试器也叫Maple Multi-Language Debugger, 简称方舟调试器Maple Debugger, 是方舟编程体系中的一个重要工具类环节。在方舟编程体系中,方舟编译器用来编译用户程序或库程序(用C/C++, Java, JavaScript 等语言),可以编译成二进制机器码也可以编译成MapleIR的中间代码格式。方舟引擎可以执行编译生成的中间代码程序。方舟调试器用来做调试程序,且支持多语言的混合调试。方舟调试器同样可以调试二进制机器码或者中间代码。本次开源的是依赖方舟引擎的中间代码调试器。用户可以通过方舟引擎和调试器来调试和跟踪其程序。由于方舟调试器支持多语言混编的程序调试,用户还可以用它调试第三方的C/C++或其它语言的库程序,甚至调试方舟引擎和方舟运行时的代码。

方舟调试器有本地调试和远程调试两种工作方式。下图描述了稍复杂些的远程调试工作方式。

979772a5655a30524df0bf39c522fe2a.png

远程调试需要用gdbserver命令在目标机器(Target)上通过方舟引擎运行用户程序,同时在调试主机(Host)上运行gdb命令并执行target remote 或 target extended-remote连接到目标机器上的gdbserver进行调试。目标机器上运行方舟引擎程序,调试主机上则保存所有相关软件的代码和符号信息,包括方舟引擎、相关动态库以及为支持多语言调试而引入的额外符号信息。具体细节可参考GDB用户手册和方舟调试器源代码。

本地调试可以直接用gdb命令通过方舟引擎运行用户程序。

软件开发人员通常会使用多种编程语言完成项目任务。开发者会选择某个领域的常用语言作为基本的编程语言,有的也称为胶水语言,便于业务逻辑的清晰表达, 并充分利用已有的库代码。同时开发者为了提高程序的运行速度,会选择使用执行效率高的语言,比如C/C++,去实现核心算法或基本数据结构。与系统密切相关的代码也会选用C/C++实现。

方舟编译体系支持这种多语言的编程模式和开发生态。在方舟编程体系中MapleIR是核心,它把用户编程语言,方舟多语言前端,方舟编译器及方舟执行引擎串连起来,并且建立丰富的软件开发工具链。用户程序经过方舟多语言前端处理,翻译成MapleIR的格式,经由方舟编译器分析优化,最终生成目标机器代码或者方舟引擎可以接受的MapleIR代码。

方舟调试器的基本功能和特性可以通过以下几个方面来描述。

第一,方舟调试器面向使用方舟编译器编译代码,并且在方舟引擎上执行编译好的代码的用户 。

第二,方舟调试器支持无缝平滑的多语言调试。如果用户程序使用了多语言混编,那么在调试的时候,方舟调试器可以自动识别当前执行的代码使用何种语言,根据这种语言的特性去打印相关的信息,使得用户可以清晰地知道当前调试的是什么源代码,什么语言,在源程序哪一行,以及他们的数据对象和函数/方法的相关信息。比如当用户设置一个断点在C/C++语言写的程序库上,那么调试器就会搜寻到相应C/C++的库代码;而如果断点在一个方舟引擎运行管理的代码上,比如用户的Java程序,那么调试器就会搜寻相应的Java代码。

第三,方舟调试器同时支持静态和动态编程语言的调试。用户编程语言可以是C/C++,Java,JavaScript或Python等。它和方舟引擎灵活适配多种语言特性,支持用户调试各种动态语言特性。

第四,方舟调试器用Python实现,是基于业界主流调试器GDB的Python扩展,因此所有GDB的已有功能都可以使用,保证了用户可以使用GDB的功能去调试第三方的代码,如C/C++库代码。用户还可以使用方舟调试器的新增命令和用户熟悉的GDB原有的命令,以自己习惯的方式调试自己的程序。

第五,方舟调试器新增的命令可分为断点,控制,数据,堆栈,文件和设置等几个命令类别。方舟调试器的新增命令都有m前缀,一般都对应到相应的GDB原生命令,比如mbreakpoint,mbacktrace,mlist和mprint分别对应到GDB的breakpoint, backtrace, list和print命令,其中mprint用于打印运行时对象数据的细节。这些命令的语法,输出格式都和GDB原有的命令相似,便于用户熟悉和掌握方舟调试器。

第六,MapleIR特定的软件包可以依靠方舟引擎未来在各种不同的设备上执行,那么方舟编译器可以和GDB一起,在各种设备的SDK/IDE上工作。如果在分布式的系统下通过方舟引擎运行和调试程序,方舟调试器可以和GDB在server/client模式下的工作,通过一台GDB的服务器,在分布式的各个节点上运行方舟调试器。

方舟调试器与原生的GDB相比有个显著的区别,就是调试时通过方舟引擎对语言相关的元数据(metadata)的支持,这对于动态编程语言尤其重要。方舟引擎会在运行用户程序的过程中更新元数据,而方舟调试器利用方舟引擎得到的这些即时更新过的元数据,来处理用户当前的程序执行中的方法,对象数据及其类型。Java语言允许动态加载类,JavaScript和Python更加灵活,甚至可以在运行时更新对象的属性,这些特性原生的GDB难以直接支持,而方舟调试器和方舟引擎结合可以准确地给用户提供相关的动态调试信息。

方舟调试器会在方舟编程体系中不断演进,完善对多语言的支持,给用户提供更好的调试体验。

何葳,张雁 二零二零年八月

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值