2017年4月总结

工作方面:

把上个月留下来的小尾巴解决了。

生活方面:

自从去年12月份开始新工作以来,包括春节,一直在忙工作。从这个月14日起到月底,请了半个月的假,回了趟家。享受一下和家人在一起出游,围坐在一起吃饭的时光,很惬意,很舒服!

技术方面:

只写了一篇uftrace的相关文章

这月看过的技术视频:

The Rust Programming Language

C++ Vectors

CppCon 2016: Greg Law “GDB – A Lot More Than You Knew”

CppCon 2016: Jens Weller “Programming: A short talk on the future of programming”

CppCon 2016: Dietmar Kühl “range for”

uftrace工具介绍

uftrace是一个追踪和分析C/C++程序的工具,其灵感来自于Linux kernelftrace框架(项目主页:https://github.com/namhyung/uftrace)。

(1)安装。
uftrace依赖于elfutils项目中的libelf,所以要首先安装libelf,而uftrace的安装则很简单:

# git clone https://github.com/namhyung/uftrace.git
# cd uftrace
# make
# make install

(2)使用。
以这个简单程序(test.cpp)为例:

#include <cstdio>

class A {
public:
        A() {printf("A is created\n");}
        ~A() {printf("A is destroyed\n");}
};

int main() {
        A a;
        return 0;
}

uftrace要求编译时指定-pg-finstrument-functions选项:

# g++ -pg test.cpp

编译成功后,通过uftrace工具可以对程序进行分析:

# uftrace a.out
A is created
A is destroyed
# DURATION    TID     FUNCTION
   4.051 us [ 8083] | __cxa_atexit();
            [ 8083] | main() {
            [ 8083] |   A::A() {
  13.340 us [ 8083] |     puts();
  17.321 us [ 8083] |   } /* A::A */
            [ 8083] |   A::~A() {
   1.815 us [ 8083] |     puts();
   4.679 us [ 8083] |   } /* A::~A */
  26.051 us [ 8083] | } /* main */

可以看到输出结果包含了程序的运行流程以及各个函数的执行时间。另外也可以使用-k选项追踪内核的相关函数:

# uftrace -k a.out
A is created
A is destroyed
# DURATION    TID     FUNCTION
   1.048 us [ 8091] | __cxa_atexit();
   0.978 us [ 8091] | sys_clock_gettime();
   0.768 us [ 8091] | main();
            [ 8091] | sys_clock_gettime() {
            [ 8091] |   A::A() {
   0.699 us [ 8091] |   } /* sys_clock_gettime */
            [ 8091] |   sys_clock_gettime() {
            [ 8091] |     puts() {
   0.768 us [ 8091] |     } /* sys_clock_gettime */
            [ 8091] |     sys_newfstat() {
   1.466 us [ 8091] |       smp_irq_work_interrupt();
   4.819 us [ 8091] |     } /* sys_newfstat */
   3.422 us [ 8091] |     __do_page_fault();
            [ 8091] |     sys_clock_gettime() {
   1.327 us [ 8091] |       smp_irq_work_interrupt();
   3.701 us [ 8091] |     } /* puts */
......  

通常我们需要把运行结果保存下来,便于以后分析,这时可以使用uftracerecord功能:

# uftrace record a.out
A is created
A is destroyed
# ls
a.out  test.cpp  uftrace.data

可以看到在当前目录下多了一个uftrace.data的文件夹,里面记录了关于这次程序运行的信息,随后就可以对程序进行分析了。举个例子,可以使用uftracereplay功能对程序的运行进行一遍“回看”:

# uftrace replay
# DURATION    TID     FUNCTION
   3.980 us [ 8104] | __cxa_atexit();
            [ 8104] | main() {
            [ 8104] |   A::A() {
  30.660 us [ 8104] |     puts();
  34.781 us [ 8104] |   } /* A::A */
            [ 8104] |   A::~A() {
  27.378 us [ 8104] |     puts();
  30.591 us [ 8104] |   } /* A::~A */
  69.632 us [ 8104] | } /* main */

综上所述,uftrace在下面这两个方面可以给我们很大帮助:
(1)了解程序的执行流程;
(2)度量函数的运行时间,确定热点。
感兴趣的朋友不妨亲自一试!

2017年3月总结

工作方面:
这个月的工作主要就是把老项目通信框架的代码移植到新项目上,同时修改一些核心逻辑的代码。原本以为3月份能完成,结果人算不如天算,还是在最后一天发现了一些问题,看来未来两周还得继续弄了。另外一个收获就是就是对NTLHElibHEAT这三个开源项目有了更好的理解,也贡献了一些有实际意义的patch

个人项目:
写了一个C/C++项目的通用Makefile模板:generic-c-c-plus-plus-makefile

技术方面:
开始学习Rust语言,由于这月工作比较忙,有时周末时间都要被工作占据,所以掌握的并不是很好,可以说还没有入门。

这个月看的数学相关视频:
Number Theory(基本学完,剩了一点小尾巴);
Vectors and spaces(学了一半)。

 

这月看过的技术视频:

Vectors in C++

CppCon 2016: Dan Higgins “Using STL containers efficiently”

CppCon 2016: Honggyu Kim “uftrace: A function graph tracer for C/C++ userspace programs”

C++ Weekly – Ep 52 – C++ To C Compilation

Introduction to Memory Management in Linux by Alan Ott

2013 Day2P18 LoB: ELF Intro

Linux 4.x Tracing: Performance Analysis with bcc/BPF (eBPF)

Linux Talk | Linux Memory Management

查看特定进程内存使用信息 [LinuxCast IT播客]