- 博客(46)
- 资源 (4)
- 收藏
- 关注
原创 LINUX进程启动时自动挂载调试
对于某些多进程的应用,子进程是有主进程拉起来的。此时,如果相对子进程的启动流程打断点就比较麻烦,如果在子进程启动时调试器自动挂载就完美了。网上找到了gdbhelpers的开源工具库,其对gdb的现有命令做了扩展,其中一个工具是实现预挂载的,原理也比较简单,就是对系统接口加探测回调,然后做进程名称的匹配,若匹中自动调用GDB的attach命令,挂载到该进程。 源码路径如下:GitHub - tromey/gdb-helpers: GDB helper scripts下载解压后,放到某个路径下,最好是跟
2021-12-15 20:23:50 1264
原创 VLD内存泄漏检测工具
VLD,检测程序中内存泄漏的工具,检索的相关资料都是说在debug模式下才可以用,针对发布前的版本内存泄漏问题还是想直接做release版本检测更实用。在开源代码的提交记录中找到了相关表述,如下图:网上也找到了使用这个宏的相关代码,引用自:在Release版本下使用VLD_w_419675647的博客-CSDN博客#define VLD_FORCE_ENABLE#include “vld.h”//在程序启动和退出时,分别增加以下函数调用{…VLDGlobalEnable();
2021-12-09 13:46:05 363
原创 Linux编译中的头文件路径大小写校验脚本
跨平台编译中,Windows开发的代码路径大小写不正确并不导致编译出错,但在Linux下编译时文件名是严格区分大小写的所以会出现很多因大小写问题导致的编译错误。所以通过编译前检测所有大小写问题,批量修改可以提升编译的效率。思路上,通过grep工具检出所有的包含,然后逐个做locate校验,如果包含路径书写不规范也会导致存在性校验失败,可以对校验条件稍作修改。完整代码如下:#!/bin/bashworkdir=.modify=0while [ $# -gt 0 ]do case
2021-12-07 10:42:19 1117
原创 MacOS下调试信息格式区分
一直没弄明白DWARF和符号文件的区别,恰好在StackOverflow找到了详细的分析。DWARF是调试信息的格式,在开发阶段(未配置生成信息格式为dSYM的情况下)调试信息是在目标文件中的,调试时根据二进制执行文件中的映射表在目标文件中加载调试信息。但产品发布的时候目标文件作为中间会遗失,所以就要把这些调试信息从目标文件中剥离集成为单独的调试文件,即dSYM文件,在生成dSYM文件时会打入可执行文件一致的uuid,每次编译都会有不同的uuid,文件符号的匹配校验也是根据该uuid,所以对于面临发布的产品
2021-11-17 11:34:18 252
原创 Windbg查找单例对象
在程序的达到一定规模之后, 就会用到比较多的管理类,这种管理类多采用单例模式。在问题排查过程中往往需要看下管理类里面的某些状态是否符合预期,但是崩溃的堆栈在当前局部变量中并 无该单例的相关引用。单例的实现上是将一个实例化对象保存在静态变量中,静态变量的生存周期是比较长的,问题的难点在于如何找到该静态变量。可能是我个人对符号有误解,始终认为在可执行文件中检索符号只能检索类似函数名、类名之类的符号,其实静态或全局变量也可以检索的。打破了这个思维定式,查找局部变量只要用Windbg的符号检索命令就可以了。如下
2021-11-10 09:49:29 287
原创 Xcode下Qt程序的源码调试
最近在做Windows下的客户端代码在Mac下编译运行,其中界面是基于Qt开发的,跨平台编译倒是很快搞定了,但是在定位问题时却遇到了写问题。在xcode IDE中基本的打断点、查看堆栈都是有的,但对于一些疑难的问题想跟Qt的源码却费了些功夫。在VS环境下,只要把三方库的源码拖到编辑器中,随便怎么打断点都是能做调试的,同样的方法在Xcode下行不通。其本质原因是在符号文件中记录的源码路径与当前实际的源码路径不一致,调试器按记录的路径去找源码肯定是找不到的。尤其对项目中使用的三方库,鬼知道它在编译是源码是放
2021-10-16 10:55:25 1352
原创 bthread分析总结
bthread是brpc中高性能的基础部件,提供了与pthread一致的同步元语实现,如sleep,yeild,wait等。在网络请求中等待对端响应时,线程其实处于空等的状态,通过主动让出执行权给其他线程执行,将付出上下文切换的额外开销。为此,在brpc中引入了更轻量级的“线程”--bthread,bthread的切换是纯用户态的行为,不涉及内核态上下文切换过程,所以性能消耗更小。实现上跟线程池类似,一组线程从任务队列中取任务,但在单个线程的维度,出现空等状态时只能主动放弃执行权,进入挂起...
2021-09-04 16:41:24 853
原创 Drogon中WebSocket部分源码梳理
Drogon虽然是后端的框架,但也能实现网络客户端的相关功能。虽然在类名定义上有明确的Client的字样但对于其中设计思路一直没有梳理清楚,终于在看了几遍之后觉得找对了方向,故做个梳理记录。WebSocketClientImpl是WebSocketClient的接口实现类,由于websockect整个连接过程的发起端在客户端,所以该接口中做了TCPClient连接的创建,并发起TCP连接,借助该连接做了如下处理:组装ws协议升级的http请求,并发送给后端服务;接收服务的响应,做初步解析,若含同意升
2021-05-16 11:19:02 672
原创 Drogon网络库URL转发过程源码解析
Drogon是C++开发的后端服务框架,在看示例代码时,简短的语法一下是真的美,于是打算花点时间学习其中的实现细节。看到request解析到响应的业务处理部分,有个地方处理很是巧妙,跟Qt的信号槽机制神似。请求到后端服务后,首先做HTTP的协议解析,然后根据URL获取访问路径及请求参数,查找匹配的业务处理接口,接口调用拿到响应结果返回给客户端。查找匹配业务接口的过程,库中是这样的处理:1) 定义了一套处理接口的注册机制。a. 指定匹配的URL模式,URL中所有可填充参数的部分都用占位符表示,类似Pyt
2021-05-15 20:56:36 1462 3
原创 Qt跨线程信号槽槽函数无响应(未调用)问题
最近在开发中遇到一个很奇怪的问题 ,槽函数与信号连接后,在代码执行中发出信号,槽函数始终进不去。一开始认为是connect调用传参不对,打了下返回值是true,而且在输出中也没有相关warnning输出。再一看跨线程信号槽调用,所以猜测跟多线程有关。排查过程中各种换信号、改参数都没有效果,偶然间把接收对象的创建移至主线程,槽函数居然执行成功了。本着有问题看手册的原则,在手册中找到了如下的说明:大体意识是说:Qobject对象是有线程归属的,或者说其存活在特定线程中。当接收到队列连接的信或 投递的事件,槽
2020-08-07 09:33:17 18837 9
原创 Ahk获取并解析SVN路径和版本号
自从学了点AutoHotKey,每天都想写点小脚本,偷个懒。尤其是面对每天要点几十次的流程,每次都又要填一堆重复的时候,那内心极度不爽,可又无可奈何。最近有个流程我已经实在不想忍了,BUG结单,要填修改文件的SVN路径、名称和提交的版本号,所以每次都要找文件、右键菜单show log、找到提交记录拷贝url+版本号,然后整段复制到文档,然后复制3部分,粘贴到流程单。所以当时就想能不能配个快捷键,一键搞定。简单研究了下,还真可行:1)拷贝本地文件的绝对路径到粘贴板;2)用SVN提供的CLI工具,获取文件
2020-08-01 20:46:53 705
原创 AutoHotKey整理
AutoHotKey整理vscode环境搭建脚本调试变量赋值及引用快捷键定义春节放假了,终于有时间把最近使用的脚本工具的语法总结一下了,写的有些简略,记录重点,后面翻出来能想起怎么用就好。vscode环境搭建1.安装AutoHotKey的扩展插件,插件安装后,创建.ahk的脚本文件后,在编辑时会有命令的提示;2.创建运行任务,菜单中选择"终端>配置任务",自动生成task.json文...
2020-08-01 20:10:09 825
原创 Template 2nd阅读摘要(1)
延迟推导Cont中的模板形参可以是不完整类型,因为其内部成员elems为指针类型。template<typename T>class Cont {private:T* elems;public:…};但是一旦加了foo()成员函数:template<typename T>class Cont {private:T* elems;public:…typename std::conditional<std::is_move_constructi.
2020-07-19 18:28:08 196
原创 functional源码分析
function类的实现中涉及到的类:_Func_base最顶层的基础模板类,定义了函数对象在可调用对象保存时的内存管理纯虚接口,如Copy、Move等。同时定义了函数调用的虚接口_Do_call。这些纯虚接口要求在子类中实现。同时在_Func_base的声明中template<class _Rx, class... _Types> class _Func_base {...}保存了其关联函数指针的类型信息,返回值类型Rx,各入参类型列表_Types,这些模板形参在模板类的实
2020-07-04 13:11:13 518
原创 一次搞懂KMP算法
最近又复习了下KMP算法,有些东西长久不用还是会忘。百度了很多,终于找到了一篇思路比较清晰,讲解中能突出重点的帖子:https://blog.csdn.net/f1033774377/article/details/82556438总结一下,算法中的几个重点,以作备忘。其中的F数组即next数组:F数组:数组索引对应模式字符串的索引,元素值“0到索引值位置”子串的最长前缀结束字符的索引位置。如模式字符串“abacd”,F(2)=0,即0~2这部分子串,其最长前缀的结束字符位置为0,也就是子串"a",
2020-07-03 09:20:04 222
原创 红黑树代码(QMap)解读
最近结合下面的文章研究了下红黑树理论:https://blog.csdn.net/zzy520comzzy/article/details/92688831同时,结合理论读懂了qmap的实现源码,补充代码的注释,做个备忘。/** 红黑树的规则:* 1. 所有节点非黑即白;* 2. 根节点为黑色节点;* 3. 红色节点的子节点只能为黑色节点;* 4. 从任一节点到各叶节点的黑色节点数相同;* 5. 每个叶子节点是黑色;* 推论:1) 黑色节点若存在父节点,则其一定有兄弟节点,否则违背规则
2020-06-23 14:02:53 1034
原创 模板设计和推导
看到QT的源码,梳理下模板函数的问题分解和设计思路。模板与函数的对应关系 template<typename T> //入参:一个多个,模板形参所允许的类型 struct SomeFunc // 函数名称:对应声明的类名 { static const int value = some_value; //返回值:通过该函数调用获得的类型或数值结果; usin...
2020-04-04 21:50:28 168
原创 chromium中logging源码阅读记录
Qt源码阅读中偶然间看到webegine引用了chromium的源码,应该说webengigne的实现是基于chromium源码做了一层封装。看了下为通用的base库log的实现,做一下记录。chromium的日志记录的实现比较简单,可配置性比较,不像log4xx各种复杂的配置及文件和文件拆分等。从源码实现上,可以看出其日志记录的特性:当前进程仅支持一个日志日志文件,默认名称为debug.l...
2020-03-08 21:03:33 665
原创 Boost中is_incrementable实现细节推敲
is_incrementable.hpp代码阅读中的template实现细节推敲, 如代码注释:namespace boost { namespace detail {// is_incrementable<T> metafunction//// Requires: Given x of type T&, if the expression ++x is well-fo...
2020-03-08 17:14:16 254
原创 Win10安装推荐链接
Win10安装推荐链接笔记本安装更新直接蓝屏了,很是无语,百度了下重装系统的教程,有一篇还是比较靠谱的:https://baijiahao.baidu.com/s?id=1647543353897829351&wfr=spider&for=pc里面有个MSDN下载操作系统镜像的链接还真是好用,下载很快。附个msdn的链接: https://msdn.itellyou.cn...
2020-01-12 10:02:15 229
原创 JS模块备忘
节省时间,贴一下代码,重点记录JS模块的使用方法:// 立即执行函数,隔离作用域;var testModule = (function(){ var counter = 0; // 作用域内部私有变量,仅作用域内可访问 return { incrementCounter : function(){ return ++count...
2019-09-01 08:12:42 97
转载 模板中void类型强转
最近在看pprint的源码,其中有段void类型强转的用法觉得见过,具体作用又记不起了,所以google了一下,记一下搜索的结果,以做备忘。源码如下: template<class Ch, class Tr, class Tuple, std::size_t... Is> void print_tuple(std::basic_ostream<Ch,Tr>&...
2019-05-25 18:19:38 1165
原创 auto和decltype类型推导
1. auto关键字推导auto关键字的推导与木板参数推导规则一致。两个可以做简单类比,如template<typename T> void f(T);f(1)auto a = 1 //该处类型推导过程与f中形参类型的推导规则一致,引用类型可类比参考Modern C++中的描述,类型推导过程可以分为三类:非引用类型非引用类型推导时,右侧赋值参数或表达式的引用...
2019-05-25 17:38:30 419
原创 带授权的友元访问限制
最近看了一篇博文,文中作者对于访问控制的一个点感觉讲的很对。问题场景如下:对于某些创建过程较为复杂的类,我们通常借助于工厂方法创建、获取对象,以封装复杂的创建过程。所以在技术实现上需要将待创建类型的构造函数定义为私有,并将工厂类定义为该待创建类型的友元。class Secret1{ // 将工厂类生命为友元 friend class SecretFactory;private: ...
2019-05-03 19:40:04 254
原创 QML动画按钮实现
Qml对于动画的支持的确很强大,网上找了开源代码拿来研究了一下,借用了其中的图片素材,改造了其中个人感觉实现效果上不是很理想的点。代码及关键注释如下:import QtQuick 2.0import QtQuick.Controls 1.0Item { property int frame_width: 95 property int frame_height:95 ...
2019-05-03 19:08:46 1643
原创 QML学习
Qt 5.12调试需要设置platform插件库的包含路径,否则会导致报错。在Application初始化前设置库包含路径,如:QApplication::addLibraryPath("D:/Qt/5.12.2/msvc2017_64/plugins");qml控件的展示需要用到Qt Quick中定义的控件,但需要设置导入控件路径, 以用于qml中的文件导入。若不设置,在运行时报错“mod...
2019-05-03 13:44:22 1107
原创 类型擦除
借助基类指针调用虚接口的方式,即多态,可以实现业务层仅感知到基础类型及接口定义,而执行子类对象实现的效果。但对于非同一继承层次内的类型,接口调用则只能通过针对每个类型定义适配类的方式来实现,但每增一个子类都要有新增适配类,则会导致类数量的膨胀。而模板更能适配这类场景。#include &amp;amp;amp;amp;lt;string&amp;amp;amp;amp;gt;#include &amp;amp;amp;amp;lt;memory&a
2018-12-11 12:39:09 400
原创 对类模板特化和函数模板重载的一点理解
类模板的类型列表具有类定义作用域内的“黏性”,即可在模板类的版本定义中访问的类型实参 ,通常是跟类的功能实现有紧密关联的类型。如果某个成员函数的实现,仅有当前的类型实参不够,则可将该成员函数定义未函数模板,扩展需要的传参类型。 不够有两两层含义:a. 类型实参的量不够;b. 模板函数的传参需要转化。模板类和模板函数的差别:a. 模板类以来类型列表可做相关函数及成员的定义,具备定义的成员函...
2018-12-11 10:35:48 776
原创 std::function与回调类
std::function是c++11中提供的Callable类,所以本篇文章中整理了function的使用方式,及以function为基础封装回调类。 1. function的使用#include &amp;amp;amp;lt;iostream&amp;amp;amp;gt;#include &amp;amp;amp;lt;string&amp;amp;amp;gt;#include &amp;amp;amp;lt
2018-09-09 17:51:04 2251 1
原创 C++线程池实现
最近读了muduo的源码,看了一下其中线程的是实现。其中互斥量、条件变量都是库里面自己封装的,正好现在C++标准库里面有对应的类,所以就改造了一下,补充了部分注释。同时总结了一下条件变量和锁的使用。代码如下: ThreadPool.h#pragma once#include &amp;amp;amp;lt;deque&amp;amp;amp;gt;#include &amp;amp;amp;lt;vector&amp;amp;amp
2018-09-09 09:53:22 3114 2
原创 VS调试技巧
VS调试中经常使用断点、堆栈窗口,很少使用监视、快速监视窗口和即时命令窗口。查找了相关资料后发现监视窗口在某些情况下还是很有用的,所以针对上述窗口大体总结了一下; 1.添加监视变量 程序执行过程中命中断点后, a. 在变量名称位置单击右键,”添加监视”; b. 将变量选中,拖动 到监视窗口; c. 在监视列表中双击,编辑要监视的变量名称; 2. 监视中查看、修改变量当前值 a. 若监...
2018-08-25 17:10:08 10586
原创 Windbg常用命令总结
Windbg常用命令总结查看线程中的堆栈信息 a. ~打印出所有的线程信息 b. !teb命令查看线程控制块中的信息,如StatckBase: 01820000 c. dps 01820000则可以看到线程运行的StackTrace 或者使用如下命令: dds 0096a000 00970000 ; stackbase:0096a000 stacklimit:00970000 ...
2018-08-12 10:56:43 1128
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人