嵌入式大厂面经gdb常见面试题(持续更新中!)
这是一个嵌入式大厂面试题专栏,每天更新高频面试题。专栏将包含题目描述、详细解析、相关知识点扩展以及实际代码示例。内容涵盖操作系统、驱动开发、通信协议等核心领域,并结合实际项目经验进行分析。每道题目都会附带面试官可能的追问方向,帮助大家更好地准备面试!
GDB调试工具常见面试题解析
GDB(GNU Debugger)是GNU软件系统中的标准调试器,广泛应用于C/C++程序的调试。以下是GDB相关的常见面试题及详细解析:
1. GDB基础知识
Q: 什么是GDB?它的主要功能是什么?
答:GDB是GNU项目开发的一个强大的程序调试工具,主要功能包括:
- 运行程序:可以设置运行参数,控制程序的执行环境
- 设置断点:在指定位置暂停程序执行
- 单步执行:逐行或逐过程执行程序
- 检查变量:查看和修改程序中的变量值
- 查看调用栈:分析程序的执行路径
- 监视表达式:跟踪表达式值的变化
- 多线程调试:支持多线程程序的调试
- 远程调试:支持对远程设备上的程序进行调试
2. GDB常用命令
Q: 列举GDB中最常用的调试命令及其功能
答:GDB常用命令及功能:
- 启动和退出:gdb program:启动GDB并加载程序quit/q:退出GDB
- 运行控制:run/r [args]:运行程序,可带参数start:运行程序,在main函数处停止continue/c:继续执行程序next/n:单步执行(不进入函数)step/s:单步执行(进入函数)finish:执行到当前函数返回until/u:执行到指定行
- 断点操作:break/b [location]:设置断点watch [expr]:设置观察点info breakpoints:查看所有断点delete [num]:删除指定断点disable/enable [num]:禁用/启用断点condition [num] [expr]:设置条件断点
- 查看程序状态:print/p [expr]:打印表达式的值display [expr]:每次停止时显示表达式的值info locals:显示局部变量backtrace/bt:显示调用栈frame/f [num]:切换栈帧list/l:显示源代码
- 修改程序状态:set var [var]=[value]:修改变量值return [expr]:强制函数返回
# GDB命令使用示例 gdb ./myprogram (gdb) b main (gdb) r (gdb) n (gdb) p variable_name (gdb) bt (gdb) c (gdb) q
3. 断点和观察点
Q: GDB中的断点类型有哪些?如何设置条件断点?
答:GDB中的断点类型及设置方法:
- 普通断点:break function_name:在函数入口处设置断点break filename:line_number:在指定文件的指定行设置断点break +offset/-offset:在当前行的前/后offset行设置断点break *address:在内存地址处设置断点
- 条件断点:break location if condition:只有当条件满足时才触发断点condition breakpoint_num expression:为已存在的断点添加条件
- 观察点:watch expression:当表达式的值改变时停止rwatch expression:当表达式被读取时停止awatch expression:当表达式被读取或修改时停止
- 捕获点:catch event:捕获特定事件,如异常抛出、信号等
# 条件断点示例 (gdb) break 10 if i == 5 (gdb) break func1 if strcmp(str, "test") == 0 # 观察点示例 (gdb) watch global_var (gdb) rwatch *pointer (gdb) awatch array[index]
4. 多线程调试
Q: 如何使用GDB调试多线程程序?
答:GDB多线程调试的主要命令和技巧:
- 查看线程:info threads:显示所有线程信息thread thread_id:切换到指定线程
- 线程控制:set scheduler-locking off/on/step:控制调试时其他线程的运行 off:所有线程都正常运行on:只有当前线程运行step:单步时只有当前线程运行,continue时所有线程运行
- 线程断点:break location thread thread_id:为特定线程设置断点break location thread thread_id if condition:为特定线程设置条件断点
- 线程组命令:thread apply all command:对所有线程执行命令thread apply thread_id_list command:对指定线程执行命令
# 多线程调试示例 (gdb) info threads (gdb) thread 2 (gdb) set scheduler-locking on (gdb) break thread_func thread 2 (gdb) thread apply all bt
5. 远程调试
Q: 如何使用GDB进行远程调试?特别是嵌入式系统的调试?
答:GDB远程调试的步骤和方法:
- 远程调试架构:目标板运行gdbserver或远程stub主机运行GDB客户端,通过网络或串口连接
- 连接方式:TCP/IP连接:target remote ip_address:port串口连接:target remote /dev/ttyS0
- 嵌入式系统调试:使用JTAG/SWD接口连接调试器通过OpenOCD等工具建立GDB与目标的连接使用交叉编译的GDB版本
- 常用命令:file executable:加载可执行文件符号target remote host:port:连接远程目标load:将程序下载到目标内存monitor command:发送命令到调试器
# 远程调试示例(目标板) $ gdbserver :1234 ./myprogram # 远程调试示例(主机) $ arm-none-eabi-gdb (gdb) file myprogram (gdb) target remote 192.168.1.100:1234 (gdb) load (gdb) continue
6. 内存调试
Q: 如何使用GDB检查内存和调试内存问题?
答:GDB内存调试的主要命令和技巧:
- 内存检查命令:x/nfu addr:检查内存内容 n:要显示的单元数f:显示格式(x十六进制,d十进制,u无符号,o八进制,t二进制,c字符,s字符串)u:单元大小(b字节,h半字,w字,g双字)info proc mappings:查看进程内存映射
- 内存断点:watch -l expression:监视内存位置而非变量rwatch -l expression:监视内存读取awatch -l expression:监视内存读写
- 内存泄漏调试:结合Valgrind等工具使用使用set environment MALLOC_CHECK_=2检测堆错误
- 内存修改:set {type}address = value:修改指定地址的内存值
# 内存检查示例 (gdb) x/10xb buffer # 以十六进制显示buffer开始的1
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
嵌入式面试八股文全集 文章被收录于专栏
这是一个全面的嵌入式面试专栏。主要内容将包括:操作系统(进程管理、内存管理、文件系统等)、嵌入式系统(启动流程、驱动开发、中断管理等)、网络通信(TCP/IP协议栈、Socket编程等)、开发工具(交叉编译、调试工具等)以及实际项目经验分享。专栏将采用理论结合实践的方式,每个知识点都会附带相关的面试真题和答案解析。