You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LLDB执行list main显示错误代码行,断点设置却正常的问题

为什么LLDB执行list main会显示k()的代码,但能正确设置main断点?

这是个挺典型的调试信息生成与解析的小坑,我来给你拆解背后的原因:

  • 断点和list命令的工作逻辑完全不同
    断点是直接基于符号的内存地址设置的:LLDB会从二进制的符号表中找到main函数对应的起始内存地址,直接在该位置下断点——这个过程不依赖源代码的行号映射,只要符号表是正确的,断点就能正常工作。
    而list命令是反向查找:它需要先从DWARF调试信息里找到main函数对应的源代码起始行号,再读取源代码文件的对应行。这一步完全依赖编译器生成的调试行表(line table)是否准确。

  • 重复代码导致DWARF行表映射出错
    你的代码里,k()和main()都包含大量重复的puts("test");行(结合注释里的描述)。Clang在生成DWARF调试信息时,为了优化存储空间,会对完全相同的代码序列的行表条目进行复用或合并。当两个函数的代码结构高度相似、重复行极多时,编译器可能会错误地把main函数的起始行号关联到k()函数的代码行上,导致LLDB执行list main时跳转到了k()的代码中。

  • 快速验证方法
    你可以把其中一个函数里的puts("test");改成略有差异的内容(比如puts("test main");),重新用clang -g -o test test.c编译后再用LLDB测试,list main应该就能正确显示main函数的代码了——因为此时两个函数的代码不再完全重复,编译器不会复用行表条目,映射就恢复正常了。

内容的提问来源于stack exchange,提问作者Jinux

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:12:36