嵌入式大厂面经gdb常见面试题(持续更新中!)

这是一个嵌入式大厂面试题专栏,每天更新高频面试题。专栏将包含题目描述、详细解析、相关知识点扩展以及实际代码示例。内容涵盖操作系统、驱动开发、通信协议等核心领域,并结合实际项目经验进行分析。每道题目都会附带面试官可能的追问方向,帮助大家更好地准备面试!

GDB调试工具常见面试题解析

GDB(GNU Debugger)是GNU软件系统中的标准调试器,广泛应用于C/C++程序的调试。以下是GDB相关的常见面试题及详细解析:

1. GDB基础知识

Q: 什么是GDB?它的主要功能是什么?

:GDB是GNU项目开发的一个强大的程序调试工具,主要功能包括:

  1. 运行程序:可以设置运行参数,控制程序的执行环境
  2. 设置断点:在指定位置暂停程序执行
  3. 单步执行:逐行或逐过程执行程序
  4. 检查变量:查看和修改程序中的变量值
  5. 查看调用栈:分析程序的执行路径
  6. 监视表达式:跟踪表达式值的变化
  7. 多线程调试:支持多线程程序的调试
  8. 远程调试:支持对远程设备上的程序进行调试

2. GDB常用命令

Q: 列举GDB中最常用的调试命令及其功能

:GDB常用命令及功能:

  1. 启动和退出:gdb program:启动GDB并加载程序quit/q:退出GDB
  2. 运行控制:run/r [args]:运行程序,可带参数start:运行程序,在main函数处停止continue/c:继续执行程序next/n:单步执行(不进入函数)step/s:单步执行(进入函数)finish:执行到当前函数返回until/u:执行到指定行
  3. 断点操作:break/b [location]:设置断点watch [expr]:设置观察点info breakpoints:查看所有断点delete [num]:删除指定断点disable/enable [num]:禁用/启用断点condition [num] [expr]:设置条件断点
  4. 查看程序状态:print/p [expr]:打印表达式的值display [expr]:每次停止时显示表达式的值info locals:显示局部变量backtrace/bt:显示调用栈frame/f [num]:切换栈帧list/l:显示源代码
  5. 修改程序状态: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中的断点类型及设置方法:

  1. 普通断点:break function_name:在函数入口处设置断点break filename:line_number:在指定文件的指定行设置断点break +offset/-offset:在当前行的前/后offset行设置断点break *address:在内存地址处设置断点
  2. 条件断点:break location if condition:只有当条件满足时才触发断点condition breakpoint_num expression:为已存在的断点添加条件
  3. 观察点:watch expression:当表达式的值改变时停止rwatch expression:当表达式被读取时停止awatch expression:当表达式被读取或修改时停止
  4. 捕获点: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多线程调试的主要命令和技巧:

  1. 查看线程:info threads:显示所有线程信息thread thread_id:切换到指定线程
  2. 线程控制:set scheduler-locking off/on/step:控制调试时其他线程的运行 off:所有线程都正常运行on:只有当前线程运行step:单步时只有当前线程运行,continue时所有线程运行
  3. 线程断点:break location thread thread_id:为特定线程设置断点break location thread thread_id if condition:为特定线程设置条件断点
  4. 线程组命令: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远程调试的步骤和方法:

  1. 远程调试架构:目标板运行gdbserver或远程stub主机运行GDB客户端,通过网络或串口连接
  2. 连接方式:TCP/IP连接:target remote ip_address:port串口连接:target remote /dev/ttyS0
  3. 嵌入式系统调试:使用JTAG/SWD接口连接调试器通过OpenOCD等工具建立GDB与目标的连接使用交叉编译的GDB版本
  4. 常用命令: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内存调试的主要命令和技巧:

  1. 内存检查命令:x/nfu addr:检查内存内容 n:要显示的单元数f:显示格式(x十六进制,d十进制,u无符号,o八进制,t二进制,c字符,s字符串)u:单元大小(b字节,h半字,w字,g双字)info proc mappings:查看进程内存映射
  2. 内存断点:watch -l expression:监视内存位置而非变量rwatch -l expression:监视内存读取awatch -l expression:监视内存读写
  3. 内存泄漏调试:结合Valgrind等工具使用使用set environment MALLOC_CHECK_=2检测堆错误
  4. 内存修改:set {type}address = value:修改指定地址的内存值
# 内存检查示例
(gdb) x/10xb buffer      # 以十六进制显示buffer开始的1

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

嵌入式面试八股文全集 文章被收录于专栏

这是一个全面的嵌入式面试专栏。主要内容将包括:操作系统(进程管理、内存管理、文件系统等)、嵌入式系统(启动流程、驱动开发、中断管理等)、网络通信(TCP/IP协议栈、Socket编程等)、开发工具(交叉编译、调试工具等)以及实际项目经验分享。专栏将采用理论结合实践的方式,每个知识点都会附带相关的面试真题和答案解析。

全部评论
mark一下
点赞 回复 分享
发布于 04-28 16:50 上海

相关推荐

评论
点赞
6
分享

创作者周榜

更多
牛客网
牛客企业服务