山东省建设工程造价管理协会网站/百度一下1688

山东省建设工程造价管理协会网站,百度一下1688,网站建设的发展历史与新方向,做免费网站推广开头语概述 c/c如果在日志中查看某个结构体/类的每个变量名,变量值信息,只能通过printf逐个格式化,非常繁琐,如何做到类似protobuff转json的序列化功能呢?该dll库先通过分析pdb文件获取结构体/类的变量名称、变量地址&#…

概述

c/c++如果在日志中查看某个结构体/类的每个变量名,变量值信息,只能通过printf逐个格式化,非常繁琐,如何做到类似protobuff转json的序列化功能呢?该dll库先通过分析pdb文件获取结构体/类的变量名称、变量地址,并序列化成完整json字符串,极大降低了开发者工作量。

详细

概述

通过pdb文件查找指定结构体的变量命名和变量地址,将指定的结构体变量内容序列话为json格式。

实现原理

com组件查找pdb文件

使用visual studio 编译后的c/c++工程在输出目录都会输出xxx.pdb文件,该pdb文件中包含了工程中类型的符号文件,在软件调试过程中非常重要。pdb文件格式的解析依赖com组件msdia120.dll,在成功注册msdia120.dll组件后,通过提供的方法对pdb文件进行解析:

    HRESULT hr = ::CoInitialize(NULL);{CComPtr<IDiaDataSource> pDiaDataSource;CComPtr<IDiaSession> pDiaSession;CComPtr<IDiaSymbol> pGlobalSymbol;CComBSTR bstrFilename = pdb_path;if (LoadDataFromPdb(bstrFilename, pDiaDataSource, pDiaSession, pGlobalSymbol)) {LoadAllUDTs(pGlobalSymbol);//解析所有数据类型,保存在全局变量g_map_udt中LoadAllEnums(pGlobalSymbol);ret = 1;}}::CoUninitialize();

对变量进行序列化

    #define TCDUMP(ref_var)            \tcDump(typeid(ref_var).name(), &(ref_var))

通过输入变量地址,通过关键字typeid获取变量类型,按照不同的变量类型进行不同方式的处理,比如已内置变量类型为列

    if (dump_as_builtin(type, ptr, root)) {return true;}
    bool dump_inv_as_builtin(const std::string& type, void* ptr, const Json::Value& root) {static const char* buildin_signed[] = {"char","wchar_t","signed char","int","short","long","__int8","__int16","__int32","__int64",};static const char* buildin_unsigned[] = {"unsigned char","unsigned short","unsigned int","unsigned long","unsigned __int8","unsigned __int16","unsigned __int32","unsigned __int64"};if (type == "bool") {*(bool*)ptr = root.asBool();return true;}if (type == "float") {*(float*)ptr = root.asFloat();return true;}if (type == "double") {*(double*)ptr = root.asDouble();return true;}for (auto t : buildin_signed) {if (type == t) {switch (type_size(type)){case 1:*(int8_t*)ptr = root.asInt();return true;case 2:*(int16_t*)ptr = root.asInt();return true;case 4:*(int32_t*)ptr = root.asInt();return true;case 8:*(int64_t*)ptr = root.asInt64();return true;default:return false;}}}for (auto t : buildin_unsigned) {if (type == t) {switch (type_size(type)){case 1:*(uint8_t*)ptr = root.asUInt();return true;case 2:*(uint16_t*)ptr = root.asUInt();return true;case 4:*(uint32_t*)ptr = root.asUInt();return true;case 8:*(uint64_t*)ptr = root.asUInt64();return true;default:return false;}}}return false;}

demo效果:

在release下执行tcdumpTest.exe 看效果

注意:使用前先看‘使用说明.txt’,需要先注册\DIA SDK\bin\msdia120.dll。

定义类、结构体:
    Class Ctest{Public:Int M_i = 1;Float M_f = 0.1;Double M_d = 0.2;Char M_c = 'a';Std::String M_str = "Hello World";Std::Vector<Int> M_v;Std::Map<Int, Std::String> M_map;};
赋值:
    Ctest Test;Test.M_v.Push_back(1);Test.M_v.Push_back(2);Test.M_v.Push_back(3);Test.M_map.Insert({ 1,"hello" });test.m_map.insert({ 2,"world" });
初始化tcDump,并序列化对象
    int ret = TCDUMP_INIT(R"(..\tcDumpTest.pdb)");if (ret == 0) {std::cout << "load pdb failed !!!" << std::endl;return 0;}// 打印 test 变量内容,已json格式输出auto retJson = TCDUMP(test);if (NULL == retJson) {return false;}std::cout << retJson << std::endl;
序列化结果retJson输出

结果输出

附加接口

能够通过已知结构体大小返回大小一致的结构体名称

 
  1. // 打印pdb中大小为 n的类和结构体名称
  2. std::cout << tcDump_GetSizeClass(sizeof(CTest)) << std::endl;
  3. 输出:---{ CTest }---

工程目录

-tcdump
-tcdumpTest

tcdump为dll工程,核心代码实现。
tcpdumpTest为测试工程。

注意点:

1、本工程基于windows,不支持linux
2、本工程默认支持vs2019,其他版本可以自行编译。
3、使用vs2019编译时,会提示map _Node 错误,只需把xtree文件中对应的 _Node 从protected修改为public,并重新编译即可
4、使用前先看‘使用说明.txt’,需要先注册\DIA SDK\bin\msdia120.dll。

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

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

相关文章

Linux内核 6.6版本将遏制NVIDIA驱动的不正当行为

Linux 内核开发团队日前宣布&#xff0c;即将发布的 Linux 6.6 版本将增强内核模块机制&#xff0c;以更好地防御 NVIDIA 闭源驱动的不正当行为。 Linux 内核开发团队日前宣布&#xff0c;即将发布的 Linux 6.6 版本将增强内核模块机制&#xff0c;以更好地防御 NVIDIA 闭源驱…

Golang反射相关知识总结

1. Golang反射概述 Go语言的反射&#xff08;reflection&#xff09;是指在运行时动态地获取类型信息和操作对象的能力。在Go语言中&#xff0c;每个值都是一个接口类型&#xff0c;这个接口类型包含了这个值的类型信息和值的数据&#xff0c;因此&#xff0c;通过反射&#x…

win11 Windows hello录入指纹失败解决方法

刚换了xps&#xff0c;启用了administrator账号&#xff0c;win11专业版&#xff0c;发现使用Windows hello录入指纹时&#xff0c;只要一录指纹就立即出错 尝试卸载重装设备驱动--无效 把Windows update更新到最新--无效 最后查到&#xff0c;是Windows对administrator账户进…

【React】React入门

目录 一、何为React二、React与传统MVC的关系三、React的特性1、声明式编程①、实现标记地图 2、高效灵活3、组件式开发(Component)①、函数式组件②、类组件&#xff08;有状态组件&#xff09;③、一个组件该有的特点 4、单向式响应的数据流 四、虚拟DOM1、传统DOM更新①、举…

three3D的vite+vue版本基础代码

自己稍微处理一下目录结构 <script setup>// 导入three.js import * as THREE from three// 创建场景 const scene new THREE.Scene();// 创建相机 const camera new THREE.PerspectiveCamera(45, //视角window.innerWidth / window.innerHeight, //宽高比0.1, // 近平…

Android开源 日志框架 LogDog V2.3.1

目录 一、简介 二、下载使用 添加jitpack 仓库 添加依赖: 三、更改 1、 LogDogV2.3.1初始化: 2、通过上面的初始化 &#xff0c;已经知道IJsonEngine 优化了泛型参数&#xff0c;采用 Object/Any 3、优化空异常的判断&#xff0c;哪怕打印变量是NULL LogDog会打印“nul…

05-Flask-Flask查询路由方式

Flask查询路由方式 前言命令行方式代码实现返回所有路由 前言 本篇来学习下Flask中查询路由的方式 命令行方式 # window 用set linux 用 export set FLASK_APPtest_6_flask运行发方式# 打印所有路由 flask routes代码实现返回所有路由 # -*- coding: utf-8 -*- # Time …

ElementPlus·面包屑导航实现

面包屑导航 使用vue3中的UI框架elementPlus的 <el-breadcrumb> 实现面包屑导航 <template><!-- 面包屑 --><div class"bread-container" ><el-breadcrumb separator">"><el-breadcrumb-item :to"{ path:/ }&quo…

[vue问题]开发中问题集合

“TypeError: Cannot read property ‘Request’ of undefined” 这是测试文件的报错&#xff0c;最后发现是因为项目启动的时候就报错了&#xff0c;是其它错误导致的&#xff0c;所以测试文件才会提示这种错误&#xff0c;当启动报错修复后&#xff0c;该问题没有了 热加载…

java创建excel文件和解析excel文件

创建excel文件 package com.bjpowernode.crm.poi;import org.apache.poi.hssf.usermodel.*; import org.apache.poi.ss.usermodel.HorizontalAlignment;import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.…

网络基础-应用层协议-HTTP/HTTPS

HTTP/HTTPS HTTP基本概念协议格式请求报文请求方法请求资源地址协议版本 应答报文 常见Header常见状态码与状态描述Cookie&Sessionhttp协议特点 HTTPS基本概念对称加密与非对称加密数据摘要&数据指纹HTTPS工作过程探究只采用对称加密只采用非对称加密双方都采用非对称加…

office mac苹果办公软件安装包安装教程详解

软件下载 软件&#xff1a;mac office版本&#xff1a;2021语言&#xff1a;简体中文大小&#xff1a;4.27G安装环境&#xff1a;mac硬件要求&#xff1a;CPU2.0GHz 内存4G(或更高&#xff09;下载通道 百度网盘 https://pan.baidu.com/s/1WGSB-icELUxweFkI8iIbzA 首先&#…

CocosCreator3.8研究笔记(十九)CocosCreator UI组件(三)

前面的文章已经介绍了Layout 组件 、ScrollView 组件 、PageView 组件 。 想了解的朋友&#xff0c;请查看 CocosCreator3.8研究笔记&#xff08;十八&#xff09;CocosCreator UI组件&#xff08;二&#xff09;。 今天我们主要介绍CocosCreator 常用组件&#xff1a;Butt…

【AIGC】Stable Diffusion Prompt 每日一练0915

一、前言 1.1 写在前面 本文是一个系列&#xff0c;有点类似随笔&#xff0c;每天一次更新&#xff0c;重点就Stable Diffusion Prompt进行专项训练&#xff0c;本文是第一篇《Stable Diffusion Prompt 每日一练0915》。 1.2 项目背景 stable diffusion提示词(prompt)是用于…

第 113 场 LeetCode 双周赛题解

A 使数组成为递增数组的最少右移次数 数据范围小直接模拟… class Solution { public:int minimumRightShifts(vector<int> &nums) {for (int op 0; op < nums.size(); op) {if (is_sorted(nums.begin(), nums.end()))//nums是否已经有序return op;rotate(nums.b…

Hive参数与性能调优-V2.0

Hive作为大数据平台举足轻重的框架&#xff0c;以其稳定性和简单易用性也成为当前构建企业级数据仓库时使用最多的框架之一。 但是如果我们只局限于会使用Hive&#xff0c;而不考虑性能问题&#xff0c;就难搭建出一个完美的数仓&#xff0c;所以Hive性能调优是我们大数据从业…

开源库源码分析:OkHttp源码分析(二)

开源库源码分析&#xff1a;OkHttp源码分析&#xff08;二&#xff09; 导言 上一篇文章中我们已经分析到了OkHttp对于网络请求采取了责任链模式&#xff0c;所谓责任链模式就是有多个对象都有机会处理请求&#xff0c;从而避免请求发送者和接收者之间的紧密耦合关系。这篇文章…

基于SSM+Vue的汽车售票网站的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用Vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

Java————栈

一 、栈 Stack继承了Vector&#xff0c;Vector和ArrayList类似&#xff0c;都是动态的顺序表&#xff0c;不同的是Vector是线程安全的。 是一种特殊的线性表&#xff0c; 其只允许在固定的一端进行插入和删除元素操作。 进行数据插入和删除操作的一端称为栈顶&#xff0c;另…

【数据结构】ArrayList和顺序表

文章目录 1.线性表2.顺序表2.1 接口的实现 3. ArrayList简介4. ArrayList使用4.1 ArrayList的构造4.2 ArrayList常见操作4.3 ArrayList的遍历4.4 ArrayList的扩容机制 5. ArrayList的具体使用5.1 简单的洗牌算法5.2 杨辉三角 6. ArrayList的问题及思考 1.线性表 线性表&#x…