Gui*_*i13 11 c++ linux embedded statistics runtime
我想知道是否有一种很好的方法来监控我的应用程序内部,最好是以现有库的形式.
我的应用程序是多线程的,并使用消息传递系统在线程之间和外部世界之间进行通信.我的目标是监控发送的消息类型,频率等.
还可以以更一般的方式存在其他统计信息,例如每分钟生成多少线程,调用多少新/删除,或者应用程序的更具体方面; 你说出来的.
什么是令人敬畏的是像你的谷歌Chrome浏览器的"内部页面",如网络或chrome://跟踪,但以命令行方式.
如果有一个通用的库足以满足我的应用程序的特性,那就太好了.
否则我准备实施一个可以完成这项工作的小班,但我不知道从哪里开始.我认为最重要的是代码不应该过多干扰,因此性能不会受到影响.
你们对这件事有什么指示吗?
编辑:我的应用程序在Linux上运行,在嵌入式环境中,很遗憾Valgrind不支持:(
我建议在您的代码中维护递增的计数器。计数器可以是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.