manout's blog

Something about me

在一个 64-bit Arm 开发板上执行一个 32-bit 的程序,bash 却报 file not found error, 可是 ls 是可以看到这个文件存在。

file not found error 通常会有以下三种原因

  • 文件确实不存在
  • 该文件是一个悬挂的 symbolic link
  • 这是个 32-bit 的 object(file ${FILE} 查看该文件类型), 但是 host 是 64-bit, 缺少 32-bit 的支持。

这次的错误就是第三个原因,运行该程序所依赖的运行时环境缺少关键组件,但是由于内核的接口只能返回一个错误码,并不能提供额外的信息。

可以查看 stackexchange 得到更多信息。

  • 向主管提离职,计划在 11 月份底离职
  • 完成 mace 对开发板的支持,包括 ci 的检查
  • 下个月去 momenta 苏州实习 不管住了,还要自己租房子,好麻烦啊
  • 明年去深圳字节跳动实习

要去深圳了,命运啊

2018 年 11 月 13 日 北京 · 清河

之前有个任务要更新集群中的 gnulibc, 当安装上新的库把原来的 symbol link libc.so.6 删掉后所有的命令都不能使用,提示缺少 libc.so.6, /(ㄒoㄒ)/~~.
这个库提供的功能过于基础,基本 linux 下的所有的可执行文件都要运行时链接,如果要修复的话会用到 ln 命令,但是 ln 也依赖于 libc.so.6, 这就是个循环问题了。

运行时需要指定 LD_PRELOAD, LD_PRELOAD 是用于指定动态库的加载,优先级高于 LD_LIBRARY_PATH, 这样执行 ln 命令时显式指定要载入的 share object.

1
LD_PRELOAD=/path/to/libc-2.23.so ln -s /path/to/libc-2.23.so /path/to/libc.so.6

总结,类似 gnulibc 这种提供基础功能的库,最好只通过系统的包管理工具升级。

  我以前是有些得意,自信,更多的是不在乎。那些不在乎里,含着一部分自知得不到的不屑,很幼稚,还觉得浪漫,想着即使最冷的天气也还是一件大衣就可以出门,在餐厅里看奔波的路人,然后想着他们都是要回家的,而我会是一个赶路人。
  但是这些在遇到一个人后都会改变,开始按部就班地攒钱看房,顾及户口,职位,她让你的生活更落地,也更谦卑,你开始觉得世界很大,生活也很神圣,细着心去经营也害怕出错,再也不敢对任何美景吹口哨,看见灰尘也不觉得陈旧。
  前几天我做了一个梦,梦见我回到了邯郸,冬天,在丛台路的麦当劳等人,靠窗的座位,外面下着雪,人们披着一身的雪债匆匆赶路,他们聊天时有哈气,像真正的寒暄。
  我就这样看了很久,等的人一直没来,我也没打算走。醒来后我靠在床头,像个老人一样沮丧了很久。

2018 年 11 月 4 日 北京 · 清河

scp 的一般格式

1
scp [-P {port}]  {from_user}@{from_host}:{/source/file} {to_user}@{to_host}:{/to/file}

scp permission denied 的原因通常是因为权限问题, 认证失败会要求输入密码

确保 to_userto_host 上有以下权限

  • 如果 to/file 为目录, 对该目录有 wx 权限
    • 如果在 to/file 下有同名文件,确保对该文件有 w 权限
  • 如果 to/file 为文件,确保对该文件有 w 权限

通过以上两个措施一般可以解决 scp permission denied 的问题

Raspberry Pi 性能分析工具汇总

  • gprof
  • gperftools
  • valgrind
  • oproile

gprof

gprof 属于 GCC 编译器工具包,安装 gcc 编译器后即可使用

usage

  • 编译选项加入 -pg 打开 gprof 分析模式
  • 链接选项加入 -all-static 强制 linker 使用静态链接库
    gprof 分析只会覆盖可执行文件中的例程,运行时加载库中的函数不会在分析结果中,如果使用动态链接库,程序的启动方式会不同。

编译生成可执行文件后,像往常一样运行,分析信息和 benchmark 会输出到 gmon.out 文件中.

如果使用动态链接方式,使用 libtool 在运行文件时调用 gprof

1
libtool -mode=execute gprof ./demofile

当程序执行完毕后,使用 gprof 分析该程序的运行时的开销。

1
gporf ./demofile

注意

gprof 没有线程安全的实现,无法调试并行计算程序,如使用 OpenMP 或者 pthread 编写的程序。

gperftools

gperftools 是 Google 提供的软件性能分析工具。原理基于时间的采样,能够正确分析多线程程序,所以可以分析使用 OpenMP 的程序。

install

1
sudo apt install google-perftools libgoole-perftools-dev

usage

  • 在需要 profile 的代码段两端加上对 ProfilerStart("demofile.prof")ProfilerStop() 的调用。接口声明在 gperftools/profiler.h
  • 编译中加入 profiler 链接库, 强制使用静态链接, 动态链接库中的函数不会出现在 profiling results 中.
    LDFLAGS+= "-all-static -lprofiler"

在运行编译后的可执行文件后,使用 goole-pprof 生成运行时分析结果.

1
google-pprof -text ./demofile demo.prof

valgrind

valgrin 是很复杂且使用较为广泛的性能与内存分析工具。它会将程序运行在一个虚拟的处理器中获得其运行时的全部信息。因为是运行在虚拟环境中,所以分析速度会比实时运行慢很多倍。
valgrind 对多线程程序如 OpenMP 的调试也不理想。

install

1
sudo apt install valgrind kcachegrind

usage

可见官方文档

oprofile

oprofile 不在 Raspbian 官方 package 中,可以从源码编译获得。但是编译后立刻会报不适用于 Raspberry CPU 或 kernel.
至少需要内核级的重构或许才可以,但也不一定能运行于 Raspberry Pi 环境。

所以 oprofile 暂时不可用。

git pull request 用于在 fork 官方 repo 到个人 github, 在本地修改后,向官方 repo 请求合并。在官方团队审查过代码后,就可以将自己所做的改动合并到官方 repo 的 branch。

流程

  • fork
    在 github 上 fork 别人的 repo 到自己 github.
  • clone
    clone 到本地后开新的 branch 做修改
  • commit
    修改后推送到自己的 github 的 new branch 上
  • pull request
    在 github 上发起 pull request, 选择要请求合并的分支
  • discuss and review
    repo 的团队审查代码。
  • merge
    repo 的团队审查通过后会合并到官方的 repo 的 master 或其他 branch 中,然后关闭这个 pull request.
0%