1、本栏用来记录社招找工作过程中的内容,包括基础知识学习以及面试问题的记录等,以便于后续个人回顾学习; 暂时只有2023年3月份,第一次社招找工作的过程;
2、个人经历: 研究生期间课题是SLAM在无人机上的应用,有接触SLAM、Linux、ROS、C/C++、DJI OSDK等;
3、参加工作后(2021-2023年)岗位是嵌入式软件开发,主要是服务器开发,Linux、C/C++、网络编程、docker容器、CMake、makefile、Shell脚本、JSON等。4、求职岗位是嵌入式软件开发、C/C++开发、自动驾驶岗位开发等。
文章目录
- 一、嵌入式部分
-
- 1 解决崩溃的问题?具体说下
- 2 tcpdump、vailgrind、gdb具体怎么用的?
- 3 有用gdb去分析过coredump的文件嘛?
- 4 tcpdump是用来分析什么的?
- 5 内存泄漏问题怎么排查?
- 6 堆栈溢出问题怎么排查?
- 7 死锁问题怎么排查的?
- 8 什么问题会导致内存泄漏?
- 9 从系统层面,有什么方法可以知道是多线程死锁问题?
- 10 是什么工具去查的多线程死锁?
- 11 有编写过makefile或cmake的嘛?
- 12 如果要引用外部的库,CmakeList要怎么引用?
- 13 shell脚本写过那些?平常都用什么shell命令?
- 14 在偏嵌入式方面你的优势有哪些?
- 15 如果有个16进制,我要取高低位,该怎么取?用c/c++
- 16 Linux下的进程调度相关的。
- 17 malloc之后的是实际内存嘛?
- 18 有用过CUDA编程吗?
- 19 linux 条件变量和信号量的区别:
- 20 自旋锁和互斥锁的区别
- 21 进程间通信方式
- 22 线程同步方式,并说出系统调用
- 23 fork和vfork的区别
- 24 软链接和硬链接的区别
- 25 请你介绍一下5种IO模型
- 26 说说select、poll、epoll的区别
- 27 线程池的意义及如何实现一个线程池
- 28 用户态和内核态的区别及转换方式
- 二、网络部分
- 一、项目问题
-
- 1.1 智慧渣土用的什么算法?深度学习?
- 1.2 在这个项目中你主要做了什么?
- 1.3图片取流是怎么取的,用的什么方式?
- 1.4 组装JSON也是调库嘛?
- 1.5 高考项目是如何实现扩容的?
- 1.6 多GPU卡同时批量比较是怎么实现的?
- 1.7 多颗GPU的分配,是程序指定的还是随机分配的?
- 1.8 安全生产督导主要的开发工作是什么?
- 1.9 动线应用服务器项目:
- 1.10 项目中遇到的比较难得问题?
-
- 1.10.1 说一个解决的比较难得性能问题
- 1.10.2 网络带宽这块儿,是怎么分析他时带宽因素的?
- 1.10.3 那这个问题最后怎么解决的?有什么解决方案或规避方案?
- 1.10.4 刚刚说的bond0,是怎么回事?原理是是什么?为什么会提升上传的速度?
- 1.10.5容器是docker,docker需要绑定cpu嘛?
- 1.10.6 算法单CPU需要占用多少?
- 1.10.7 该问题怎么解决的?绑核后解决了吗?
- 1.10.8 程序是跑在容器的进程,除了把容器绑在CPU上,还有别的方式嘛?比如进程绑定在CPU上?
- 1.10.9 容器是怎么绑在CPU上的?
- 1.10.10那之前代码逻辑的缺陷怎么解的?
- 1.10.11还解决过什么性能问题?
- 1.10.12 多人脸阻塞问题是怎么排查出来的?
- 1.10.13除了排查日志,如何查看其他线程的阻塞问题?
- 1.10.14 某个进程被系统杀掉,日志记录在哪里?
- 1.10.15 进程被杀掉,会有日志打印吗?
一、嵌入式部分
1 解决崩溃的问题?具体说下
①算法引擎通过backtrace堆栈信息和具体日志去排查。(去经验案例里看下backtrace是怎么实现的)
1.1 因为有加密所有无法挂gdb,那算法库加密是怎么加密的?
1.2 自己的程序,除了看backtrace,还能怎么查?
用gdb排查
用gdb排查程序崩溃问题:
- 方法1:运行程序,单步调试
gdb 程序;b+行号设置断点;run 运行;n单步运行;bt查看堆栈信息;print查看某一变量的值 - 方法2:调试core文件
ulimit -c unlimited //解开core文件大小限制
ulimit -d unlimited //解开数据段长度限制
./gdb test core//用gdb调试test的core文件
bt//查看具体的出错位置,堆栈信息
问题1:如何确认哪个程序产生的core
file core可以输出是由哪个程序生成的core
问题2:如何检车生成core文件的选项是否打开
ulimit -a
问题3:如何永久开启core文件生成
/etc/profile 文件中设置ulimit
问题4:修改core文件的文件名称以及加入pid号
core_pattern和core_uses_pid
问题5:程序产生core的原因
1 内存访问越界
2 多线程读写的数据未加锁保护。
3 非法指针
空指针、野指针、
4 堆栈溢出
使用大的局部变量(因为局部变量都分配在栈上),这样容易造成堆栈溢出
2 tcpdump、vailgrind、gdb具体怎么用的?
总结一下tcpdump、vailgrind、gdb具体是怎么取查内存泄漏和崩溃的
tcpdump、vailgrind、gdb具体怎么用的
1、tcpdump:对网络上传输的数据包进行捕获的抓包工具;配合wireshark工具进行使用。
tcpdump -i bond0//监听指定网卡bond0的所有传输数据包
2、vailgrind
valgrind --tool=memcheck --log-file=log.txt --leak-check=yes ./test
查看日志中的HEAP SUMMARY;堆栈摘要、小结;排查有没有内存申请后没有释放
3、gdb:
用gdb排查程序崩溃问题:
- 方法1:运行程序,单步调试
gdb 程序;b+行号设置断点;run 运行;n单步运行;bt查看堆栈信息;print查看某一变量的值 - 方法2:调试core文件
ulimit -c unlimited //解开core文件大小限制
ulimit -d unlimited //解开数据段长度限制
./gdb test core//用gdb调试test的core文件
bt//查看具体的出错位置,堆栈信息
- 问题1:如何确认哪个程序产生的core
file core可以输出是由哪个程序生成的core - 问题2:如何检车生成core文件的选项是否打开
ulimit -a - 问题3:如何永久开启core文件生成
/etc/profile 文件中设置ulimit - 问题4:修改core文件的文件名称以及加入pid号
core_pattern和core_uses_pid - 问题5:程序产生core的原因
1 内存访问越界
2 多线程读写的数据未加锁保护。
3 非法指针
空指针、野指针、
4 堆栈溢出
使用大的局部变量(因为局部变量都分配在栈上),这样容易造成堆栈溢出
3 有用gdb去分析过coredump的文件嘛?
调试core文件
ulimit -c unlimited //解开core文件大小限制
ulimit -d unlimited //解开数据段长度限制
./gdb test core//用gdb调试test的core文件
bt//查看具体的出错位置,堆栈信息
问题1:如何确认哪个程序产生的core
file core可以输出是由哪个程序生成的core
问题2:如何检车生成core文件的选项是否打开
ulimit -a
问题3:如何永久开启core文件生成
/etc/profile 文件中设置ulimit
问题4:修改core文件的文件名称以及加入pid号
core_pattern和core_uses_pid
问题5:程序产生core的原因
1 内存访问越界
2 多线程读写的数据未加锁保护。
3 非法指针
空指针、野指针、
4 堆栈溢出
使用大的局部变量(因为局部变量都分配在栈上),这样容易造成堆栈溢出
4 tcpdump是用来分析什么的?
网络抓包工具,HTTP的数据包,查看登录的用户名、密码、网址、正在浏览的网站内容,或任何其他信息
5 内存泄漏问题怎么排查?
用vailgrind,以及加打印排查代码逻辑
6 堆栈溢出问题怎么排查?
也就是排查程序异常崩溃的问题;
原因:空指针、野指针、内存拷贝访问越界、OOM
7 死锁问题怎么排查的?
参考https://blog.51cto.com/xiaohaiwa/5681338
gdb -p PID;(或者进入gdb,然后attach PID)
info thread;//打印所有线程信息,从里面找到__lll_lock_wait ()的线程;假设是2和3
thread