C/C++函数调用栈信息输出(backtrace backtrace_symbols)

C/C++函数调用栈信息输出(backtrace & backtrace_symbols)

最近工作,搞了一个死锁问题,加了好多输出无法定位问题。
就想着在锁操作调用的地方输出函数调用栈信息,试了一下,竟然实现了。

源代码

#include <iostream>
#include <mutex>
#include <execinfo.h>#ifndef __STL_LOCKER_H__
#define __STL_LOCKER_H__namespace STL
{class STL_Locker{public:static std::string printStackTrace(){std::string ret = "";void *callstack[128];int frames = backtrace(callstack, sizeof(callstack) / sizeof(callstack[0]));char **strs = backtrace_symbols(callstack, frames);if (strs == NULL){return ret;}// 从1开始,是不输出最后一层printStackTrace函数的调用信息for (int i = 1; i < frames; ++i){ret.append(std::string(strs[i]));ret.append("\n");}free(strs);return ret;}public:STL_Locker(){std::cout << "LYLOG StackTrace:\n"<< printStackTrace();std::cout << "LYLOG[" << __FILE__ << ":" << __LINE__ << "] " << __FUNCTION__ << "() INIT LOCK " << std::hex << &_mutex;}~STL_Locker(){std::cout << "LYLOG StackTrace:\n"<< printStackTrace();std::cout << "LYLOG[" << __FILE__ << ":" << __LINE__ << "] " << __FUNCTION__ << "() DESTROY LOCK " << std::hex << &_mutex;}void lock(){std::cout << "LYLOG StackTrace:\n"<< printStackTrace();std::cout << "LYLOG[" << __FILE__ << ":" << __LINE__ << "] " << __FUNCTION__ << "() START WRLOCK " << std::hex << &_mutex;_mutex.lock();std::cout << "LYLOG[" << __FILE__ << ":" << __LINE__ << "] " << __FUNCTION__ << "() ENDED WRLOCK " << std::hex << &_mutex;}void unlock(){std::cout << "LYLOG StackTrace:\n"<< printStackTrace();std::cout << "LYLOG[" << __FILE__ << ":" << __LINE__ << "] " << __FUNCTION__ << "() START UNLOCK " << std::hex << &_mutex;_mutex.unlock();std::cout << "LYLOG[" << __FILE__ << ":" << __LINE__ << "] " << __FUNCTION__ << "() ENDED UNLOCK " << std::hex << &_mutex;}private:std::mutex _mutex;};}#endif //__STL_LOCKER_H__

编译配置

如果不加次编译flags,只能输出函数地址,无法看到函数名称

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -rdynamic")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}  -rdynamic")

最终效果

StackTrace:
bin/ConfigService(_ZN3tbb6Locker6unlockEv+0x68) [0x556f47bb84]
bin/ConfigService(_ZN3tbb19concurrent_hash_mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrI16VgAccessDetecterESt4hashIS6_ESt8equal_toIS6_ESaISt4pairIKS6_S9_EEE8AccessorINSt8__detail20_Node_const_iteratorISG_Lb0ELb1EEEED1Ev+0x28) [0x556f4c652c]
bin/ConfigService(_ZN8VgAccess9heartbeatERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES7_PKN2vg6access16HeartbeatRequestEPNS9_17HeartbeatResponseE+0x57c) [0x556f4c2b34]
bin/ConfigService(_ZN8VgAccess9HeartbeatEPN6google8protobuf13RpcControllerEPKN2vg6access16HeartbeatRequestEPNS5_17HeartbeatResponseEPNS1_7ClosureE+0x134) [0x556f4beac8]
/ConfigService/libs/libvg_pb.so(_ZN2vg6access19AccessNotifyService10CallMethodEPKN6google8protobuf16MethodDescriptorEPNS3_13RpcControllerEPKNS3_7MessageEPS9_PNS3_7ClosureE+0x104) [0x7f8fdeb028]
/ConfigService/libs/libbrpc.so(_ZN4brpc6policy17ProcessRpcRequestEPNS_16InputMessageBaseE+0xad0) [0x7f8ecdd724]
/ConfigService/libs/libbrpc.so(_ZN4brpc19ProcessInputMessageEPv+0x10) [0x7f8eccb7d0]
/ConfigService/libs/libbrpc.so(_ZN4brpc14InputMessenger13OnNewMessagesEPNS_6SocketE+0x4c0) [0x7f8eccc520]
/ConfigService/libs/libbrpc.so(_ZN4brpc6Socket12ProcessEventEPv+0x18) [0x7f8ed80c88]
/ConfigService/libs/libbrpc.so(_ZN7bthread9TaskGroup11task_runnerEl+0x94) [0x7f8ec24e08]
/ConfigService/libs/libbrpc.so(bthread_make_fcontext+0x18) [0x7f8ec0f350]
LYLOG[/home/work/ConfigService/src/common/concurrent_hash_map.h:60] unlock() START UNLOCK 0x55a9e9baa0
LYLOG[/home/work/ConfigService/src/common/concurrent_hash_map.h:63] unlock() ENDED UNLOCK 0x55a9e9baa0

这里面的函数名称是Name Mangling后的结果,不懂Name Mangling的,自行百度。
似乎有方法获取到原始函数名称,但是定位问题这种级别的输出已经足够了,没有再继续研究。

注意

次代码为了定位问题,定为完问题就删掉了。产品环境下慎用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/222909.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《PCL多线程加速处理》-配准-icp

《PCL多线程加速处理》-配准-icp 一、效果展示二、具体实现三、代码一、效果展示 数据越大,速度提升效果越快 1、48万点 2、十万点 3、三万点 4、9000点 配准数据 二、具体实现

构建智能外卖跑腿小程序:技术实践与代码示例

在快节奏的现代生活中&#xff0c;外卖跑腿服务已成为人们日常生活中不可或缺的一部分。为了提供更智能、高效的外卖跑腿体验&#xff0c;本文将深入探讨构建一款智能外卖跑腿小程序所需的关键技术&#xff0c;并提供相应的代码示例。 1. 地理位置服务的整合 外卖跑腿小程序…

小程序 -网络请求post/get

1.1网络请求的概念(post和get) 1.2步骤 1.3 应用函数 js里面写&#xff0c;用bindtap绑在控件上&#xff0c;就不讲了 实例代码&#xff1a; //发起get数据请求get_info(){wx.request({url:https://www.escook.cn/api/get,//请求的接口地址,必须基于https协议//请求的方式met…

ElasticSearch之Shard request cache settings

对于查询操作&#xff0c;Elasticsearch提供了缓存特性来暂存结果。 对于相同条件的查询请求&#xff0c;在缓存中的数据失效前&#xff0c;响应后续的查询操作时可以直接从缓存中提取结果&#xff0c;有效降低检索操作的时延&#xff0c;提升检索数据时的体验。 提到缓存相关的…

SpringBoot项目打成War包部署

简介 一般情况下&#xff0c;在SpringBoot项目开发完成进行服务器部署时&#xff0c;都是打成JAR包进行部署运行的。但是在有些情况下也需要将其打成War包使用Tomcat进行部署。本篇文章就简单介绍一下SpringBoot如何打成War包。 注意&#xff1a; 测试Demo的SpringBoot版本为2…

python selenium chrome114版本之后环境配置和携带缓存打开chrome

尽力局 chrome驱动环境配置chrome打开带缓存设置待缓存打开自动关闭浏览器自动关闭浏览器弹窗 最终代码找资料难啊最终效果代码 依赖包和生成依赖包方法关闭谷歌升级 chrome驱动环境配置 网上找到的资料&#xff0c;我现在安装的是120版本的&#xff0c;这个资料是可行的。比较…

Jetbrains IDEA 2023.3 更新

本心、输入输出、结果 文章目录 Jetbrains IDEA 2023.3 更新前言Jetbrains IDEA 2023.3 主要更新内容功能更新用户体验优化数据库工具花有重开日,人无再少年实践是检验真理的唯一标准Jetbrains IDEA 2023.3 更新 编辑:简简单单 Online zuozuo 地址:https://blog.csdn.net/qq…

mysql分页查询性能测试

测试环境&#xff1a;1.1亿数据&#xff0c;约22GB大小&#xff0c;6核12线程32GBmysql8,ssd硬盘 表为常见的订单表&#xff0c;表中26个字段。 网上传说limit不同的使用方式对性能影响很大&#xff0c;自己也有点好奇&#xff0c;于是直接做个测试。 下面直接展示mysql在进…

【数据库设计和SQL基础语法】--查询数据--排序

一、排序数据 1.1 ORDER BY子句 单列排序 单列排序是通过使用 ORDER BY 子句对查询结果按照单个列进行排序。以下是单列排序的一些示例&#xff1a; 升序排序&#xff08;默认&#xff09;&#xff1a; SELECT column1, column2, ... FROM your_table_name ORDER BY column_t…

对局域网络中应用了网络变压器 POE供电功能的供电端设备间的连接方法

Hqst华轩盛(石门盈盛)电子导读&#xff1a;一起来了解局域网络中应用了网络变压器 POE供电功能的设备间的来连接方法 POE标准为使用以太网的传输电缆输送直流电到POE兼容的设备定义了两种连接方法: 第一,中间跨接法 一种称作"中间跨接法"( Mid -Span ),使用独立的PoE…

【Pytorch】学习记录分享3——PyTorch 自动微分与线性回归

【【Pytorch】学习记录分享3——PyTorch 自动微分与线性回归 1. autograd 包&#xff0c;自动微分2. 线性模型回归演示3. GPU进行模型训练 小结&#xff1a;只需要将前向传播设置好&#xff0c;调用反向传播接口&#xff0c;即可实现反向传播的链式求导 1. autograd 包&#x…

pytorch环境配置

1.创建环境 conda create --name pytorch python3.11.5 2.激活环境 source activate pytorch 3.添加国内镜像源&#xff1a; conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ conda config --add channels https://mirrors.tuna.tsin…

jmeter,取“临时重定向的登录接口”响应头中的cookie

1、线程组--创建线程组&#xff1b; 2、线程组--添加--取样器--HTTP请求&#xff1b; 3、Http请求--添加--后置处理器--正则表达式提取器&#xff1b; 4、线程组--添加--监听器--查看结果树&#xff1b; 5、线程组--添加--取样器--调试取样器。 首先理解 自动重定向 与跟随…

智能优化算法应用:基于黏菌算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于黏菌算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于黏菌算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.黏菌算法4.实验参数设定5.算法结果6.参考文献7.MA…

拦截器实现指定的IP白名单进行访问规定的Controller

需求&#xff1a;只允许内网的IP&#xff08;也就是IP白名单&#xff09;进行访问VideoController和ImgController&#xff0c;其余的FontController可以随便访问不做限制 总体的项目结构&#xff1a; 1、先写好业务代码三个Controller 访问的路径分别是&#xff1a; /api/…

SQL Server查询计划(Query Plan)——图形查询计划

6.4. 查询计划 与Oracle等其他关系库类似,SQL Server中,查询计划是进行SQL调优的基础,没有拿到SQL语句的查询计划之前,任何人都没办法对其性能方面进行准确的分析和判断,也没办法对相关性能问题进行精准的定位(当然,该过程中,也需要参考SQL语句及其具体数据环境)。所…

android studio 快捷输入模板提示

在Android开发中&#xff0c;我们经常会遇到一些重复性的代码&#xff0c;例如创建一个新的Activity、定义一个Getter方法等。为了提高开发效率&#xff0c;Android Studio提供了Live Templates功能&#xff0c;可以通过简化输入来快速生成这些重复性代码。 按下图提示设置&am…

ElasticSearch之cat shards API

命令样例如下&#xff1a; curl -X GET "https://localhost:9200/_cat/shards?vtrue&pretty" --cacert $ES_HOME/config/certs/http_ca.crt -u "elastic:ohCxPHQBEs5*lo7F9"执行结果输出如下&#xff1a; index shard prirep state docs s…

机器人制作开源方案 | 智能助老机器人

作者&#xff1a;刘颖、王浩宇、党玉娟 单位&#xff1a;北京科技大学 指导老师&#xff1a;刘新洋、栗琳 1. 项目背景 1.1 行业背景 随着越来越多的服务机器人进入家庭&#xff0c;应用场景呈现多元化和专业化&#xff0c;机器人产业生态体系正在不断完善&#xff0c;服务…

PyGame字体详解

文章目录 字体初始化获取字体字体对象内置方法 字体初始化 在pygame程序中&#xff0c;第一步势必进行初始化&#xff0c;即调用pygame.init()函数&#xff0c;而此初始化过程&#xff0c;则顺便包含了字体初始化&#xff0c;即默不作声地调用了pygame.font.init()函数。下面通…