GraalVM LLVM 运行时的调试

GraalVM LLVM 运行时支持使用 GraalVM 的 Chrome Inspector 实现,通过 Chrome 开发者工具 进行源代码级(例如 C 语言)调试。这包括对单步执行、断点以及本地和全局变量检查的支持。

要使用此功能,请确保使用 -g 参数编译时启用调试信息,然后编译您的程序。使用 clang 进行编译时,GraalVM 附带的 LLVM 工具链将自动启用调试信息。这样,您就可以单步执行程序的源代码并在其中设置断点。

要开始调试,请使用 --inspect 选项运行 lli

$JAVA_HOME/bin/lli --inspect <bitcode file>

启动后,检查器将在程序的第一个指令处暂停执行,并打印指向控制台的链接。将此链接粘贴到 Chrome 的地址栏中,即可打开开发者工具。

断点 #

断点只能在已解析的函数中设置。GraalVM 默认只在 LLVM 位码文件中的函数首次执行时解析它们。要改为提前解析函数,并在尚未执行的函数中设置断点,可以使用选项 lli --llvm.lazyParsing=false

使用 __builtin_debugtrap() 设置程序定义的断点 #

使用 __builtin_debugtrap 函数设置程序定义的断点,使您能够在程序中标记显式希望 GraalVM 暂停程序并切换到调试器的各个位置。调试器在每次调用此函数时自动暂停,就像在该调用上设置断点一样。您可以使用此功能快速到达您实际要调试的代码,而无需在启动应用程序后先找到并设置断点。您还可以指示 Chrome Inspector 不要在执行的第一个源代码级别语句处暂停程序。在这种情况下,GraalVM 将执行您的程序,直到它到达对 __builtin_debugtrap() 的调用,然后才会调用调试器。要启用此行为,您需要传递参数 lli --inspect.Suspend=false --inspect.WaitAttached=true

查找源文件 #

LLVM 位码文件中的调试信息包含用于标识源代码位置的绝对搜索路径。如果源文件没有移动,应该能够自动找到它。

如果源文件已移动,或者是在另一台机器上编译的,可以使用 --inspect.SourcePath=<path> 选项指定搜索路径(多个路径可以用 : 分隔)。

联系我们