U-Boot烧录固件
今天在折腾设备时,替换了设备内的 libc.so.6
导致设备无法开机了,只能进入U-Boot。目前目前又无法使用 RKDevTool
烧录工具那样的傻瓜式通过USB进行烧录。
跟同事询问之后,可以使用U-Boot将文件系统写入到emmc中。 首先先配置好网络相关的U-Boot环境变量:
今天在折腾设备时,替换了设备内的 libc.so.6
导致设备无法开机了,只能进入U-Boot。目前目前又无法使用 RKDevTool
烧录工具那样的傻瓜式通过USB进行烧录。
跟同事询问之后,可以使用U-Boot将文件系统写入到emmc中。 首先先配置好网络相关的U-Boot环境变量:
LeakTracer 是一个非常轻巧的内存泄露排查库。基本所有的内存泄露排查工具原理都一样,记录内存申请的现场信息,在内存释放处,将配对的现场记录删除掉。然后在程序结束或某个时间,打印出那些还尚未被移除的现场记录。
有时候有些程序,运行后,无法手动结束应用,即代码编写并不规范,没有考虑程序结束的处理情况。在使用 LeakTracer 的时候,可以选择带程序初始化完成延后一段时间,再开始记录内存申请释放。然 后周期性的打印输出,查看是哪个位置内存泄漏可疑性非常大。
leaktracer_startMonitoringAllThreads();
while (!exit) {
std::this_thread::sleep_for(std::chrono::minutes(5)); // 这里最好可以更加细片化判断exit,以方便线程退出
leaktracer_writeLeaksToFile("leak_hhmmss.dump"); // 建议文件名添加时间戳便于分析和防止文件发生覆盖
}
leaktracer_stopAllMonitoring();
生成的 leak_hhmmss.dump
文件是一个文本文件,里面记录着内存申请时的函数调用栈,以及申请的内存大小,以及内存内容。LeakTracer 提供了一个 leak-analyze-addr2line
perl 脚本,其就是利用 addr2line 将记录的调用栈结合带有调试信息的可执行文件得到函数调用的代码出处,顺便统计这个调用栈在这个文件中出现的次数以及总共还存有多少释放的内存。
在使用 addr2line 过程中,有可能出现 ??:0
的打印,即分析不出代码行。出现这个问题的一个很大可能性就是,程序记录的是函数调用栈的内存地址,而 addr2line 需要的是相对偏移地址。我们在下文提及(参考 Boost.Stacktrace 提供的实现)。
Valgrind 是内存检测非常强大的工具,它在 Linux 具有包管理器下,使用非常友好。但是在嵌入式场景下,使用就不是那么方便了。
因为其需要带调试信息的 glibc 动态库文件 libc.so.6
的库。 在具有包管理器的环境下,我们可以安装 libc6-dbg
。但是在嵌入式环境下就比较麻烦了,如果文件系统构建时,构建了调试版本的 libc.so.6
,那么拷贝至系统即可。
如果没有,那么需要我们自己找到对应版本的 glibc 源代码,然后交叉编译得到调试版本的 libc.so.6
,再将编译好的 libc.so.6
动态库拷进系统。
这一步,如果 glibc 版本号对不上或者其他原因,一不注意就会导致系统崩溃。
所以下文 交叉编译valgrind、交叉编译glibc 只是做记录使用。
sudo apt-get install automake
./configure --prefix=/opt/aarch64-v01c01-linux-gnu-gcc/lib/valgrind-3.22.0 --host=aarch64-linux-gnu --enable-only64bit
在将valgrind-3.22.0
部署到板子上后,需要将 libexec/valgrind
路径导出到 VALGRIND_LIB
变量:
export VALGRIND_LIB=/data/sdcard/valgrind-3.22.0/libexec/valgrind
然后执行:
valgrind --leak-check=yes danki
RTCP(Real-time Transport Control Protocol)是RTP(Real-time Transport Protocol)的控制协议,用于监测RTP传输的质量和控制RTP流的发送速率。
RTP被划分在传输层,它建立在UDP上。同UDP协议一样,为了实现其实时传输功能,RTP也有固定的封装形式。RTP用来为端到端的实时传输提供时间信息和流同步,但并不保证服务质量。服务质量由RTCP来提供。
前几天,应该是阿里的客服给我打了一个电话,大意是:
感觉时间过的越来越来,一下子,一年就过去了。
今年感觉经历了很多事,现在想起来,依稀感觉一切过的很快。也只有在上班的时候,才能叹气今天一天怎么还没过完,怎么还没到周末。
在工作中,有调试的 设备需要使用IE内核的浏览器才能正常访问,但是是推荐的使用360浏览器,但是其不太好用,广告太多,总是弹出框要你安装360其它的产品。
上周末终于决定重新租房子了,通勤时间太长确实让生活幸福度直线下降。来回路上两小时就没了。
基本在所有的项目中都能见到shell脚本的身影。
今天在腾讯会议面试了一家叫 致趣科技 的公司。当然,面试无非就是先自我介绍以前自己做什么,负责做什么,然后按照简历写着自己会啥会啥为中心提问各种问题,最后就是围绕着自己简历写着的做过的项目进行项目技术和细节提问。
还记得刚开始使用FFmpeg的时候,一直对av_q2d()
、av_d2q()
这样的函数,感到疑惑。一般在熟悉一个库的API时,最好能够从其API就能知道其意义,这样有助于我们理解以及记忆(当然我们自己设计API也是如此)。