Ubuntu C++调试有哪些方法
导读:Ubuntu 下可用的 C++ 调试方法概览 命令行调试器:使用 GDB(经典、通用)或 LLDB(LLVM 生态,命令与 GDB 近似)。 图形化与 IDE:如 Visual Studio Code(C/C++ 扩展 + GDB/LLD...
Ubuntu 下可用的 C++ 调试方法概览
- 命令行调试器:使用 GDB(经典、通用)或 LLDB(LLVM 生态,命令与 GDB 近似)。
- 图形化与 IDE:如 Visual Studio Code(C/C++ 扩展 + GDB/LLDB)、CLion、Eclipse CDT 等,提供断点、变量/栈可视化与一键运行调试。
- 核心转储分析:程序崩溃时生成 core dump,用调试器离线分析现场。
- 远程与嵌入式:通过 LLDB 连接远程/设备(如 Android)进行调试,支持符号加载与源码路径映射。
命令行调试 GDB 与 LLDB 快速上手
- 编译时务必加入调试信息:使用 -g;若需更易调试,建议关闭优化(如 -O0)。示例:g++ -g -O0 main.cpp -o main。
- GDB 常用流程与命令:
- 启动:gdb ./main
- 断点:break main 或 break main.cpp:10
- 运行:run [args]
- 单步:next(不进函数)/ step(进入函数)
- 继续:continue
- 打印:print var
- 栈回溯:backtrace(bt)
- 退出:quit
- LLDB 常用流程与命令(与 GDB 类似):
- 启动:lldb ./main
- 设置断点:b main 或 breakpoint set --file main.cpp --line 10
- 运行:run
- 单步:n / s
- 继续:c
- 打印:print expr 或 frame variable
- 栈回溯:bt
- 退出:quit
- 提示:LLDB 与 GDB 命令存在一一对应关系,上手成本低;在复杂项目或需脚本化时,LLDB 的脚本能力更灵活。
图形化与 IDE 调试
- Visual Studio Code
- 安装 VS Code 与 Microsoft C/C++ 扩展。
- 生成构建任务:Ctrl+Shift+P → Configure Default Build Task → 选择 g++ build active file(生成 tasks.json)。
- 配置调试:F5 → 选择 C++ (GDB/LLDB),生成 launch.json;常用字段包括 program、args、MIMode(gdb/ lldb)、miDebuggerPath、preLaunchTask。
- 在代码行号左侧点下断点,F5 启动调试,使用调试工具栏进行单步、继续、查看变量与调用栈。
- CLion / Eclipse CDT
- 直接内置 GDB/LLDB 调试支持,提供断点、变量/内存/寄存器视图与 CMake/Makefile 良好集成,适合大型工程。
高级场景与技巧
- 核心转储分析
- 开启与生成:ulimit -c unlimited;程序崩溃后生成 core 文件。
- 分析:gdb ./main core 或 lldb ./main -c core,使用 bt、frame、print 等定位崩溃点。
- 远程/嵌入式调试(以 LLDB 为例)
- 连接远程平台:platform select remote-android;platform connect unix-abstract-connect:///data/local/tmp/debug.sock。
- 附加进程:attach ;设置源码映射:settings set target.source-map < 编译时源码路径> < 本地源码路径> 。
- 加载未剥离符号:target symbols add < 未剥离 .so> ;随后可设置断点、单步与查看变量。
- 条件断点与表达式求值
- LLDB 条件断点:b main if some_var == 10;运行时求值/修改:expr some_var = 42。
- 调试优化相关
- 发布构建常开启优化(如 -O2/-O3),会导致变量被优化、单步与打印不符合直觉;调试时优先使用 -O0 -g,必要时配合编译器选项(如 -fno-omit-frame-pointer)提升可调试性。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: Ubuntu C++调试有哪些方法
本文地址: https://pptw.com/jishu/758272.html
