请看
这个工具,使用说明在
这个补丁中。
该工具可以从您的LLVM IR文件生成另一个带有调试信息的LLVM IR文件,引用您的原始LLVM IR文件。您可以使用新的LLVM IR文件进行编译。在调试期间,您将处理原始LLVM IR文件的项目(堆栈跟踪、代码行)。
如果此回复对您有帮助,请为此回复点赞,以便其他人也知道如何调试LLVM IR文件,并在其上构建更多功能。目前看来,这是唯一可用的选项。
细节。
如果您需要处理裸的LLVM IR文件,例如手动编写的文件(与由其他语言的文件生成的编译器生成的LLVM IR文件相对应,例如C,其中生成的LLVM IR文件具有引用该C文件中代码行和符号的内联调试信息),
那么您可以使用上面提到的工具查看(崩溃)堆栈跟踪(LLVM IR函数),在您的LLVM IR函数上设置断点并使用调试器触发这些断点,可能会逐步执行您的LLVM IR代码(但我不确定能否查看变量、函数参数等的值)。
在应用此工具之前,最好将原始LLVM IR文件中所有出现的define internal
替换为define
(删除函数定义的internal
)。这样,调试器显示的堆栈跟踪将更加详细。
调试
上面提到的补丁提供了Mac OS上调试的详细信息。有关Win和Linux/WSL的信息,请参见下文。
在Windows中,我们使用了附带扩展
CodeLLDB(v1.7.0)的
Visual Studio Code。有关在VSCode中进行调试的
更多详细信息。调试器配置文件示例“{Repo Root}/.vscode/launch.json”:
{
"version": "0.2.0",
"configurations": [
{
"name": "DebuggingLLVMIR",
"type": "lldb",
"request": "launch",
"cwd": "${workspaceFolder}\\some\\path",
"program": "${workspaceFolder}\\some\\path\\to\\your_exe.exe",
"args": ["your_cmd_line_arg"],
"environment": [
{ "name": "BUILD_CONFIGURATION", "value": "Debug" },
{ "name": "PATH", "value": "../../SomeDir/bin/Debug/bin;../../../SomeDir/Native/build"}
],
"console":"integratedTerminal"
},
]
}
在Linux/WSL(Ubuntu 20.04)中有两个选项。
命令行LLDB。
lldb build/your_exe your_cmd_line_arg # Launch the debugging session with LLDB debugger.
(lldb) r # Run.
<Ctrl+c> # Break.
(lldb) bt # Stack Trace.
(lldb) f 1 # Select the stack trace frame 1.
(lldb) f 5 # 5.
(lldb) q # Quit the debugger.
使用 CodeLLDB(v1.7.0)扩展的 Visual Studio Code。
确保您可以在命令行中运行
./build/your_exe your_cmd_line_arg
。为此,您可能需要调整
LD_LIBRARY_PATH
环境变量。
export LD_LIBRARY_PATH=<absolute path to>/your/build:$LD_LIBRARY_PATH
env | grep LD_LIB
ldd ./build/your_exe
./build/your_exe your_cmd_line_arg
<Ctrl+c>
现在启动VSCode。
调试器配置文件示例"{Repo Root}/.vscode/launch.json:":
{
"version": "0.2.0",
"configurations": [
{
"type": "lldb",
"request": "launch",
"name": "DebuggingLLVMIR",
"program": "${workspaceFolder}/path/to/your/build/your_exe",
"args": ["your_cmd_line_arg"],
"cwd": "${workspaceFolder}/path/to/your",
}
]
}
lli
并查看它如何解释每个指令。不过,你需要进行一些黑客攻击来设置断点。 - arrowd