c++ lldb调试入门 c++如何在macos或linux下使用lldb调试器

风磊大大_5762

风磊大大_5762

2026-03-19

507人浏览

原创

c++oding="utf-8" ?>

根本原因是未编译调试信息或路径错误:c++需用-g编译(如g++ -g -o hello hello.cpp),lldb启动时传可执行文件(./hello)而非源码,makefile需含cxxflags+=-g,macos建议用clang,-o0禁优化,断点优先用-n main,变量不可见说明调试信息缺失。

c++ lldb调试入门 c++如何在macos或linux下使用lldb调试器

lldb 启动时提示 No such file or directory 怎么办

根本原因通常是没编译出调试信息,或者路径写错了。C++ 源码必须用 -g 编译,否则 lldb 加载不到符号表,连 main 都找不到。

  • 确认编译命令包含 -g:比如 g++ -g -o hello hello.cpp,不能只写 g++ -o hello hello.cpp
  • 启动 lldb 时传的是可执行文件路径,不是源文件:lldb ./hello,不是 lldb hello.cpp
  • 如果用了 make,检查 Makefile 是否漏掉了 CXXFLAGS += -g
  • macOS 上用 Clang 编译更稳妥,某些 GCC 版本生成的 DWARF 格式可能和系统 lldb 兼容性差

设置断点但 run 后不中断,或显示 breakpoint not resolved

说明符号没加载成功,或者断点位置不可达——常见于内联函数、优化代码、或断点打在了没被编译进最终二进制的代码段上。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
  • 先运行 target list 看是否已加载目标;再用 image list 确认可执行文件和调试信息都正常映射
  • 用 breakpoint set -n main 比 breakpoint set -f main.cpp -l 10 更可靠,尤其对未优化代码
  • 如果用了 -O2 或更高优化级,函数可能被内联或删掉,断点自然失效;调试阶段务必加 -O0
  • macOS 上遇到断点不命中,试试 settings set target.experimental.enable-objc-exceptions true(虽是 Objective-C 相关,但有时影响 C++ 异常处理链)

想看变量值却显示 couldn't get a value 或 no location

这是调试信息丢失最典型的信号,不是 lldb 不会查,而是编译器根本没告诉它这个变量在哪存着。

  • 局部变量在函数末尾或作用域外无法访问,lldb 不会“猜”你想要什么,print x 前先 frame info 确认当前栈帧合法
  • 结构体成员若显示 <optimized out></optimized>,基本等于提醒你:关掉优化重编译,别硬扛
  • std::string、std::vector 这类类型,直接 print my_str 可能只显示地址;用 expr -O -- my_str(-O 表示调用 operator)能拿到可读内容
  • Linux 下若用 libc++ 而非 libstdc++,某些 STL 类型的 summary 不会自动加载,需手动 command source /path/to/lldb/libcxx.py

调试多线程程序时 thread list 显示不全,或 step 卡死

lldb 默认不主动追踪所有线程状态变化,尤其在线程刚创建/退出的瞬间容易“丢帧”,这不是 bug,是设计取舍。

  • 启动前加 settings set target.thread-step-avoid-regexp ".*" 可避免 step 时意外跳进系统库
  • 用 thread select N 切换后,再 bt 才能看到该线程真实调用栈;不要只依赖 bt 当前默认线程
  • macOS 上 pthread_create 创建的线程可能延迟出现在 thread list 中,等 1–2 秒再查,或加 process handle -s false -n false -p true SIGUSR1(避免信号干扰)
  • Linux 下建议用 lldb --batch -x "run" -x "thread list" ./myapp 快速抓快照,交互式调试时线程状态易受步进节奏干扰

真正卡住的地方往往不在命令本身,而在编译选项和符号完整性——哪怕只漏一个 -g,后面所有操作都在和“看不见的变量”较劲。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++ c++入门教程

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end='\n', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.27

2820

5

python print用法与作用
python print用法与作用

本专题整合了python print的用法、作用、函数功能相关内容,阅读专题下面的文章了解更多详细教程。

2026.02.03

249

24

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.02

6199

3

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

2025.06.09

4614

18

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

2025.07.04

4751

25

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

5647

5

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.10

2448

6

location.assign
location.assign

在前端开发中,我们经常需要使用JavaScript来控制页面的跳转和数据的传递。location.assign就是JavaScript中常用的一个跳转方法。通过location.assign,我们可以在当前窗口或者iframe中加载一个新的URL地址,并且可以保存旧页面的历史记录。php中文网为大家带来了location.assign的相关知识、以及相关文章等内容,供大家免费下载使用。

2023.06.27

2682

5

macOS怎么切换用户账户
macOS怎么切换用户账户

在 macOS 系统中,可通过多种方式切换用户账户。如点击苹果图标选择 “系统偏好设置”,打开 “用户与群组” 进行切换;或启用快速用户切换功能,通过菜单栏或控制中心的账户名称切换;还能使用快捷键 “Control+Command+Q” 锁定屏幕后切换。

2025.05.09

4504

14

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习