- 博客(53)
- 收藏
- 关注
原创 目标文件中的强符号和弱符号,强引用与弱引用(肆)
本文讲解了编译链接中的强符号与弱符号、强引用与弱引用的概念及其处理规则。强符号包括已初始化的全局变量和函数定义,弱符号包括未初始化的全局变量和显式声明为weak的属性。链接器遵循三条规则处理符号冲突:禁止多重强定义、优先选择强符号、弱符号选择最大空间类型。通过弱引用特性,可以实现库函数覆盖、功能模块的灵活裁剪等应用,如判断单线程/多线程模式。文中提供了具体代码示例说明这些特性的实际应用。
2025-08-10 14:19:49
440
原创 使用binutils工具解析目标文件符号表(叁)
本文分析了使用binutils工具输出的目标文件符号表信息。通过编译示例C代码并使用objdump命令,展示了Windows系统下符号表的复杂输出格式。重点解析了符号表各列的含义,包括索引、节区索引、标志位、符号类型和存储类别等关键信息。其中详细说明了节区索引的数值含义、标志位的十六进制组合表示方法,以及存储类别的具体分类。文章特别指出工具输出中的ty20与代码定义差异的原因,并提供了完整的存储类别值对照表。最后提醒读者注意工具对十六进制值的简化表示可能导致的解读差异。
2025-08-10 13:26:20
565
原创 使用binutils工具分析目标文件(贰)
本文深入解析了目标文件(ELF格式)的结构组成。主要内容包括:1)目标文件除常见段(.text/.data/.bss)外还包含.rodata、.comment、.debug等多种特殊段;2)目标文件由文件头、段表和多个段组成,文件头包含魔数、平台属性等关键信息;3)段表记录了各段的名称、类型、偏移量等属性,通过Elf32_Shdr结构体定义;4)详细说明了段类型(如SHT_PROGBITS)、标志位(如SHF_WRITE)等关键字段的含义。文章通过Linux和Windows环境下的实例对比,阐述了目标文件的
2025-07-26 15:55:28
998
原创 使用binutils工具分析目标文件(壹)
本篇博客主要是介绍使用binutils工具中的objdump来分析生成的目标文件,也会介绍一些关于不同平台目标文件的知识。
2025-07-13 15:33:37
835
原创 C++调试(肆):WinDBG分析Dump文件汇总
本文介绍了使用WinDBG工具分析Dump文件的基本流程和常用指令。主要内容包括:常用调试指令如.excr、kn、kv、kp等用于查看线程上下文和堆栈信息;分析异常时的关键步骤,如检查异常类型、堆栈信息、模块引用情况等;以及作者总结的实用心得,如使用完全转储文件、反汇编分析等。文章旨在帮助读者掌握WinDBG调试Dump文件的基本方法,建议通过实践来构建完整的调试框架。
2025-06-07 23:00:57
912
原创 C++调试(叁):编译qBreakpad并使用其生成Dump文件
而本小节将是对于生成Dump文件的扩展,主要是讲解多种不同的第三方库生成Dump文件,而本篇博客的重点将是对于qBreakpad进行讲解。编译完成qBreakpad后,我们需要在项目中使用qBreakpad,接下来将讲解如何在Vs中使用qBreakpad第三方库生成项目,后续也会附上博主的项目示例开源链接。:该库依赖于Qt,支持跨平台使用,主要针对的场景是专为 Qt 应用程序设计,简化集成流程,能自动处理 Qt 事件循环与信号。该库由谷歌官方维护,作为Breakpad的现代化第三方库的替代。
2025-05-03 18:07:57
1161
4
原创 C++调试(贰):Dump文件的生成(附Qt示例)
在Windows下,我们可以使用SetUnhandledExceptionFilter函数设置程序的异常回调,并且在激活的函数中使用MiniDumpWriteDump接口函数生成对应的dump文件,以下是生成Dump文件的代码,代码含有注释想清楚了解代码的可以通过注释或者文档查看。每次生成的可执行文件都会产生一个对应的PDB文件。为了方便Qt开发工作者使用代码生成Dump文件,以下是博主调试程序的开源链接,大家可以在GitHub中下载下来进行调试,后续的WinDbg使用也会在这份程序的基础上讲解。
2025-05-02 16:17:41
990
原创 C++调试(壹):初步认识WinDbg和dump文件
在日常开发过程中,我们往往无法完全的对程序的异常进行合适的处理,当我们的程序运行在客户的电脑上崩溃,我们一般会通过日志来分析问题,但是大多数的日志都很难分析定位具体的问题,而WinDbg搭配dump文件调试就是为了解决这一方面的问题。Dump 文件(内存转储文件)是系统或应用程序在崩溃、死锁或主动触发时生成的内存快照,用于记录程序或系统在故障瞬间的状态(如内存、寄存器、线程堆栈等),咱们可以通过调试工具WinDbg分析 Dump 文件,可定位崩溃的根本原因。7.安装完毕,找到WinDbg10.0。
2025-05-01 16:52:18
926
原创 OpenCL(贰):浅析CL内核程序接口函数
紧接文章《OpenCL(壹):了解OpenCL模型到编写第一个CL内核程序》的内容,本篇文章将针对上一篇提到的第一个CL内核程序中的函数接口进行刨析,解释每一个接口文档的作用。当然这或许比不上官方的文档,但是详细的解析有利于后续开发的翻阅,只有做好归纳总结才能为己所用,在开发中遇到的问题也会迎刃而解。附官方文档链接:OpenCL2.1接口OpenCL2.1接口.pdf。
2025-01-06 18:00:33
1178
1
原创 OpenCL(壹):了解OpenCL模型到编写第一个CL内核程序
大多数由程序员编写的代码都是执行在CPU上的,而现代计算机不只提供了CPU还提供了GPU,但是大多数场景往往都不会涉及到使用GPU进行运算,有个别业务如ffmpeg编解码,OpenCV中UMat,VTK中的模型渲染等等则会使用到GPU,但是这些都是第三方编写好的函数进行调用。工作组的空间必须与Kernel程序的工作空间维度相同,整个工作空间可以划分为多个工作组空间,每一个工作组都有对应的工作组空间(这里其实就相当于内存模型中的全局内存内含多个工作组(局部内存),局部内存中又有多个工作节点(私有内存))
2024-12-24 17:30:18
1610
1
原创 C++ High Performance(壹)
本系列的博客将围绕这《C++ High Performance》一书进行简单的记录,因为该书不针对C++的初学者进行编写,涉及的许多内容包含数据结构,CPU和底层源码等,所以该系列博客将不针对基础知识进行讲解,只记录书中存在的许多定义或者容易忽略的细节进行讲解。
2024-11-25 00:12:42
1199
原创 STL源码刨析:关联式容器之map
关于容器map中的元素,其所有元素都是pair,即是一对值。其中pair分为实值(value)和键值(key),在pair中第一个元素被视为键值,第二个元素被视为实值,在map中不允许两个元素拥有相同的键值(容器set只有实值)。在上一篇博客中主要讲解了关联式容器set,其set的主要操作是调用RB-tree的操作函数来实现的,而本篇博客将重点讲解关联式容器map。而在容器set中,迭代器不能修改实值(它并没有键值)以下代码是关于map的操作函数,关于map的许多操作也是调用RB-tree的操作来实现的。
2024-08-20 21:41:42
319
原创 STL源码刨析:关联式容器之set
而关于容器set的底层实现,主要是依靠了RB-tree,所以set的自动排序的效率很高,且对于set容器的操作来说,也只是转调用了RB-tree的操作。在了解了红黑树的思路以及实现源码后,本章将对关联式容器set进行讲解。
2024-08-19 00:51:21
233
原创 STL源码刨析:红黑树(RB-tree)
其中关于插入操作,RB-tree提供了两种插入操作:insert_unique() 和insert_equal(),前者表示插入的节点在红黑树中独一无二,后者表示插入的节点在整棵树中可以重复。在文章《STL源码刨析:树的导览》中,曾简单的对树的结构,二叉搜索树和平衡二叉搜索树进行简单的讲解。由于在对红黑树进行节点插入操作时,每一个插入节点的颜色视为红色,而对于红黑树来说其根节点必须为黑色,故。若插入节点的叔叔节点(父亲节点的兄弟节点)为红色,则将父亲节点,叔叔节点和爷爷节点的颜色反转(
2024-08-09 23:16:07
897
原创 STL源码刨析:树的导览
在了解了什么是平衡二叉搜索树之后,我们将需要认识到在对于一个不平衡的二叉搜索树时,我们需要如何操作使其平衡?而旋转的方式分为两种,一种是单旋转,另一种是双旋转。平衡二叉搜索树是由于二叉搜索树在进行插入或删除操作的时候,导致二叉搜索树的左子树和右子树的层数相差大于1。本章节只是简单的回顾了一下二叉搜索树和平衡二叉搜索树的内容,具体关于关联式容器中的红黑树将单独作为一个小节进行讲解。在简单了解二叉搜索树后,我们还需要对二叉搜索树的节点插入操作和删除操作进行简单的演示。图3.二叉搜索树节点删除操作1。
2024-08-01 22:18:46
562
原创 Qt Object:社区安防系统
系统采用成熟的客户端/服务器架构,保障了应用的稳健运行和未来的扩展潜力。客户端之间的通信通过JSON格式进行,这种格式不仅简洁,而且提高了信息交换的效率。同时,系统利用TCP协议确保数据传输的可靠性和稳定性,为社区安防提供了坚实的技术支撑。1.sql模块:该模块提供了对数据库的访问支持。1.通过QTcpSocket使用TCP协议对客户端与服务端之间的数据进行传输,并且使用JSON格式对传递的数据进行格式化操作。社区安防系统,主要参考市场上主流的安防检测应用开发,例如社区人脸识别,校园出入打卡等。
2024-07-16 20:49:29
594
原创 Qt Creator:C++与Python混合编程
由于作者本人喜欢使用PyCharm进行Python代码的编写,一些环境配置都统一配置到Anaconda环境中,大家可以在Anaconda Prompt窗口执行conda env list指令进行查询环境的路径,如下图,其中Python解释器位于Summary_Library文件夹中。2.选择Python库文件路径后,添加库路径和依赖路径(红框为自定义添加的路径,上方路径是导入Python库后自动添加的路径),其自定义添加的路径就是选择的Pythom库路径下的include文件夹。图3.Python解释器。
2024-07-16 20:23:01
1252
2
原创 Qt Object:智能即时聊天室项目
3.通过QNetWork模块,对其鉴权元素进行处理,对特定的地址进行POST请求,获取Token。5.针对用户作输入操作时,该项目采用正则表达式检测用户异常输出,防止恶意的SQL注入攻击及不规范的输入,减少服务端的恶意请求,降低成本。4.针对列表模块使用了模型/视图架构,针对好友,群聊以及智能聊天机器人分别对其映射,将数据与视图隔离,规范了代码,降低耦合。6.针对用户登录时,项目使用MD5加密算法对其密码等数据进行加密,减少用户被恶意攻击,数据泄漏的几率。
2024-06-22 14:59:48
1165
2
原创 GDB:从零开始入门GDB
在日常开发中,调试是我们必不可少的技能。在GDB调试中,我们会经常遇到循环,为了方便输出循环中的值,我们可以使用print指令输出,但是每一次执行后都执行一遍print指令则会十分麻烦。在调试过程中,我们在代码中也可能会经常使用printf或者cout函数来输出代码中执行的变量信息,这样能实时的观察到变量值的变化,方便我们定位代码的Bug。在关于《MinGW:从入门到链接库》的文章中,曾对如何开启代码调试,关闭调试进行简单的讲解,在对GDB调试工具讲解之前,先简单回顾以下这些内容。
2024-06-15 20:10:45
2282
原创 Python:处理矩阵之NumPy库(下)
本篇文章作为介绍NumPy库的最后一章,其内容包含常用的NumPy函数以及关于ufuns的广播机制。跟本系列的其他文章一样,本篇文章也是对函数的参数进行讲解,提供代码示例。代表接收的数据,数组或字符串;字符串使用","或空格分隔列,使用";传入的data如果是数组,表示根据数组创建对应的副本,默认为True创建副本。字符串使用","或空格分隔列,使用";PS:在分隔不等量的数组时,分隔后的第一个数组占多数,其他按比例分隔。代表分隔方向,默认为1横向,0代表纵向。代表分隔方向,默认为1横向,0代表纵向。
2024-06-12 22:14:14
1110
原创 Makefile:从零开始入门Makefile
在构建项目的时候在哪个目录下执行构建make命令,则这个目录下的makefile文件就会执行,因此在一个项目中可以存在多个makefile文件,分别位于不同的项目目录中。:查看当前规则的目标文件和依赖文件的修改时间,如果目标文件修改时间晚于依赖文件则不执行操作,早于依赖文件则执行步骤3。:当规则中的依赖文件不存在时,则会遍历Makefile文件中的其他规则,寻找能生成当前依赖文件的规则,并执行。:查看Makefile文件的规则中的依赖文件是否存在,存在则执行命令,不存在则执行步骤3。
2024-06-10 09:55:22
1914
原创 Python:处理矩阵之NumPy库(中)
PS:函数onse有着zeros函数一样的特点,可参考zeros函数的总结,主要原因是由于shape代表的是数组尺寸。代表存储多维数组时,是行优先('C')还是列优先('F')。PS:使用shape函数输出维度,一维数组只输出列数,二维数组输出行数和列数,以此类推。代表是否做引用计数检查,如果为False,则不会检查引用计数。代表展平方式,沿横轴还是纵轴,默认为'C'横轴展平,'F'为沿纵轴展平。代表存储多维数组时,是列优先'F'还是行优先'C',默认为行优先。代表数组中的元素的数据类型,默认为None。
2024-06-09 13:25:20
1173
1
原创 Git:从配置到合并冲突
本章将重点讲解Git的使用。Git是是目前世界上最流行的版本控制系统,广泛应用于软件开发中,帮助开发者管理代码的变更历史,支持多人协作开发。了解如何使用Git,如何提交代码,如何解决冲突,能帮助我们更快的上手团队项目Git的下载与初始化配置关于Git的下载可以通过官网进行下载,以下是官网链接:图1.如何下载Git在下载完Git后,我们可点击右键,选择Open Git Bash here打开Git命令窗口图2.打开Git命令窗口。
2024-06-09 12:54:40
1061
原创 Python:处理矩阵之NumPy库(上)
NumPy库是一个开源的Python科学计算库,它提供了高性能的多维数组对象、派生对象(如掩码数组、矩阵)以及用于快速操作数组的各种例程,包括逻辑、形状操作、离散傅立叶变换、基本线性代数、基本统计运算、随机模拟等操作,本系列博客讲重点对NumP库的函数已经操作进行讲解
2024-06-08 23:12:49
1193
1
原创 Linux:动态库和静态库的编译与使用
在《MinGW:从入门到链接库》博客中简单介绍了如何编译动态链接库和静态链接库,本篇博客将详细的对Linux下编译动态链接库和静态链接库以及使用进行讲解,刨析创建库文件的时候Linux做了哪些操作。1..Linux下的动态链接库的命名规则为lib+文件名+.so,所以Linux中以.so结尾的文件,一般可以视为动态链接库的文件。1..Linux下的动态链接库的命名规则为lib+文件名+.a,所以Linux中以.a结尾的文件,一般可以视为静态链接库的文件。动态链接库在程序运行时被加载,而不是在编译时。
2024-06-08 12:35:07
1739
原创 数据结构:顺序栈
顺序栈(Sequential Stack)是一种使用数组来实现的栈数据结构。栈是一种后进先出(Last In First Out, LIFO)的数据结构,只允许在栈顶进行数据的添加(push)和删除(pop)操作。如果栈已满,这可能会触发数组的扩展(如果使用动态数组):移除栈顶的元素,并返回它。:元素只能从栈顶添加或移除,这保证了最后添加的元素将是第一个被移除的。:在栈满时,如果使用动态数组,可以自动扩展数组的大小以容纳更多元素。:顺序栈通常使用一个固定大小或动态大小的数组来存储栈中的元素。
2024-06-07 19:35:03
524
原创 数据结构:顺序串
在顺序串中,字符串被存储在一个连续的内存块中,通常是数组或动态数组(如C++中的。顺序串的主要优点是它提供了一种简单且高效的方式来访问和修改字符串中的字符。:由于字符串存储在数组中,任何字符都可以在常数时间内被访问,即O(1)时间复杂度。:在需要频繁访问和修改字符串的场景下,顺序串提供了一种高效的数据结构。:可以在字符串的任何位置插入字符,但可能需要移动插入点后的所有字符。:可以从字符串中删除任何字符,但可能需要移动删除点后的所有字符。:字符串的所有字符都存储在连续的内存位置,这有助于提高访问速度。
2024-06-07 19:25:12
554
原创 数据结构:哈夫曼树及其哈夫曼编码
哈夫曼树(Huffman Tree)是一种特殊的二叉树,由David A. Huffman在1952年发明的,用于数据压缩领域。它将每个字符映射为一个唯一的二进制串,这些二进制串的长度不同,且是根据字符出现频率来确定的。频率越低的字符,其编码越长。:从根节点开始,向左子树走标记为0,向右子树走标记为1,直到到达叶节点,此时叶节点对应的字符的路径标记就是其哈夫曼编码。2.从队列中取出两个权重最小的节点,创建一个新的内部节点,其权重为这两个节点权重之和。:所有叶节点的权重乘以其到根节点的距离之和是最小的。
2024-06-07 19:11:35
2750
原创 数据结构:线索二叉树
线索二叉树(Threaded Binary Tree)是一种对普通二叉树的扩展,它通过在树的某些空指针上添加线索来实现更高效的遍历操作。线索二叉树的目的是减少查找特定节点(如前驱或后继节点)所需的时间,从而提高树的搜索效率。:每个节点的前驱是其在中序遍历中直接前的一个节点,后继是直接后的节点。线索二叉树允许我们通过线索快速找到这些节点。:在二叉树的空指针(左子树或右子树的指针)上添加线索,这些线索可以指导我们找到节点的前驱或后继。:线索二叉树是基于普通二叉树的,它保留了二叉树的所有性质。
2024-06-07 19:11:00
881
原创 数据结构:共享栈
共享栈(Shared Stack)是一种内存管理技术,通常用于操作系统和编程语言的运行时环境中,以支持多线程或多进程的程序。:在多线程环境中,线程切换时可以更快速地保存和恢复执行状态,因为所有线程都使用同一个栈。:操作系统或运行时环境可以更简单地管理内存,因为它们只需要维护一个共享的栈结构。:共享栈的使用需要考虑到安全性问题,确保一个线程的操作不会破坏其他线程的数据。:共享栈可以减少内存的使用,因为它避免了每个线程或进程都需要自己的栈空间。
2024-06-06 23:13:09
540
原创 数据结构:单链表
/定义函数InitList用于初始化不带头结点的单链表//定义函数CheckList用于查看不带头结点的单链表是否为空//定义函数InitNodeList用于初始化带头结点的单链表//定义函数CheckNodeList用于查看带头结点的单链表是否为空//定义函数CheckOrder用于遍历链表查找结点并判空//定义函数InsertNextNode用于在指定结点进行后插操作//定义函数ListDelete用于按位序删除数据//定义函数NodeDelete用于指定结点删除数据。
2024-06-05 20:03:22
827
原创 数据结构:顺序表
顺序表的实现通常依赖于数组。:在顺序表中插入或删除元素可能需要移动其他元素以维持元素的连续性,这通常会导致较高的时间开销(O(n))。:顺序表通过数组实现,数组中的每个元素都紧密排列在内存中,这意味着可以通过索引快速访问任何元素。:顺序表利用了空间局部性原理,即访问过的元素附近的元素很可能也会被访问,这可以提高缓存利用率。:顺序表可以是静态的,即其大小在创建时就固定,也可以是动态的,即其大小可以根据需要调整。:由于顺序表基于数组,它支持随机访问,即可以在O(1)时间复杂度内访问任何位置的元素。
2024-06-04 19:01:08
589
原创 数据结构:链式队列
链式队列,指的是使用链表实现的队列,是一种常见的数据结构。队列遵循先进先出(FIFO)的原则,即最先进入队列的元素将是最先被移除的元素。链式队列通过链表的动态特性来实现队列的插入和删除操作,提供了比静态数组实现的队列更高的灵活性。: 链式队列需要维护两个指针:队首指针(指向队列的第一个元素)和队尾指针(指向队列的最后一个元素)。: 由于链式队列的元素是动态添加的,因此需要使用动态内存分配来创建新的节点。: 链式队列由一系列节点组成,每个节点通常包含两个部分:数据部分和指向下一个节点的指针
2024-06-03 22:50:30
728
原创 Qt Object:基于TCP协议的视频通话项目
设计思想是为了实现多个用户同时视频的功能,但是没实现服务端,于是把服务端使用的QTcpServer转到客户端实现,写Demo时本人将更多考虑的是提供更强的可扩展性。:该模块提供了音频和视频播放、录制以及处理的基本功能。:该模块提供了一组预构建的多媒体小部件,使得开发者可以快速地在应用程序中添加多媒体播放和控制功能。由于本机只有一个摄像头,就不能开另一边的摄像头了,后续会把Demo的github地址发布在评论区。以下函数为初始化设备的函数,针对Ui文件中控件名称的不同可以修改对应的指针,完成效果。
2024-06-01 17:53:05
2244
11
原创 Linux:Vim的安装及使用
这篇论文主要对Linux下关于Vim文本编译器进行讲解,一步步从具体的Vim下载,使用进行讲解,废话不多说,期待带来更多的优质文章(PS:作者是在Centos下存在,如果使用Ubuntu的同学,可以针对特定情况进行指令的修改哈!但关于Vim的指令基本没有差异)由命令模式进入末行模式只需要在命令模式中输入":"即可,末行模式支持对文件的保存,文本替换,分屏等操作,以下便对末行模式进行讲解。:末行模式中的替换相较于命令模式,区别在于可选中被替换的关键字或者多个行中替换指定的关键词,具体操作如下。
2024-05-30 10:21:32
2805
原创 STL源码刨析:序列式容器之vector
本系列将重点对STL中的容器进行讲解,而在容器的分类中,我们将容器分为序列式容器和关联式容器。本章作为容器的实现源码的讲解,将简单介绍这两种类型的容器的区别,再对每一个类型所含的容器的实现源码进行讲解。
2024-05-26 21:02:29
1181
原创 C++高并发内存池:PageCache层
由上文我们知道,PageCache层不仅要实现对CentralCache层分配内存和对其释放的内存进行管理,我们还需要针对PageCache层设计锁,保证在同一个时间内只有一个来着CentralCache层的哈希桶向PageCache层申请内存,而且我们还需要实现当PageCache层内存不足时,向OS申请内存的接口以及当PageCache层内存多余时,向OS释放内存的接口。PS:以上便是PageCache层的实现代码,重点是思路,提供的代码只作参考作用!大于256KB的内存申请和释放。
2024-05-22 19:58:46
654
1
原创 C++高并发内存池:CentralCache层
且每一个Span用于下标不同,所以指向的分配内存也会不同,当一个Span指向的内存大于一页时,我们还需要定义存储页数的变量,通过这两个变量我们还可以快速定位内存的区间。根据上一小节我们知道,CentralCache层存储的对象是一个一个的哈希桶,而哈希桶内存储的对象是一个类型为Span的双向链表,所以我们也得设计一个类似于ThreadCache的单向链表一样的变量存储这个双向链表,而且这个单向链表的类型还需要具备有进栈,出栈,插入和删除的功能。PS:为方便遍历寻找空闲的地址进行分配,所以设计为双向链表。
2024-05-21 20:44:26
810
1
原创 C++高并发内存池:ThreadCache层
由图可看出,ThreadCache存在一个链表,该链表的每一个元素的指向一个节点(取名为FreeList),该节点存在两个成员类型,一是指向下一个节点的指针,二是指向对应内存大小的指针,故ThreadCache也属于一种哈希桶的结构。为什么哈希桶的大小为208?本篇文章将着重对内存池的ThreadCache层进行讲解,而在了解ThreadCache层之前我会对向内存池申请分配内存以及释放内存的流程进行讲解,直观的感觉到在处理申请和释放内存的请求时内存池的操作,再对其ThreadCache层进行讲解。
2024-05-20 20:39:26
1074
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人