LINUX进程启动时自动挂载调试 对于某些多进程的应用,子进程是有主进程拉起来的。此时,如果相对子进程的启动流程打断点就比较麻烦,如果在子进程启动时调试器自动挂载就完美了。网上找到了gdbhelpers的开源工具库,其对gdb的现有命令做了扩展,其中一个工具是实现预挂载的,原理也比较简单,就是对系统接口加探测回调,然后做进程名称的匹配,若匹中自动调用GDB的attach命令,挂载到该进程。 源码路径如下:GitHub - tromey/gdb-helpers: GDB helper scripts下载解压后,放到某个路径下,最好是跟
VLD内存泄漏检测工具 VLD,检测程序中内存泄漏的工具,检索的相关资料都是说在debug模式下才可以用,针对发布前的版本内存泄漏问题还是想直接做release版本检测更实用。在开源代码的提交记录中找到了相关表述,如下图:网上也找到了使用这个宏的相关代码,引用自:在Release版本下使用VLD_w_419675647的博客-CSDN博客#define VLD_FORCE_ENABLE#include “vld.h”//在程序启动和退出时,分别增加以下函数调用{…VLDGlobalEnable();
Linux编译中的头文件路径大小写校验脚本 跨平台编译中,Windows开发的代码路径大小写不正确并不导致编译出错,但在Linux下编译时文件名是严格区分大小写的所以会出现很多因大小写问题导致的编译错误。所以通过编译前检测所有大小写问题,批量修改可以提升编译的效率。思路上,通过grep工具检出所有的包含,然后逐个做locate校验,如果包含路径书写不规范也会导致存在性校验失败,可以对校验条件稍作修改。完整代码如下:#!/bin/bashworkdir=.modify=0while [ $# -gt 0 ]do case
MacOS下调试信息格式区分 一直没弄明白DWARF和符号文件的区别,恰好在StackOverflow找到了详细的分析。DWARF是调试信息的格式,在开发阶段(未配置生成信息格式为dSYM的情况下)调试信息是在目标文件中的,调试时根据二进制执行文件中的映射表在目标文件中加载调试信息。但产品发布的时候目标文件作为中间会遗失,所以就要把这些调试信息从目标文件中剥离集成为单独的调试文件,即dSYM文件,在生成dSYM文件时会打入可执行文件一致的uuid,每次编译都会有不同的uuid,文件符号的匹配校验也是根据该uuid,所以对于面临发布的产品
Windbg查找单例对象 在程序的达到一定规模之后, 就会用到比较多的管理类,这种管理类多采用单例模式。在问题排查过程中往往需要看下管理类里面的某些状态是否符合预期,但是崩溃的堆栈在当前局部变量中并 无该单例的相关引用。单例的实现上是将一个实例化对象保存在静态变量中,静态变量的生存周期是比较长的,问题的难点在于如何找到该静态变量。可能是我个人对符号有误解,始终认为在可执行文件中检索符号只能检索类似函数名、类名之类的符号,其实静态或全局变量也可以检索的。打破了这个思维定式,查找局部变量只要用Windbg的符号检索命令就可以了。如下
Xcode下Qt程序的源码调试 最近在做Windows下的客户端代码在Mac下编译运行,其中界面是基于Qt开发的,跨平台编译倒是很快搞定了,但是在定位问题时却遇到了写问题。在xcode IDE中基本的打断点、查看堆栈都是有的,但对于一些疑难的问题想跟Qt的源码却费了些功夫。在VS环境下,只要把三方库的源码拖到编辑器中,随便怎么打断点都是能做调试的,同样的方法在Xcode下行不通。其本质原因是在符号文件中记录的源码路径与当前实际的源码路径不一致,调试器按记录的路径去找源码肯定是找不到的。尤其对项目中使用的三方库,鬼知道它在编译是源码是放
bthread分析总结 bthread是brpc中高性能的基础部件,提供了与pthread一致的同步元语实现,如sleep,yeild,wait等。在网络请求中等待对端响应时,线程其实处于空等的状态,通过主动让出执行权给其他线程执行,将付出上下文切换的额外开销。为此,在brpc中引入了更轻量级的“线程”--bthread,bthread的切换是纯用户态的行为,不涉及内核态上下文切换过程,所以性能消耗更小。实现上跟线程池类似,一组线程从任务队列中取任务,但在单个线程的维度,出现空等状态时只能主动放弃执行权,进入挂起...
Drogon中WebSocket部分源码梳理 Drogon虽然是后端的框架,但也能实现网络客户端的相关功能。虽然在类名定义上有明确的Client的字样但对于其中设计思路一直没有梳理清楚,终于在看了几遍之后觉得找对了方向,故做个梳理记录。WebSocketClientImpl是WebSocketClient的接口实现类,由于websockect整个连接过程的发起端在客户端,所以该接口中做了TCPClient连接的创建,并发起TCP连接,借助该连接做了如下处理:组装ws协议升级的http请求,并发送给后端服务;接收服务的响应,做初步解析,若含同意升
Drogon网络库URL转发过程源码解析 Drogon是C++开发的后端服务框架,在看示例代码时,简短的语法一下是真的美,于是打算花点时间学习其中的实现细节。看到request解析到响应的业务处理部分,有个地方处理很是巧妙,跟Qt的信号槽机制神似。请求到后端服务后,首先做HTTP的协议解析,然后根据URL获取访问路径及请求参数,查找匹配的业务处理接口,接口调用拿到响应结果返回给客户端。查找匹配业务接口的过程,库中是这样的处理:1) 定义了一套处理接口的注册机制。a. 指定匹配的URL模式,URL中所有可填充参数的部分都用占位符表示,类似Pyt
Qt跨线程信号槽槽函数无响应(未调用)问题 最近在开发中遇到一个很奇怪的问题 ,槽函数与信号连接后,在代码执行中发出信号,槽函数始终进不去。一开始认为是connect调用传参不对,打了下返回值是true,而且在输出中也没有相关warnning输出。再一看跨线程信号槽调用,所以猜测跟多线程有关。排查过程中各种换信号、改参数都没有效果,偶然间把接收对象的创建移至主线程,槽函数居然执行成功了。本着有问题看手册的原则,在手册中找到了如下的说明:大体意识是说:Qobject对象是有线程归属的,或者说其存活在特定线程中。当接收到队列连接的信或 投递的事件,槽
Ahk获取并解析SVN路径和版本号 自从学了点AutoHotKey,每天都想写点小脚本,偷个懒。尤其是面对每天要点几十次的流程,每次都又要填一堆重复的时候,那内心极度不爽,可又无可奈何。最近有个流程我已经实在不想忍了,BUG结单,要填修改文件的SVN路径、名称和提交的版本号,所以每次都要找文件、右键菜单show log、找到提交记录拷贝url+版本号,然后整段复制到文档,然后复制3部分,粘贴到流程单。所以当时就想能不能配个快捷键,一键搞定。简单研究了下,还真可行:1)拷贝本地文件的绝对路径到粘贴板;2)用SVN提供的CLI工具,获取文件
AutoHotKey整理 AutoHotKey整理vscode环境搭建脚本调试变量赋值及引用快捷键定义春节放假了,终于有时间把最近使用的脚本工具的语法总结一下了,写的有些简略,记录重点,后面翻出来能想起怎么用就好。vscode环境搭建1.安装AutoHotKey的扩展插件,插件安装后,创建.ahk的脚本文件后,在编辑时会有命令的提示;2.创建运行任务,菜单中选择"终端>配置任务",自动生成task.json文...