返回值优化和noncopyable class

今天上班,遇到件比较有意思的事情。有同事叫我看一段代码,这段代码在gcc上可以编译通过,但是用bullseye cover编译用于统计覆盖率的时候,链接阶段报错了。

我简化一下这段代码如下:

class Integer
{
public:
    Integer(int x=0):_x(x){}
    Integer operator+(const Integer& rhs)
    {
        Integer tmp;
        tmp._x += rhs._x;
        return tmp;
    }
    ~Integer(){}
private:
    Integer(const Integer&);
    int _x;
};

我看了一下bullseye cover链接阶段报的错误,其实就是说找不到"Integer(const Integer&)"函数的定义,而这个函数在"Integer operator+(const Integer& rhs …

more ...

使用静态库链接程序

先关注两个gcc编译选项:

  1. -c 编译且汇编,但是不链接
  2. -S 只编译,不汇编也不链接

-c选项产出的就是经常看到的.o文件,也是一般用来创建静态库的文件。

用如下的命令可以将多个.o文件打包为一个静态库文件:ar crs libtest.a src/test1.o src/test2.o

现在完成了静态库创建工作,我们怎么在链接一个可执行程序的时候使用这个静态库呢? 有三种方式:

  1. gcc -o test main.c libtest.a
  2. gcc -o test main.c –ltest –L./
  3. gcc -o test main.c -Xlinker "-(" libtest.a -Xlinker "-)"

其中一、二其实是同一种使用方式 …

more ...

linux获取当前执行脚本

今天遇到一个需求,获取当前执行脚本: - 如果是sh test.sh或者./test.sh的运行方式,那么很简单,直接使用$0就可以了。
- 如果是source test.sh或者. ./test.sh的方式运行,$0就变成了-bash了。
google了一下,这个时候就需要使用$BASH_SOURCE了。(bash版本>=3.0)

[u1@localhost test]$ cat test.sh
echo $0
echo $BASH_SOURCE
[u1@localhost test]$ sh test.sh
test …
more ...

google cpu profiler二进制结果读取

最近一段时间在google cpu profiler做性能热点采样。

用过的人都知道,cpu profiler产出的原始结果是二进制存储的。一般是得到这个结果再使用pprof工具去转化为人可读的文本形式的结果或者图片形式的结果。

但是最近有一些需求:

  1. 对两个版本的profiler结果做比较
  2. 根据历史数据,对单次profiler结果做一些分析,提示一些可以优化的点

要实现这两个功能,如果是基于pprof转化过的数据进行处理,总会有一些获取不到的信息。所以,最好是基于profiler的原始数据来完成上述的功能。

因为profiler的数据是二进制形式的,所以第一步先来做数据读取的操作。

google了一把,找到了一个profiler数据格式说明

有了这个说明,读取这个数据就方便了,写了个python实现,如下:

g_offset = 0
def Print(msg):
    print time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()), " %s"%msg
def unpack_buff(fmt,buff):
    global g_offset …
more ...

Linux常用命令

系统软硬件、配置查看:

操作系统版本:uname, lsb_release

CPU信息查看:cat /proc/cpuinfo

core相关配置:/proc/sys/kernel/core_pattern,/proc/sys/kernel/core_uses_pid

系统core/栈大小/进程句柄数等等配置:ulimit

查看内存页大小:/usr/bin/getconf PAGE_SIZE/PAGESIZE

查看系统加载的动态库:/sbin/ldconfig

系统实时信息查看:

ps:查看系统当前进程相关信息

netstat:查看系统tcp连接、端口占用等信息

top:查看系统CPU、进程使用内存、CPU等等信息

sar:查看机器CPU、网络等等信息

free:查看机器内存相关信息

vmstat:查看机器内存、swap相关信息

dmesg …

more ...

python中如何中止一个线程

今天遇到一个需求,希望可以实现一个带时间上限的线程池的功能,需要在到达时间上限的时候,主动kill掉那些slave线程。

找了很久,终于发现一个基本满足需求的实现。

记录在这里,以备不时之需。

class KillableThread(threading.Thread):
    """A subclass of threading.Thread, with a kill() method."""
    def __init__(self, *args, **keywords):
        threading.Thread.__init__(self, *args, **keywords)
        self.killed = False

    def start(self):
        """Start the thread."""
        self.__run_backup = self.run
        self.run = self.__run # Force …
more ...