
Linux
文章平均质量分 56
lqw198421
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
c++多线程调用python时的 Segmentation fault 问题
问题主程序(C++)加载多个so,so里有python的,也有c++的,并且有的C++的so里会有多个线程;会出现多个线程解析并调用python so的问题;会发现,除了wrapper so(直接解析python so的so)里起的线程,其他线程解析时,就会出现SEGMENT现象;原因说到底就是GIL的问题,有兴趣的同学可以去查一下,再次不赘述(对python了解不多,只是有个基本的了解,不误人子弟了)解决方案参考:Embedding a Python interpreter in a mult原创 2021-08-24 09:30:10 · 1048 阅读 · 0 评论 -
mmap的 Bus error问题及解决
前言新交易系统中,通过mmap来实现持仓和订单的本地持久化,之前未用过mmap,在本次实现中遇到了一些问题,仅记录Bus error问题;实现基本逻辑OM或者PM在启动时,先通过本地的持久化文件来恢复订单或者持仓:如果是当日的第一次的正常启动,那么是没有持久化文件的,这个时候,PM需要从别的地方来获取初始化的持仓(当天还没有开始交易,没有订单,OM不需要做处理);如果不是当天的第一次正常启动,那么是有持久化文件的,OM或者PM就需要从本地的持久化文件来获取订单和持仓,完成初始化;问题持久原创 2021-07-01 08:43:54 · 3634 阅读 · 2 评论 -
python 查看第三方库的api接口
前言今天看到一个python画樱花树的帖子,觉得好玩,想尝试一下,但在import turtle并使用的时候出现了问题:提示没有相关api的定义,所以想查看一下import 的turtle是否正确,又不知道如何查看,搜了一下,看到如下2种办法:python自带的文档查看器直接参看这个连接:python自带库及第三方库api察看由于我是在win10机器上的docker下,所以这个对我来说不行;dirimport 第三方库dir(第三方库)>>> import random原创 2021-06-28 10:54:18 · 1919 阅读 · 0 评论 -
cmake的基本使用
前言公司当前使用的都是cmake,之前没怎么用过,趁着项目间歇期专门学习一下,以此为记;这次是有针对性的学习,所以都是通过各种例子来实现的;cmake具体使用一个cpp文件编译出一个可执行文件文件目录其中build是目录,是为了把cmake编译过程中产生的文件与源文件隔离而建立的,这就是cmake推荐使用的外部构建模式;文件内容main.cpp#include <stdlib.h>#include <stdio.h>int main() { printf(原创 2021-06-25 16:29:14 · 404 阅读 · 1 评论 -
Redis简单使用
简介通过redis来获取客户端指令以及其他不同服务器的其他组件的消息传递;实现client端通过hiredis来通过源码实现connect以及sub:server端启动服务:连接后进入命令行:redis-cli -h 10.1.2.204 -p 6379pub:client响应:...原创 2021-06-02 18:08:53 · 181 阅读 · 0 评论 -
centos 下调用libnanolog.so时的“ undefined reference to `std::thread::_M_start_thread ”错误
背景当前项目中通过 libnanolog.so 来记录log,但是在编译时,出现以下错误:包含如下错误:/workspace/AutoClose/unit_tests/lib/centos/libnanolog.so: undefined reference to `std::thread::_M_start_thread(std::unique_ptr<std::thread::_State, std::default_delete<std::thread::_State> &原创 2021-03-15 11:05:27 · 1810 阅读 · 0 评论 -
gtest与gmock的安装与使用
背景公司的项目采用gtest来进行单元测试(其实之前华为海思也是用gtest,但大厂的好处(或者也可以说坏处- dog head)就是不需要关心这些事情),需要安装gtest;我是在docker下安装的,步骤应该是一样的;步骤源码下载通过git来下载,源码安装:git clone https://github.com/google/googletest编译下载后会在下载命令的目录下生成一个 googletest 的文件夹,进入后,通过cmake来编译,先后输入下面的3个命令并执行:cd原创 2021-03-12 13:36:05 · 2559 阅读 · 0 评论 -
Raw Socket抓包,某些端口的数据包抓不到
背景TCP回包过滤项目,把执行程序部署到实盘上后,发现有一些port(或者说连接)的报文是可以捕获到的,但有一些连接的报文捕获不到,而根据墨菲定律,目标报文没有被捕获到(dog head);定位1、回想整个执行流程,没有发现有问题的地方,并且也加了打印,发现的确是没有捕获到目标port的连接,而不是捕获到了后因为其他条件而被过滤到;2、由于是在实盘环境才能复现该问题,而在本地的docker下复现不了该问题,但实盘调试又要通过乙方来完成,非常麻烦,所以文龙建议通过tcpreplay来复现;折腾了一下,原创 2021-03-04 09:20:53 · 1234 阅读 · 1 评论 -
tcpreplay + tcpdump 联合起来进行回放和监控
背景TCP回包过滤项目里,raw socket捕获不到目标消息对应的port来的数据,需要在本地搭建一下测试环境来复现一下实盘环境;期望:数据从docker A 的网卡,发送到docker B 的网卡;或者如果可以最直接的话,就是某个docker 的网卡直接接收到模拟数据;思路tcpreplay来模拟发送,tcpdump来模拟捕获,先确定能够很好的回复实盘环境;但实际上是不行的:通过这个测试可以说明,tcpreplay模拟的是通过某个网卡向外发送,而不能模拟接收tcpreplay -p 1原创 2021-03-02 21:08:36 · 1187 阅读 · 0 评论 -
Linux下的md5的实现
背景当前项目中基于raw socket实现了tcp包的过滤,其中的过滤条件是我司的产品编号,为了防止甲方爸爸随意乱用我们的产品,所以需要对配置文件里的产品编号进行加密,简单起见,使用md5来进行加密;md5sum使用linux下使用md5非常简单:md5sum filename即可:[root@09de35f53b68 exch_rsp_filter_1]# md5sum MD5.cpp cde2e31dc14220ce250f3ebb906f8d18 MD5.cpp关于linux下md5原创 2021-03-01 16:25:07 · 648 阅读 · 0 评论 -
linux下cmake3的使用及问题解决
使用cmake3而不是cmake1、如果想使用cmake,也是可以的,需要在环境变量里设置2、具体使用,是先修改自己写的CMakeLists里的内容(比如说添加新的cpp文件),如果CMakeLists写得好的话,会自动包含的,其实也很简单;工程中c和cpp混杂如果CMakeLists没有特别说明,那么基于CMakeLists生成的makefile会针对c和cpp分别编译,导致生成的函数符号命名不同,最终导致找不到函数定义的错误:简单起见,把所有的c文件修改为cpp文件,即可解决此问题——当然,原创 2021-03-01 16:07:30 · 1536 阅读 · 1 评论 -
Linux redis 使用记录
背景新的期货交易系统,需要用redis来做持久化;需要调研一下它的多机热备的功能,调研它的哨兵模式;安装、配置及使用重点参考:Redis详解(九)------ 哨兵(Sentinel)模式详解redis主从+哨兵搭建问题及解决redis-cli: command not foundredis-cli: command not found解决:将redis-cli拷贝到/usr/local/bin/下,让redis-cli指令可以在任意目录下直接使用:sudo cp src/redis-原创 2021-02-25 10:55:29 · 182 阅读 · 0 评论 -
CentOS docker下解决man的 command not found 和 No manual entry for xxx的问题
背景一开始的问题:man: command not found安装后的问题:No manual entry for read in section 2解决先后执行如下命令:1、yum install man2、yum install -y man-pages3、vi /etc/yum.conf隐藏/etc/yum.conf文件中的tsflags=nodocs一行:4、rpm -qa | xargs yum reinstall -y参考linux - man 提示:-bash: m原创 2021-02-25 09:00:13 · 542 阅读 · 0 评论 -
Linux下C++里可用的轻量级lock的性能比较
背景介绍当前工作中,有一个场景,有一个碰撞几率较低的变量的读写操作,为了保证操作安全性,需要对这个变量的读写操作加上锁;为了选择一个性能较好的lock,文龙做了以下测试;lock介绍参赛选手:cpp: atomic_flaggcc: __sync_bool_compare_and_swapspi: pthread_spinlock_tnone:空操作,baseline具体的测试用例见下面的测试代码测试代码#include <iostream>#i原创 2021-02-23 20:11:44 · 726 阅读 · 0 评论 -
inet_ntoa 踩坑记录(同一语句内调用2次或多次inet_ntoa,结果会被覆盖)
背景目前手头上在做的项目是上期所的TCP回包过滤项目,需要通过Raw Socket把目标节点上所有的TCP链接接收到的数据截获后识别出我司的信息,然后通过建立的UDP链接把我司信息转发到UDP Server上;在转发的时候,除了原来的TCP应用层的报文外,还需要添加TCP链接的信息:tcp_src_ip, tcp_dst_ip, tcp_src_port, tcp_dst_port;当前整个功能已经实现,但是在测试功能的时候出现了意外问题及源码在UDP Server端,接收到消息后解析然后打印来查原创 2021-02-19 16:33:22 · 963 阅读 · 0 评论 -
linux下libpcap的安装和简单使用
背景当前的项目需求是通过raw socket来获取当前物理机上指定条件(ip和端口)的包。方法1:抓取所有的包,在用户态的recvfrom(or recv)后,再通过代码逻辑来进行过滤;方法2:通过设置,在底层实现过滤;从效率上来说,毫无疑问是方法2更好;方法2的实现,依赖libpcap和BPF;在此先简单介绍一下libpcap的安装和使用;安装参考链接:linux下安装libpcap需要先安装:1、安装GCC:yum -y install gcc-c++(由于我当前的环境docker原创 2021-01-27 20:14:18 · 8009 阅读 · 1 评论 -
C++对象内存模型初探
前言周末看资料的时候,看到虚继承和虚函数(两者完全不是一码事,正在写一个简单的总结),进一步看到C++的类对象的内存模型,网上已有很多文章,自己也记录一下。简单模式研究问题从简单入手,一步步深入。我们先来看一个最简单的模式;class A{public:int a;};用测试程序可以发现,A的对象的大小是4字节,也就是a(int类型)的大小;继承:class E :public A { public: int e; };此时E的对原创 2020-11-16 23:34:29 · 153 阅读 · 0 评论 -
来自Google的TCP BBR拥塞控制算法解析(转载)
大佬原链接:https://blog.youkuaiyun.com/dog250/article/details/52830576写本文的初衷一部分来自于工作,更多的来自于发现国内几乎还没有中文版的关于TCP bbr算法的文章,我想抢个沙发。本文写于2016/10/15! 本文的写作方式可能稍有不同,之前很多关于OpenVPN,Netfilter,IP路由,TCP的文章中,我都是先罗列了问题,然后阐述如何解决这个问题。但是本文不同!本文的内容来自于我十分厌恶的一个领域,其中又牵扯到我...转载 2020-09-09 18:02:46 · 1423 阅读 · 0 评论 -
TCP协议疑难杂症全景解析(转载)
前言:查阅资料时发现了大佬的博客,转载以供以后学习,原链接:https://blog.youkuaiyun.com/dog250/article/details/6612496说明:1).本文以TCP的发展历程解析容易引起混淆,误会的方方面面2).本文不会贴大量的源码,大多数是以文字形式描述,我相信文字看起来是要比代码更轻松的3).针对对象:对TCP已经有了全面了解的人。因为本文不会解析TCP头里面的每一个字段或者3次握手的细节,也不会解释慢启动和快速重传的定义4).除了《TCP/IP详解》.转载 2020-09-09 17:59:47 · 367 阅读 · 0 评论 -
Linux系统调用(syscall)原理(转载)
转载链接:http://gityuan.com/2016/05/21/syscall/ 引言:分析Android源码的过程中,要想从上至下完全明白一行代码,往往涉及app、framework、native一直到kernel,可能迷失到代码世界,明白了系统调用原理,或许能帮你峰回路转,找到进入kernel函数的入口。本文主要讲解ARM架构相关源码:/bionic/libc/kernel/uapi/asm-arm/asm/unistd.h/bionic/libc/arch-arm转载 2020-09-09 15:49:01 · 1762 阅读 · 0 评论 -
异常、调试、ptrace的过程和原理
前言从今年上半年开始,一直在利用ptrace做plt hook的一些工作。在此之前,对ptrace并没有什么了解。在工作开始后,为了能尽快出成果,也只是快速的翻了一下ptrace的相关接口函数,然后根据查阅到的资料,在较短时间内达成了项目目标。对其中的原理,并未做深入研究。今天看了一些资料,做个简单总结,以此为记。异常什么是异常异常是异常控制流的一种形式,一部分由硬件实现,一部分由操作系统实现;它是控制流中的突变,用来相应处理其状态中的某些变化;——《深入理解计算机系统》可以用下图来简单表示:原创 2020-09-09 15:11:05 · 790 阅读 · 0 评论 -
内核栈回溯原理学习应用(转载,针对arm)
转载链接:https://www.cnblogs.com/mysky007/p/12539754.html前言:在网上看到这篇文章,作者写这个应该是很用心的,所涉及的技术相对比较偏门,研究或者学习这方面的人应该很少,不过正好跟我现在在做的一些东西是相关的,因此转发。不过,换做是我,如果想解决这个问题的话,我还是会用plt hook来实现,当前已经做出来的成功已经可以分析出 double free的问题了。问题:一台客户现场机器,运行一周左右偶然发生一次应用段错误或者double free问题,c转载 2020-09-09 10:37:45 · 1704 阅读 · 0 评论 -
一个由进程内存布局异常引起的问题(转载)
转载链接:https://www.cnblogs.com/catch/p/6370859.html前段时间业务反映某类服务器上更新了 bash 之后,ssh 连上去偶发登陆失败,客户端吐出错误信息如下所示:图 - 0该版本 bash 为部门这边所定制,但是实现上与原生版并没有不同,那么这些错误从哪里来?是 bash 的锅吗从上面的错误信息可以猜测,异常是 bash 在启动过程中分配内存失败所导致,看起来像是某些情况下该进程错误地进行了大量内存分配,最后导致内存不足,要确认这个事情比较简单,动态转载 2020-09-08 18:00:31 · 185 阅读 · 0 评论 -
linux下的进程间通信方式总结
原链接https://mp.weixin.qq.com/s/SA0gjKHQL_6iMZBhBOZDEw学习笔记所谓的管道,就是内核里面的一串缓存创建的子进程会复制父进程的文件描述符对于匿名管道,它的通信范围是存在父子关系的进程 —— 生命周期随进程 匿名管道只存在内存中,不在文件系统中;无格式的流,大小受限,单向对于命名管道,它可以在不相关的进程间也能相互通信效率低下消息队列是保存在内核中的消息链表 —— 生命周期随内核(系统)一是通信不及时,二是附件也有大小限制,三是消息队列通信过程原创 2020-08-26 16:13:11 · 249 阅读 · 0 评论 -
python中的转义字符
背景介绍当前项目中,需要把监测到的数据,从监测端发送到服务器端,并且在服务器端上画图显示出来。为减少开发工作量,在服务器上的开发是用python来实现的(检测端用的是c和c++),然后在服务器上的解析上遇到了一些问题;具体问题由于用python解析c/c++发来的数据解析有问题——原来设计的是监测端(c/c++)发送的数据是 unsigned long long;但是在python段解析时出现了问题,哪怕是用python 自带的struct进行解析也是不对的——不知道是我使用的问题不——因为不值得在这原创 2020-08-06 10:46:56 · 564 阅读 · 0 评论 -
单线程目标进程注入一个多线程的动态库(so)失败
简介当前项目中,需要查看C++的目标进程的内存分配情况,最直接的方式就是跟踪new/delete的使用情况;通过查看libstd++的源码发现,new的底层调用的还是malloc(有的版本可能不是,需要注意,c++的标准里没有强制要求new的底层一定要通过malloc来实现);因此就对libstd++.so里的malloc进行hook【这里需要注意:不能对全局的malloc进行hook,而要对libstd++.so里的malloc进行hook】;具体实现当前考虑的方案是通过ptrace对目标进程进行a原创 2020-07-28 22:06:31 · 519 阅读 · 0 评论 -
有的程序不允许非root的ptrace attach
今天查资料时看到的,记录一下:https://kb.kutu66.com/c++/post_10192094某些应用程序使用 prctl() 来特别禁止 PTRACE_ATTACH ( 比如 。 在 Yama 中实现的更通用的解决方案是只允许从父进程直接向子进程( 例如 ) 发送 ptrace 。 直接 gdb 和 strace 仍然有效,或者作为 root 用户( 例如 ) 。 gdb BIN PID,strace -p PID 仍然可以作为 root 工作。 当本地应用程序危险时,攻击者无法附加到它转载 2020-07-24 16:55:35 · 1132 阅读 · 0 评论 -
一个由进程内存布局异常引起的问题(转载)
参考链接:https://www.cnblogs.com/catch/p/6370859.html一句话表达:32位进程启动一个64位的程序作为其中一个线程时,在fork阶段,认为自己是32位线程而进行相应的内存的申请和处理,导致出错——个人理解如此,不知道是否有错——这篇文章的坑较深!...转载 2020-07-20 15:15:14 · 138 阅读 · 0 评论 -
符号(全局or静态变量或者函数)的GLOBAL或者LOCAL的差别
前言还是前面所说的项目:公司项目有个比较偏门的需求,需要在java进程里找到并修改libjvm.so里定义的一个类的static + private的成员变量,但是通过代码一直没有找到该变量的符号和地址。之前的测试已经完成,但是在c++的demo里,可以找到 static + private 的变量的符号和地址,问题到底在哪呢?分析没啥其他方法,先通过nm来查看一下变量在对应的so里到底是什么性质的.libjvm.so里的变量:0000000000e27d00 b _ZN14AttachLis原创 2020-07-17 15:09:22 · 2459 阅读 · 0 评论 -
C语言字符串操作总结大全(超详细)【转载】
1)字符串操作strcpy(p, p1) 复制字符串strncpy(p, p1, n) 复制指定长度字符串strcat(p, p1) 附加字符串strncat(p, p1, n) 附加指定长度字符串strlen(p) 取字符串长度strcmp(p, p1) 比较字符串strcasecmp忽略大小写比较字符串strncmp(p, p1, n) 比较指定长度字符串strchr(p, c) 在字符串中查找指定字符strrchr(p, c) 在字符串中反向查找strstr(p, p1) 查找字转载 2020-07-16 19:51:15 · 3615 阅读 · 0 评论 -
g++链接so时,找不到类的static成员变量
前言公司项目有个比较偏门的需求,需要在java进程里找到并修改libjvm.so里定义的一个类的static + private的成员变量,但是一直没有找到该变量的符号和地址。因此想通过c的程序来验证一下,确定是不是libjvm.so的问题,于是自己写了一个简单的demo,没想到折腾了2个小时,以此为记;代码so相关代码代码很简单,so的代码分为b.h和b.cpp;b.h:#ifndef B_H_#define B_H_class BClass{ private: static i原创 2020-07-16 17:20:28 · 1059 阅读 · 1 评论 -
g++编译so里调用外部so
背景要给甲方爸爸A演示一下公司的产品,但是我们公司的产品,最终都是要跟爸爸们的产品结合在一起的,等于说要把甲方爸爸的代码抽出来编译成一个so,供我们的产品的java代码来调用——这本来是个很常见的场景——但是问题在于,甲方爸爸的这些代码,是在它的另一个乙方儿子上的so的基础上完成的,那么场景就变成了如下:之前没有自己搞过这样的逻辑,趁此机会,尝试一下,以此为记;尝试PS:因为自己一直做的是C(也会有C++)的开发,所以当前的demo演示里,我们来调用甲方爸爸的so时,用C的程序来代替Java的程序原创 2020-07-07 16:29:10 · 4336 阅读 · 0 评论 -
linux下 c程序崩溃时产生core文件的设置
前言C程序运行崩溃时,如果能够自动产生core文件,会对问题的分析和定位有一定的帮助,但是需要一定的设置才可以开启该选项;core文件产生如果程序本身有问题,在崩溃时,可能会产生core文件——注意:不是一定会产生的;产生的core文件默认是在执行文件的目录下,但也可以指定,参考目录:修改/etc/security/limits.conf(root)在文件最后添加了两行:ulimit -c unlimitedcore文件生成目录坑:注意:这里需要自己mkdir corefile目录原创 2020-07-06 14:13:20 · 885 阅读 · 0 评论 -
通过libunwind来解析调用栈
简介当前工作中有一部分工作需要解析出目标函数的调用栈以便进行进一步的分析,经过调研之后,发现libunwind较为符合要求,所以采用调用libunwind的接口来实现调用栈解析的功能,以此为记;具体操作1.下载libunwind我下载的是1.4版本,下载链接:http://download-mirror.savannah.gnu.org/releases/libunwind/找到自己所需要的目标版本即可2.编译这里面由于我有特别的需求——在我生成的so里调用libunwind的接口——所以我原创 2020-07-01 14:44:06 · 8811 阅读 · 0 评论 -
如何理解BSS段不占用可执行文件的磁盘空间
如何理解BSS段不占用可执行文件的磁盘空间由来什么是BSS,BSS的内容不占用磁盘由来今天在看一篇问题排查的文章时,文章里提到,由于作者和同事的编译环境的不同,导致两人用相同的源码编译出来的版本的BSS段不同(全局变量的存放的顺序不同),从而导致出现bug的情况;好奇之下,查了一下BSS段的资料,以此为记。主要参考链接:https://www.jianshu.com/p/52c7445af23a什么是BSS,BSS的内容BSS(Block Started by Symbol)通常是指用来存放程序原创 2020-06-29 11:32:39 · 1277 阅读 · 1 评论 -
malloc申请内存一定会引起进程Heap的Rss变化吗?
前言linux的开发人员,大概都知道可以通过 cat /proc/pid/smaps 来查看进程的memory占用情况,以确定线程占用memory是否过大:可以看到每个大的字段都有size、Rss、Pss等不同的小的字段,它们可以各自理解为:size:该字段所占用的虚拟内存大小Rss/Pss:该字段所占用的物理内存大小;两者的区别在于,举例来说,libc-2.17.so被进程A和进程B都加载了,但实际上,这种共享的so所占用的物理内存是一份,而不是占用2份,那么假设libc-2.17.s原创 2020-05-19 19:54:36 · 1438 阅读 · 0 评论 -
dlopen_mode load so失败的可能原因
今天测试一个用例,其实不能说是测试,因为前面都已经完成了,只是需要支持一些新的功能,所以需要在当前版本上进行相应的修改然后测试。简单来说,还是plt hook的实现,只不过前一段时间针对的都是java编写的目标程序,现在针对的是c编写的目标程序(c编写的目标程序的功能早就验证过了)。本来以为是一个很轻松的事情,结果添加新功能的代码后,凉凉,根本找不到注入的函数,不应该啊,因为c编写的目标程序应该是最没有问题的。通过查看线程的maps信息,发现so注入都没有成功,再通过log查看,调用dlopen_mod原创 2020-05-11 21:42:35 · 1401 阅读 · 0 评论 -
安卓手机硬件信息修改 Device ID Changer 2020
目前在做linux下java程序的指定so的指定函数的hook,功能已经完成并经过了初步测试,开发过程中发现了一些例子是在安卓系统下的一些hook的开源工具,比如大名鼎鼎的xpose,原谅我才知道有这么厉害的工具,然后搜到了硬件信息修改的工具,就是现在要介绍的Device ID Changer 2020 ,还是挺方便使用的,推荐刷机用户使用,可以用来随便更改手机的硬件信息,避过检测,你懂我说的意...原创 2020-04-21 17:55:20 · 13253 阅读 · 1 评论 -
记录一次问题调试过程 -- ptrace + libunwind + malloc hook
整体方案参考自:https://xz.aliyun.com/t/6883#reply-14067当前任务是监控malloc等应用层面的调用,获取其输入参数、返回值、调用栈等情况,之前已经完成了参数和返回值的测试;本周主要研究调用栈的获取;之前测试过通过libunwind来解析调用栈,结果是有时候注入成功,有时候注入失败,与之对比的是不用libunwind时,连续测试超过100次均成功;...原创 2020-04-07 13:55:17 · 1470 阅读 · 0 评论 -
X64 汇编入门
目录前言64位和32位汇编的差异示例说明前言公司项目需要实现通过汇编来获取调用栈的功能,自己写了一个,直接崩溃,回头学习一下,以此为记;64位和32位汇编的差异这方面我现在涉及的不多,就不展开了,大家可以自己去查一下资料,或者直接参考一下下面的链接:https://blog.youkuaiyun.com/qq_29343201/article/details/512787...原创 2020-03-31 14:07:26 · 2526 阅读 · 0 评论