如何实现高效的C++运行时统计信息

Gui*_*i13 11 c++ linux embedded statistics runtime

我想知道是否有一种很好的方法来监控我的应用程序内部,最好是以现有库的形式.

我的应用程序是多线程的,并使用消息传递系统在线程之间和外部世界之间进行通信.我的目标是监控发送的消息类型,频率等.

还可以以更一般的方式存在其他统计信息,例如每分钟生成多少线程,调用多少新/删除,或者应用程序的更具体方面; 你说出来的.

什么是令人敬畏的是像你的谷歌Chrome浏览器的"内部页面",如网络或chrome://跟踪,但以命令行方式.

如果有一个通用的库足以满足我的应用程序的特性,那就太好了.
否则我准备实施一个可以完成这项工作的小班,但我不知道从哪里开始.我认为最重要的是代码不应该过多干扰,因此性能不会受到影响.

你们对这件事有什么指示吗?

编辑:我的应用程序在Linux上运行,在嵌入式环境中,很遗憾Valgrind不支持:(

jxh*_*jxh 3

我建议在您的代码中维护递增的计数器。计数器可以是static类成员或全局变量。如果您使用类来定义计数器,则可以让构造函数将计数器与名称一起注册到单个存储库。然后,您可以通过查阅存储库来查询和重置计数器。

struct Counter {
    unsigned long c_;
    unsigned long operator++ () { return ++c_; }
    operator unsigned long () const { return c_; }
    void reset () { unsigned long c = c_; ATOMIC_DECREMENT(c_, c); }
    Counter (std::string name);
};

struct CounterAtomic : public Counter {
    unsigned long operator++ () { return ATOMIC_INCREMENT(c_, 1); }
    CounterAtomic (std::string name) : Counter(name) {}
};
Run Code Online (Sandbox Code Playgroud)

ATOMIC_INCREMENT将是一种特定于平台的机制,以原子方式递增计数器。__sync_add_and_fetchGCC为此目的提供了一个内置函数。ATOMIC_DECREMENT类似,GCC内置__sync_sub_and_fetch.

struct CounterRepository {
    typedef std::map<std::string, Counter *> MapType;
    mutable Mutex lock_;
    MapType map_;
    void add (std::string n, Counter &c) {
        ScopedLock<Mutex> sl(lock_);
        if (map_.find(n) != map_.end()) throw n;
        map_[n] = &c;
    }
    Counter & get (std::string n) const {
        ScopedLock<Mutex> sl(lock_);
        MapType::const_iterator i = map_.find(n);
        if (i == map_.end()) throw n;
        return *(i->second);
    }
};

CounterRepository counterRepository;

Counter::Counter (std::string name) {
    counterRepository.add(name, *this);
}
Run Code Online (Sandbox Code Playgroud)

如果您知道同一计数器将由多个线程递增,则使用CounterAtomic. 对于特定于线程的计数器,只需使用Counter.