运行期获得文件名和行号
探索动态日志模块的实现
最初的目标是创建一个通用的日志模块, 它具有基本的日志输出功能并支持重定向. 这样, 如果需要更换日志模块, 可以轻松实现.
最初的构想是通过函数重定向, 即使用 dlsym 来重定向所有函数以实现打印功能.
然而, 这种方法引发了一个问题, 即无法正确获取文件名和行号信息, 同时也受到流式打印问题的影响.
因此, 我开始思考是否有一种方法可以在运行时动态获取文件名和行号信息.
目前, 思路有些混乱导致不太愿意深入研究. 于是将这些思考和学习记录下来, 以备将来深入学习之用.
寻找解决方案
在明确了需要实现的任务后, 我发现了一个 GitHub 项目, 实现了我所需的功能.
以下是我从该项目中获得的知识点, 有助于理解如何在运行时动态获取文件名和行号的机制:
-
__cyg_profile_func_enter(void* callee, void* caller)和__cyg_profile_func_exit(void* callee, void* caller)这两个函数是在所有函数的入口和出口上增加的回调函数, 用于跟踪函数调用.
它们只在使用
extern "C"并带有__attribute__((no_instrument_function))属性的情况下才会生效.在编译时, 需要使用参数
-finstrument-functions -rdynamic -ldl来启用它们. -
dladdr(address, info)处理地址信息, 并将栈的信息返回给
info(类型为Dl_info的结构体), 从而获取函数调用栈的相关信息. -
abi::__cxa_demangle(__mangled_name, __output_buffer, __length, __status)用于处理文件名信息, 以使其更易读.
-
BFD(Binary File Descriptor)库和 GNU 二进制工具集
BFD库的主要目标是提供一个通用的接口, 允许开发者读取、分析、修改和生成各种不同格式的二进制文件
而无需关心文件格式的细节. 在这里, 它的主要作用是获取函数栈的信息.
使用之前, 需要执行
bfd_init函数进行初始化. -
bfd_openr(filename, target)这个函数用于打开一个二进制文件以进行读取操作, 返回一个 BFD 对象.
-
bfd_close(abfd)用于识别和验证输入的二进制文件的格式是否受支持.
-
bfd_get_symtab_upper_bound(abfd)用于计算符号表的上限大小, 以便在分析二进制文件时为符号表分配足够的内存空间.
-
bfd_canonicalize_symtab用于规范化符号表中的符号, 通常包括去除重复的符号、按名称排序符号等操作.
规范化符号表可以提高后续符号解析和分析操作的效率, 并确保符号表中的数据是一致和可预测的.
-
_Unwind_Backtrace(func, argue)通常用于获取当前线程的函数调用堆栈的信息, 包括每个函数调用的返回地址和其他相关信息.
这些函数与异常处理机制紧密相关, 通常在实现自定义异常处理或其他与异常相关的功能时使用.
-
_Unwind_GetIPInfo用于获取当前程序执行的位置, 通常指向当前函数中的某一行代码.
-
bfd_find_nearest_line在给定的地址
pc处查找最近的源代码行号信息, 并将结果存储在传入的参数地址中.这些信息包括源代码文件名、包含地址的函数名称以及源代码中的行号.
相关文章:
运行期获得文件名和行号
探索动态日志模块的实现 最初的目标是创建一个通用的日志模块, 它具有基本的日志输出功能并支持重定向. 这样, 如果需要更换日志模块, 可以轻松实现. 最初的构想是通过函数重定向, 即使用 dlsym 来重定向所有函数以实现打印功能. 然而, 这种方法引发了一个问题, 即无法正确获…...
数组操作UNIAPP
字符串转数组 let string "12345,56789" string.split(,) // [12345,56789] 数组转字符串 let array ["123","456"] array.join(",") // "123,456" 数组元素删除 let array [123,456] // 删除起始下标为1࿰…...
MySQL——无法打开MySQL8.0软件安装包或者安装过程中失败,如何解决?
在运行MySQL8.0软件安装包之前,用户需要确保系统中已经安装了.Net Framework相关软件,如果缺少此软件,将不能正常地安装MySQL8.0软件。 解决方案:到这个地址 https://www.microsoft.com/en-us/download/details.aspx?id42642…...
DB2存储过程如何编写和执行
db2执行文件参数: -t 表示语句使用默认的语句终结符——分号; -v 表示使用冗长模式,这样 DB2 会显示每一条正在执行命令的信息; -f 表示其后就是脚本文件; -z表示其后的信息记录文件用于记录屏幕的输出&am…...
SpringBoot + FFmpeg实现一个简单的M3U8切片转码系统
简介 在本文中,我们将使用SpringBoot和FFmpeg来实现一个简单的M3U8切片转码系统。M3U8是一种常用的视频流媒体播放列表格式,而FFmpeg则是一个强大的音视频处理工具。 技术栈 SpringBoot:一个基于Spring框架的快速开发平台。FFmpeg…...
SpringCloud(35):Nacos 服务发现快速入门
本小节,我们将演示如何使用Spring Cloud Alibaba Nacos Discovery为Spring cloud 应用程序与 Nacos 的无缝集成。 通过一些原生的spring cloud注解,我们可以快速来实现Spring cloud微服务的服务发现机制,并使用Nacos Server作为服务发现中心,统一管理所有微服务。 1 Spring…...
OSPF实验:配置与检测全网互通
文章目录 一、实验背景与目的二、实验拓扑三、实验需求四、实验解法1. 配置 IP 地址2. 按照图示分区域配置 OSPF ,实现全网互通3. 检查是否全网互通 摘要: 本篇文章介绍了一个 OSPF(Open Shortest Path First)实验,旨在…...
常见的五种设计模式
https://www.runoob.com/design-pattern/factory-pattern.html 单例模式 **意图:**保证一个类仅有一个实例,并提供一个访问它的全局访问点。 **主要解决:**一个全局使用的类频繁地创建与销毁。 **何时使用:**当您想控制实例数目…...
pandas读取一个 文件夹下所有excel文件
我这边有个需求,是要求汇总一个文件夹所有的excel文件, 其中有.xls和 .xlsx文件,同时还excel文件中的数据可能还不一致,会有表头数据不一样需要一起汇总。 首先先遍历子文件夹并读取Excel文件: 使用os库来遍历包含子文…...
Python网页请求超时如何解决
在进行网络爬虫项目时,我们经常需要发送大量的请求来获取所需的数据。然而,由于网络环境的不稳定性,请求可能会因为超时而失败。请求超时可能导致数据获取不完整,影响爬虫的效率和准确性。此外,频繁的请求超时可能会被…...
虚幻引擎集成web前端<二>:UE4 像素流 与 web 通信
Vue 和 Unreal Engine (UE) 之间的通信可以通过多种方式实现。以下是一些建议的方法: 使用 Websockets:Websockets 是一种在客户端和服务器之间进行双向通信的技术。在 Vue 端,你可以使用一个 Websockets 库(如 socket.io…...
618-基于FMC+的XCVU3P高性能 PCIe 载板 设计原理图
基于FMC的XCVU3P高性能 PCIe 载板 一、板卡概述 板卡主控芯片采用Xilinx UltraScale16 nm VU3P芯片(XCVU3P-2FFVC1517I)。板载 2 组 64bit 的DDR4 SDRAM,支持 IOX16或者 JTAG 口,支持PCIe X 16 ReV3.0以及 FMC 扩展接口。…...
ABB UF C911B108 3BHE037864R010控制主板模块
ABB UF C911B108 3BHE037864R010 控制主板模块通常用于ABB的工业自动化和控制系统中,作为关键组件之一,用于执行控制、监测和通信任务。以下是通常情况下控制主板模块的一些产品功能: 高性能处理器:ABB UF C911B108 3BHE037864R01…...
基于SpringBoot开发的疫情信息管理系统
文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 疫情信息管理系统,java项目。 eclipse和…...
手敲Cocos简易地图编辑器:人生地图是一本不断修改的书,每一次编辑都是为了克服新的阻挡
引言 本系列是《8年主程手把手打造Cocos独立游戏开发框架》,欢迎大家关注分享收藏订阅。 在上一篇文章,笔者给大家讲解了在Cocos独立游戏开发框架中,如何自定义实现Tile地图管理器,成功地在游戏中优化加载一张特大的地图。接下来…...
MySQL——修改数据库和表的字符编码
修改编码: (1)先停止服务 (2)修改my.ini文件 (3)重新启动服务说明: 如果是在修改my.ini之前建的库和表,那么库和表的编码还是原来的Latin1,要么删了重建,要么…...
中国人民大学与加拿大女王大学金融硕士——人生总要逼自己一把
我们每个人都是一个独特而丰富的个体,身上蕴藏着各种潜力和可能性。要不断去开发自己的潜能,不断学习和提升自己的知识和技能,保持对新知识和趋势的敏感。想要在职场上走得更远,就要逼自己一把,在职继续攻读硕士学位是…...
SAP MM学习笔记 - 错误 ME092 - Material mainly procured internally(原则上该物料只能内部调达)
购买依赖,购买发注的时候,会出一些错误或警告,碰到的时候,能解决的话,咱们就记录一下。 比如 Msg 番号 ME092 该品目原则上是内部调达。 如下图,本次出这个错误的原因是,ME51N做购买依赖&…...
【EI会议征稿】2023年智能科学与计算机工程国际学术会议(ISCE 2023)
2023年智能科学与计算机工程国际学术会议(ISCE 2023) 2023 International Conference on Intelligence Scicence andComputer Engineering 2023年11月3-5日 中国-西双版纳 迄今为止,人工智能研究在一些特殊领域取得了一定的实质性进展。然…...
Java多线程编程
目录 1、一个线程的生命周期 2、创建一个进程 2.1 Thread 方法 2.2 通过Runnable接口 2.3 通过继承Thread类本身 2.4 通过Callable和 Future创建进程 2.5 创建线程的三种方式的对比 3、线程的状态 4、线程同步 4.1 同步代码块 4.2 同步方法 5、使用wait和notify 6…...
Qwen-Ranker Pro实操手册:审计日志记录+敏感Query过滤中间件集成
Qwen-Ranker Pro实操手册:审计日志记录敏感Query过滤中间件集成 1. 引言:为什么你的搜索系统需要一个“质检员”? 想象一下这个场景:你搭建了一个智能客服系统,用户问“如何给猫洗澡”,系统却返回了一堆关…...
终极指南:Elasticsearch架构设计原理从倒排索引到分布式搜索的完整解析
终极指南:Elasticsearch架构设计原理从倒排索引到分布式搜索的完整解析 【免费下载链接】awesome-elasticsearch A curated list of the most important and useful resources about elasticsearch: articles, videos, blogs, tips and tricks, use cases. All abou…...
如何永久保存微信聊天记录:WeChatExporter完整解决方案
如何永久保存微信聊天记录:WeChatExporter完整解决方案 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter 你是否曾因手机丢失、系统升级或误操作而丢失珍贵的微…...
Java Stream 中间操作全解析:惰性求值、无状态与有状态操作详解
一、前言 Stream API是Java 8的灵魂特性之一,它彻底改变了集合操作的写法——告别嵌套循环、简化逻辑判断,让代码更简洁、更易读、更高效。 但很多开发者刚接触Stream时,都会陷入一个误区:写了一串中间操作,却发现程序没有任何执行效果。其实核心原因很简单:Stream的中…...
Qwen3.5-35B-A3B-AWQ-4bit图文对话教程:如何利用上下文长度4096做长图分析
Qwen3.5-35B-A3B-AWQ-4bit图文对话教程:如何利用上下文长度4096做长图分析 1. 引言:当AI学会“看图说话” 想象一下,你拿到一张复杂的流程图、一张信息密集的仪表盘截图,或者一张包含大量文字和图表的长图。你不仅想知道图上有什…...
NOJ编程竞赛中的五大常见错误类型及高效调试技巧
1. NOJ编程竞赛错误类型全景解析 第一次参加NOJ在线编程竞赛时,看到满屏的WA、CE、RE、TE错误提示,我整个人都是懵的。直到后来在实战中踩过无数坑,才发现这些错误其实都有规律可循。最常见的五大错误类型就像编程路上的五个拦路虎࿰…...
别再手动开FDTD了!用Matlab这行代码一键启动Lumerical 2022(附完整配置流程)
用Matlab自动化操控Lumerical FDTD的工程实践指南 在光学仿真领域,Lumerical FDTD Solutions是纳米光子器件设计的黄金标准工具,而Matlab则是算法开发和数据分析的利器。传统工作流中,工程师需要在这两个软件间反复切换、手动操作,…...
相场法在水力压裂仿真中越来越火,它能用连续函数描述裂缝边界,比传统方法更适合处理复杂裂缝网络。今天咱们拿COMSOL 6.0开刀,看看四个实战模型的实现门道
相场法水力压裂,共四个模型,comsol6.0版本及以上,附赠参考文献 模型一:对称三簇压裂;模型二:水力裂缝与天然裂缝相交;模型三:单水平裂缝扩展;模型四:水平裂缝…...
all-MiniLM-L6-v2部署教程:Ollama中自定义embedding模型名称与API端点配置
all-MiniLM-L6-v2部署教程:Ollama中自定义embedding模型名称与API端点配置 想在你的本地环境中快速部署一个轻量、高效的文本向量化服务吗?all-MiniLM-L6-v2是一个绝佳的选择。这个模型虽然小巧,但在语义理解任务上表现不俗,特别…...
解锁游戏性能新境界:OptiScaler跨平台升级技术深度指南
解锁游戏性能新境界:OptiScaler跨平台升级技术深度指南 【免费下载链接】OptiScaler DLSS replacement for AMD/Intel/Nvidia cards with multiple upscalers (XeSS/FSR2/DLSS) 项目地址: https://gitcode.com/GitHub_Trending/op/OptiScaler 在游戏图形技术…...
