- 博客(14)
- 问答 (4)
- 收藏
- 关注
原创 gcc/g++
Wextra:开启额外警告(比如-Wunused-parameter)-Wall:开启常见警告(比如-Wunused-variale)-o2:常用优化——生产环境(减少循环次数、改进分支预测等)-o3:高级优化——极限性能(函数内联、向量化等)-o1:基础优化——开发阶段(优化掉无用代码)链接:gcc main.o -o main。-o0:不优化——开发阶段(默认)g++:C++编译器。
2024-12-19 12:00:56
217
原创 GBase8a基于GDB调试之三——保存文档
使用gdb代码调试或attach住正在运行的环境时,特别是当线程栈比较多的情况下,在大量线程栈择出有用线程时,一个个翻页往往会费时费力,这时把线程栈保存成文件的方式就成了便捷的选择(gdb) set logging file name.log(gdb) set logging on(gdb) t a a bt(thread apply all bt)(gdb) set logging off(gdb) quit此时在当前路径下可以打开name.log文件查看所有栈信息,并使用文本方式予以必
2022-05-27 17:16:44
372
原创 GBase8a内存池内存头信息
8a内存池的头部采用一个size_t存储内存信息,占用64位空间(8字节),其中新结构如下typydef struct { size_t nframe : 6; //栈帧数(0~63) size_t nclass : 9; //内存类别 size_t inheap : 1; //内存类别 size_t blktype : 8; //堆类型 size_t size : 40; //内存大小} Memor
2022-05-27 17:15:57
223
原创 GBase8a的errmsg.sys文件解析
errmsg.sys文件并非文本文件,文件开头部分存储的时二进制信息,当因升级导致该文件不匹配时,一般需要拿到匹配文件或生成工具可以解决该类保存,当然也可以手动调整,但需要了解该文件存储结构模型。开头32字节为文件头信息:0~31 FE FE 02 01 01 .. [6, 7] [8, 9] ... 08 00 (ushort)[6, 7] length : err文本信息大小总和 (ushort)[8, 9] count : err信息个数统计count * 2 字...
2022-05-27 17:14:44
298
原创 GBase8a基于GDB调试之二——计算结构体或类的成员变量的偏移地址
基于gdb进行调试或core文件内存分析时,有时需要直接或间接快速定位到某个类或结构体的成员变量的偏移地址,但是无从知道该地址的偏移量。当然可以通过计算该变量在结构体或类中的位置,从头计算地址累加得出结果,但是当类的成员比较多而且嵌套很多其它自定义类成员或结构体成员、指针时,计算量就会大大增加,这时可以借助空指针(0x0地址)进行强转来得到结果:(gdb) p ((gns::SharedConnection*)(0x0))->m_paramCannot access memory at add
2022-05-27 17:13:00
606
原创 gbase8a针对第三方库使用patch编译
在调用第三方开源库或封装库时,一般编译时自动解压库后再加载代码文件。当需要修改第三方库的源码时,往往除了解压库、修改代码、重新压缩外,还要考虑到第三方库本身的版本迭代即维护,因此采用一种打补丁的方式更便于维护项目代码变更以及保持第三方库的独立性,patch补丁则是再编译阶段之前就完成的工作。生成patch文件:$diff -uprN [原始文件或路径] [更新的问价或路径] > xxx.patch$修改第三方库的编译配置文件*.ebuild...src_configure(){
2021-12-28 18:24:30
312
原创 gbase8a使用Pipe管道进行线程间通信的机制
Pipe管道分为读和写读空Pipe时:写端全关闭,read则返回0,即end-of-file; 如果存在写端,且设置了O_NONBLOCK,read返回-1,errno=EAGAIN; 如果存在写端,且为阻塞状态,read则阻塞等待;写管道Pipe读端全关闭,进程将异常终止(SIGPIPE); 读端存在,且为阻塞状态,如果buf满了,则写阻塞知道Pipe buf被读出数据并存在空间,未满则立刻写入数据,并返回写入的字节数; 读端存在,且设置了O_NONBLOCK
2021-12-28 18:21:33
260
原创 gbase 8a基于x86的AT&T格式汇编寻址指令
gbase 8a程序目前大部分是运行于x86架构下linux环境中,汇编语法是基于AT&T格式的,这与Intel汇编格式有一定的区别,最主要体现在三个方面:1. 立即数:立即数前面需要加上$符号,例如,$0x3E,我们使用Imm表示立即数;2. 寄存器:寄存器前面需要加上%符号,例如,%rax,我们使用R[Ea]表示寄存器;3. 寻址模式:源操作数在左,目标操作数在右;其中主要的寻址模式如下寻址名称 格式 操作数值 示例 立即数寻址 $Imm I
2021-11-30 11:35:38
258
原创 gdb自定义脚本
使用gdb调试过程中,对于批量的数据处理和检测,尤其是来自内存的信息时,手动调试需要不停的重复操作:查看地址内容->取地址内容->查看新的地址内容……,当需要做成百上千的重复操作时,这时候,使用gdb的自定义脚本会带来很大的便捷。外部编辑脚本文档:name.gdbdefine my_print if $argc != 2 help my_print else set $list = $arg0 set $span = $ar
2021-08-02 20:09:21
1673
原创 LIRS机制基本原理
LIRS分为两个队列:Stack S :存储LIR块和HIR块(常驻或非常驻内存)List Q :存储所有常驻HIR块如下图所示对LIRS中的数据又三种访问情况:访问一个LIR块X。LIR块的访问会在S中命中,此时需要将改X移动到S的栈顶,如果X最初在栈底,那么移动之后需要做【栈剪枝】操作; 访问一个HIR常驻内存块X。该访问也会被命中,首先将X移动到S栈顶,然后:X在S中,将X状态由HIR修改为LIR,并从Q中移除,将S栈底的LIR块移到Q的尾端,并将状态修改为HIR,S执行【栈剪枝】;
2021-08-02 20:08:45
1844
原创 低版本环境运行高版本生成的ASan程序
Address Sanitizer(ASan)是一个快速的内存错误检测工具。它非常快,只拖慢程序两倍左右(比起Valgrind快多了)。它包括一个编译器instrumentation模块和一个提供malloc()/free()替代项的运行时库。从gcc 4.8开始,AddressSanitizer成为gcc的一部分。当然,要获得更好的体验,最好使用4.9及以上版本,因为gcc 4.8的AddressSanitizer还不完善,最大的缺点是没有符号信息。但是,由于经常限于现有测试环境或生产环境的原因,
2021-06-29 11:20:37
710
原创 数据库底层代码调试分析STL的内存之std::set
我们都知道STL封装的std::set内部的各元素是使用红黑树(RBtree)来管理的,以进行对元素按照默认的或指定的排序方式进行排序。红黑树的原理就不做过多介绍了,本次主要分析一下set元素的内存分布。以下分析基于64位操作系统。typedef struct tagCell{ int id; void *ptr; tagCell() : id(-1) , ptr(NULL) {} }Cell;struct CMP {
2021-06-29 11:16:06
731
空空如也
gbase8a多实例如何手动配置合理的内存池大小
2021-12-28
8a兼容别的数据库的数据吗?比如我想将原本Oracle的数据导入8a的数据库
2021-12-28
GBase 8a MPP远程导出功能都需要注意哪些问题?
2021-12-28
gbase8a加载sftp文件时,协议支持sha246等高级加密吗?
2021-12-28
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅