模拟程序:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| #include <chat_global.hpp> #include <thread> #include <chrono>
void func(int i) { PRINT_INFO("thread " << i << " start..."); while(1) { PRINT_INFO("thread " << i << " run..."); std::this_thread::sleep_for(std::chrono::seconds(1)); } }
void func_high_cpu() { PRINT_INFO("thread high cpu test start..."); while(1) {
} }
int main(int argc, char const *argv[]) { std::thread t1(func, 1);
std::thread t2(func, 2);
std::thread t3(func, 3);
std::thread t4(func_high_cpu);
t1.join(); t2.join(); t3.join(); t4.join();
return 0; }
# 编译时没带 -g 选项
|
运行模拟程序
top
查看 high cpu 进程 id:
top -H -p pid
查看进程内各个线程占用的CPU百分比
gstack pid > pid.log
打印进程中各线程的函数调用栈信息
1 2 3
| $ sudo gstack 8521 > 8521.log
|
根据线程 id 8525 确认调用栈信息:
根据调用栈信息,结合源代码分析,根据上述步骤已基本定位到调用函数。
strace
查看系统调用和耗时时间
1
| $ sudo strace -T -r -c -p 8521
|
统计信息需等进程结束才会打印
gstack安装方法:Ubuntu安装gstack