当前位置: 首页 > news >正文

运行期获得文件名和行号

探索动态日志模块的实现

最初的目标是创建一个通用的日志模块, 它具有基本的日志输出功能并支持重定向. 这样, 如果需要更换日志模块, 可以轻松实现.

最初的构想是通过函数重定向, 即使用 dlsym 来重定向所有函数以实现打印功能.

然而, 这种方法引发了一个问题, 即无法正确获取文件名和行号信息, 同时也受到流式打印问题的影响.

因此, 我开始思考是否有一种方法可以在运行时动态获取文件名和行号信息.

目前, 思路有些混乱导致不太愿意深入研究. 于是将这些思考和学习记录下来, 以备将来深入学习之用.

寻找解决方案

在明确了需要实现的任务后, 我发现了一个 GitHub 项目, 实现了我所需的功能.

以下是我从该项目中获得的知识点, 有助于理解如何在运行时动态获取文件名和行号的机制:

  1. __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 来启用它们.

  2. dladdr(address, info)

    处理地址信息, 并将栈的信息返回给 info(类型为 Dl_info 的结构体), 从而获取函数调用栈的相关信息.

  3. abi::__cxa_demangle(__mangled_name, __output_buffer, __length, __status)

    用于处理文件名信息, 以使其更易读.

  4. BFD(Binary File Descriptor)库和 GNU 二进制工具集

    BFD库的主要目标是提供一个通用的接口, 允许开发者读取、分析、修改和生成各种不同格式的二进制文件

    而无需关心文件格式的细节. 在这里, 它的主要作用是获取函数栈的信息.

    使用之前, 需要执行 bfd_init 函数进行初始化.

  5. bfd_openr(filename, target)

    这个函数用于打开一个二进制文件以进行读取操作, 返回一个 BFD 对象.

  6. bfd_close(abfd)

    用于识别和验证输入的二进制文件的格式是否受支持.

  7. bfd_get_symtab_upper_bound(abfd)

    用于计算符号表的上限大小, 以便在分析二进制文件时为符号表分配足够的内存空间.

  8. bfd_canonicalize_symtab

    用于规范化符号表中的符号, 通常包括去除重复的符号、按名称排序符号等操作.

    规范化符号表可以提高后续符号解析和分析操作的效率, 并确保符号表中的数据是一致和可预测的.

  9. _Unwind_Backtrace(func, argue)

    通常用于获取当前线程的函数调用堆栈的信息, 包括每个函数调用的返回地址和其他相关信息.

    这些函数与异常处理机制紧密相关, 通常在实现自定义异常处理或其他与异常相关的功能时使用.

  10. _Unwind_GetIPInfo

    用于获取当前程序执行的位置, 通常指向当前函数中的某一行代码.

  11. 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&#xff0…...

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&#xf…...

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&#xf…...

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…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...

Unity UGUI Button事件流程

场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...

《Docker》架构

文章目录 架构模式单机架构应用数据分离架构应用服务器集群架构读写分离/主从分离架构冷热分离架构垂直分库架构微服务架构容器编排架构什么是容器&#xff0c;docker&#xff0c;镜像&#xff0c;k8s 架构模式 单机架构 单机架构其实就是应用服务器和单机服务器都部署在同一…...

WEB3全栈开发——面试专业技能点P4数据库

一、mysql2 原生驱动及其连接机制 概念介绍 mysql2 是 Node.js 环境中广泛使用的 MySQL 客户端库&#xff0c;基于 mysql 库改进而来&#xff0c;具有更好的性能、Promise 支持、流式查询、二进制数据处理能力等。 主要特点&#xff1a; 支持 Promise / async-await&#xf…...