如何配置GDB以在Windows中调试Rust程序,包括设置Rust pretty-printers,以及在IDE或命令行中进行调试?
答案 0 :(得分:24)
首先,您需要使用Windows GNU ABI Rust安装来编译程序。 MSVC ABI使用与GDB理解的不同的调试格式,因此不会起作用。 MSVC ABI编译的程序必须使用Visual Studio(或将来可能是LLDB)进行调试。
第二步是获取GDB本身。建议的选择是从TDM-GCC或mingw-w64:
获取它Rust为GDB提供了一些扩展,以便更好地显示某些Rust本机类型,例如枚举,切片和向量。使用漂亮的打印机,这种类型的变量将以结构化方式显示,而不是低级表示。有关详细信息,请参阅https://michaelwoerister.github.io/2015/03/27/rust-xxdb.html。
漂亮的打印机只包含在Rust的Linux(和Mac OS?)发行版中,而不包含在Windows(Issue reported)中。但它们可以在Windows中运行。
下载Linux Rust存档(https://www.rust-lang.org/downloads.html),解压缩并找到里面的rustc/lib/rustlib/etc
目录。现在将etc
文件夹复制到$RUST/bin/rustlib
,其中$ RUST是Rust安装的位置。那里的Python脚本将位于$RUST/bin/rustlib/etc
。
如果您只打算在RustDT中使用GDB,并且具有RustDT 0.4.1或更高版本,则可以跳到下一部分:"在Eclipse中使用GDB和RustDT"
现在,需要配置GDB来加载这些脚本。找到GDB安装的gdbinit文件(对于TDM-GCC,应为gdb64\bin\gdbinit
,对于mingw-w64:mingw64\etc\gdbinit
)。现在将以下文本添加到文件末尾:
python
print "---- Loading Rust pretty-printers ----"
sys.path.insert(0, "$RUST_GDB_ETC")
import gdb_rust_pretty_printing
gdb_rust_pretty_printing.register_printers(gdb)
end
但是将$RUST_GDB_ETC
替换为etc
目录与Python文件的位置,例如D:/devel/tools.Rust/rust/bin/rustlib/etc
。请注意,即使它是Windows路径,也要确保使用正斜杠(' /')作为路径分隔符,以避免该字符串文字中出现转义问题。
要验证这是否有效,请启动gdb。如果你看到" ----加载Rust漂亮的打印机----"在提示之前的消息并且没有Python错误之后,事情应该正常工作。要确认,请键入命令info pretty-printer
。应该有一行" rust_pretty_printer_lookup_function"如果漂亮的打印机成功加载,则在输出中。
如果您之前成功完成了这些步骤,那么您可以从RustDT中使用GDB。只是一些细节:
如果使用TDM GDB,要启动的GDB可执行文件必须是$TDM_ROOT/gdb64/bin/gdb.exe
处的可执行文件,而不是$TDM_ROOT/bin/gdb.exe
或$TDM_ROOT/bin/gdb64.exe
处的可执行文件,因为最后两个是包装器对于正确的可执行文件,当RustDT / CDT启动GDB过程时,它们无法正常工作。
如果使用RustDT 0.4.1或更高版本,只要RustDT在${RUST_ROOT}/lib/rustlib/etc
中找到它们,就会自动配置漂亮的打印机。您可以通过启动调试启动来验证这是否有效,打开相应的" gdb跟踪"控制台视图中的控制台页面,并搜索字符串"为Windows注册Rust漂亮打印机":
对于0.4.1之前的RustDT版本,要启用漂亮的打印机,您需要配置启动配置以运行刚刚在上一节中修改过的gdbinit文件。当RustDT / CDT启动GDB时,不会执行默认的gdbinit,只会在配置中指定。所以改变" GDB命令文件" .gdbinit
的字段,例如D:\devel\tools\TDM-GDB\gdb64\bin\gdbinit
: