为何符号表中无变量名?添加-O0编译选项仍未解决
问题分析与解决
你这里的核心问题其实是函数内的局部变量名根本不会存在于可执行文件的符号表里——哪怕加了-O0也一样。符号表和调试信息是两回事,你用dsymutil -s看的是符号表,而局部变量的名字保存在DWARF调试数据里。
为什么符号表里看不到局部变量
符号表(Symbol Table)管的是链接器需要用到的东西:全局变量、静态变量、函数名、外部库的引用符号这些。而函数里的自动局部变量是栈上的临时数据,它们的名字和调试信息不会进符号表,而是被存在专门的DWARF调试段里,只有调试器能直接读取这些信息。
怎么确认局部变量没被优化掉
你加-O0已经确保编译器没优化这些变量,只是找错了查看的工具,试试这两种方法:
用lldb调试验证
启动lldb加载你的可执行文件,断点进main函数后查看变量:
lldb a.out (lldb) b main (lldb) r (lldb) fr var
执行完fr var(frame variable的缩写)就能看到a、b、c、d、e所有局部变量的名字和值。
用dwarfdump查看DWARF调试信息
dwarfdump可以直接提取可执行文件里的调试数据,搜索变量名就行:
dwarfdump a.out | grep -E "a|b|c|d|e"
你会看到一堆包含这些变量名的调试条目,证明它们的信息确实被完整保留了。
关于dsymutil的补充
dsymutil是用来生成独立的.dSYM调试符号包的,dsymutil -s查看的是这个包的符号表,同样不包含局部变量信息。如果要查看.dSYM里的DWARF数据,直接用dwarfdump a.out.dSYM就行。
内容的提问来源于stack exchange,提问作者Roy
相关产品推荐
相关产品推荐

