使用-gline-tables-only 而不是-g 的缺点是什么?

What are the downsides of using -gline-tables-only instead of -g?

使用 -g 为我的项目生成的调试信息增加了大量的二进制文件大小和编译时间开销。我想使用更精简的 -gline-tables-only,但不确定我会失去什么。例如,行断点是否仍然有效? LLDB 中的 p var_name 呢?我正在使用 clangswiftc,它们都依赖于 LLVM。

-gline-tables-only确实只记录调试信息的地址->行号部分。因此,按文件和行进行的中断设置大部分仍然有效(一些内联信息不会出现在官方“行 table”中,并且会丢失),您将在回溯中看到行信息。

但是,它缺少所有 scope/variable/type 信息。所以消费者不会知道当前范围内有哪些变量,或者实际上在您的程序中的任何地方(因此 v 和您的 IDE 的 Locals 视图将不起作用)。即使它确实知道一个变量也无法打印它,因为 lldb 也不知道该类型。所以你也不能真正使用 expr 来转换和打印原始地址。

-gline-tables-only 当您真正关心的是从崩溃报告等中获取行号信息时,对于调试信息的长期存储很有用。它对实际调试没有用。