嵌入式大厂面经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一下
点赞 回复 分享
发布于 2025-04-28 16:50 上海

相关推荐

2025-12-24 15:25
已编辑
门头沟学院 前端工程师
是腾讯的csig腾讯云,前天晚上九点突然打电话约面,激动的通宵学了一晚上,第二天状态很差改了今天(以后再也不通宵学习了)感觉自己浪费了面试官一个半小时单纯手写+场景,无八股无项目无算法,打击真的很大,全是在面试官提醒的情况下完成的,自己技术方面真的还是有待提高,实力匹配不上大厂和已经面试的两个公司完全不一样,很注重编码能力和解决问题的能力,然而我这两个方面都很薄弱,面试官人很好很耐心的等我写完题目,遇到瓶颈也会提醒我,写不出题也会很耐心的跟我讲解好感动,到最后面试结束还安慰我打算把下周最后一场面试面完之后就不面啦,如果能去实习还是很开心,但是最重要的还是好好努力提高技术以下是面经第一题// 实现一个解析 url 参数的函数function parseUrl(urlStr) {// TODO}parseUrl('*********************************************');// 返回 {a: 1, b: 2, c: 3}追问:在链接里见过什么部分?用 hash 路由的话放在哪第二题// 考虑有一个异步任务要执行,返回 Promise,这个任务可能会失败,请实现 retry 方法,返回新方法,可以在失败后自动重试指定的次数。/*** 异步任务重试* @param task 要执行的异步任务* @param times 需要重试的次数,默认为 3 次*/function retry(task, times = 3) {// TODO: 请实现}// ---------------测试示例 ----------------// 原方法const request = async (data) => {// 模拟失败if (Math.random() < 0.7) {throw new Error('request failed');}const res = await fetch('https://jsonplaceholder.typicode.com/posts', {method: 'POST',body: JSON.stringify(data),});return res.json();}// 新的方法const requestWithRetry = retry(request);// 使用async function run() {const res = await requestWithRetry({ body: 'content' });console.log(res);}run();第三题就是给 retry 函数添加类型注释,用到泛型第四题:在组件库中将 Alert 用 api 的形式实现(应该就是 message 这个组件)怎么渲染到一个浮层里而不是原地渲染出来
不知道怎么取名字_:技术这个东西,太杂了,而且要下功夫的
查看5道真题和解析
点赞 评论 收藏
分享
01-15 22:54
武汉大学 Java
点赞 评论 收藏
分享
评论
点赞
8
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务