news 2026/6/25 13:04:44

记录一个demo模拟googleperf的调用栈统计

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
记录一个demo模拟googleperf的调用栈统计

上代码

///////////////////////////

#include <stdio.h> #include <stdlib.h> #include <signal.h> #include <sys/time.h> #include <unistd.h> #include <execinfo.h> #define MAX_STACK_DEPTH 16 volatile int sample_count = 0; void collect_call_stack() { void* buffer[MAX_STACK_DEPTH]; int depth = backtrace(buffer, MAX_STACK_DEPTH); printf("\n[采样 #%d] 调用栈深度: %d\n", ++sample_count, depth); // 关键修改:用 backtrace_symbols 解析成可读的符号 char** symbols = backtrace_symbols(buffer, depth); if (symbols) { for (int i = 0; i < depth && i < 8; i++) { printf(" %s\n", symbols[i]); } if (depth > 8) { printf(" ... 还有 %d 帧\n", depth - 8); } free(symbols); // 别忘了释放 } } void profiling_handler(int sig) { collect_call_stack(); } void function_c() { for (volatile long i = 0; i < 100000000; i++); } void function_b() { for (int i = 0; i < 3; i++) { function_c(); } } void function_a() { for (int i = 0; i < 3; i++) { function_b(); } } int main() { signal(SIGPROF, profiling_handler); struct itimerval timer; timer.it_value.tv_sec = 0; timer.it_value.tv_usec = 10000; timer.it_interval.tv_sec = 0; timer.it_interval.tv_usec = 10000; if (setitimer(ITIMER_PROF, &timer, NULL) == -1) { perror("setitimer 失败"); return 1; } printf("=== 性能采样器已启动 (每10ms CPU时间采样一次) ===\n"); printf("程序正在执行计算,采样器会周期性记录调用栈...\n\n"); function_a(); printf("\n=== 采样完成 ===\n"); printf("总共采集了 %d 个样本\n", sample_count); return 0; }

编译

g++ b.cpp -rdynamic

./a.out

ubuntu22@NYX:~/test$ ./a.out === 性能采样器已启动 (每10ms CPU时间采样一次) === 程序正在执行计算,采样器会周期性记录调用栈... [采样 #1] 调用栈深度: 10 ./a.out(_Z18collect_call_stackv+0x32) [0x62c8211fe27b] ./a.out(_Z17profiling_handleri+0x14) [0x62c8211fe398] /lib/x86_64-linux-gnu/libc.so.6(+0x42520) [0x7984c7c42520] ./a.out(_Z10function_cv+0x2b) [0x62c8211fe3c6] ./a.out(_Z10function_bv+0x1a) [0x62c8211fe3e8] ./a.out(_Z10function_av+0x1a) [0x62c8211fe410] ./a.out(main+0xa8) [0x62c8211fe4c6] /lib/x86_64-linux-gnu/libc.so.6(+0x29d90) [0x7984c7c29d90] ... 还有 2 帧


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/25 13:02:24

5步精通CrystalDiskInfo:全面掌握硬盘健康监控实战技巧

5步精通CrystalDiskInfo&#xff1a;全面掌握硬盘健康监控实战技巧 【免费下载链接】CrystalDiskInfo CrystalDiskInfo 项目地址: https://gitcode.com/gh_mirrors/cr/CrystalDiskInfo 想要实时监控硬盘健康状况&#xff0c;预防数据丢失&#xff1f;CrystalDiskInfo作为…

作者头像 李华
网站建设 2026/6/25 12:59:43

5G接入网虚拟化实战:基于SDN/NFV的vBTS平台架构与性能优化

1. 项目概述&#xff1a;当5G接入网遇上SDN与NFV如果你正在从事无线通信或者网络架构相关的工作&#xff0c;最近几年一定被SDN&#xff08;软件定义网络&#xff09;和NFV&#xff08;网络功能虚拟化&#xff09;这两个词反复“轰炸”。它们听起来像是云端的概念&#xff0c;离…

作者头像 李华
网站建设 2026/6/25 12:57:25

突破Windows窗口限制:3个核心技巧让桌面布局效率提升300%

突破Windows窗口限制&#xff1a;3个核心技巧让桌面布局效率提升300% 【免费下载链接】WindowResizer 一个可以强制调整应用程序窗口大小的工具 项目地址: https://gitcode.com/gh_mirrors/wi/WindowResizer 在Windows生态中&#xff0c;我们常常遇到这样的困境&#xf…

作者头像 李华
网站建设 2026/6/25 12:55:07

5个理由告诉你为什么PPTist是免费在线PPT制作的终极选择

5个理由告诉你为什么PPTist是免费在线PPT制作的终极选择 【免费下载链接】PPTist PowerPoint-ist&#xff08;/pauəpɔintist/&#xff09;, An online presentation application that replicates most of the commonly used features of MS PowerPoint, allowing for the edi…

作者头像 李华
网站建设 2026/6/25 12:54:36

5步掌握KMS_VL_ALL_AIO:Windows与Office智能激活的完整指南

5步掌握KMS_VL_ALL_AIO&#xff1a;Windows与Office智能激活的完整指南 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 在数字办公时代&#xff0c;系统与办公软件的正版授权常常成为个人用户和…

作者头像 李华
网站建设 2026/6/25 12:54:16

网盘不限速下载实测指南:大文件怎么通过直链解析配置提速

呃&#xff0c;讲真&#xff0c;熬夜刚把那台跑着自动化同步脚本的本地主控Server配置好&#xff0c;趁着编译编译器的空档&#xff0c;敲下这段文字。作为个常年和海量冷存储、各种协议打交道的后端&#xff0c;我的硬盘里塞满了差不多24TB的各种微服务镜像、技术大会源码包还…

作者头像 李华