自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(83)
  • 资源 (2)
  • 收藏
  • 关注

原创 Android性能优化(native内存泄漏分析方法)

malloc_debug有一个缺点,它只有在进程退出时,才回检测没有释放的内存,然后把每内存的申请调用栈打印,所以如果是类似常驻服务的进程,malloc_debug基本没用(第三步我们会介绍一种修改malloc_debug的方法,支持常驻服务的内存泄漏检测)。我们先看一下针对进程正常退出,我们怎么去查看。针对native的内存泄漏,我们经常谈到的有2中方法valgrind和malloc_debug,由于Arm不支持asan的memory leak特性,所以android使用asan是无法检测处内存泄漏的。

2025-01-06 09:58:06 380

原创 Android性能优化(native进程启动优化)

这些是需要link的库,我们可以手动cat一下这些库,确保他们都在文件缓存中,然后再启动,确认是否速度提升,如果提升,推论成立。主函数基本就是打印一句log,但是运行时卡了很久(为了演示方便,我只加了一个头文件,实际情况比这个复杂,可能是各种头文件加载)。我们这样就找到了需要全局变量初始化函数位置,按照这个方法找到所有函数,然后打印log,这样我们就能知道具体是哪个初始化慢了。add x8,x8,#240,就是x8再机上240,那相对地址就是0x10F0。blr x8,跳转到x8,就是跳转到0x10F0。

2025-01-03 13:15:43 239

原创 如何优雅的写C++代码(简单函数反射实现二)

所有的反射函数都会自动生成一个基于__reflect_base__的反射函数类(最后存放在__reflect_methods__中),这个基类主要对外提供一个execution的函数(类似java反射的invoke),将可变参数转换成tuple,传递给子类(具体的反射函数类)。此外,如果是指用if判断,编译时是不会做判断的,导致可能出现函数类型不匹配等问题(模板会将同一种情况在if和非if的分支里都编译,结果就出错了),这里用了C++17的一个新语法特性(if constexpr),要求编译时就进行计算。

2024-12-26 11:15:24 268

原创 如何优雅的写C++代码(简单函数反射实现一)

和之前申明成员变量反射类似的宏DECLARE_REFLECT_METHOD,testReflect_1是类目,后面可以添加需要反射的函数。应该算是比较简单的申明了。execute函数对应的就是执行被反射的函数。getMethodField函数根据函数名字来找到需要反射的函数。模板中指定返回数据类型,get方法会强转。用起来还是比较方便的。

2024-12-23 13:48:01 227

原创 如何优雅的写C++代码( stack-use-after-scope问题)

stack-use-after-scope貌似是说用栈超出生命周期的意思。我们看一下这个代码到底出了什么问题。*号出代码主要是调用了 一个i,然后转string。由于是多线程,所以可能出现这个循环跑完,线程都还没有跑起来,这个时候由于i的生命周期只在for循环内有效,所以当线程启动的时候,i已经没有了。这里直接把i作为参数直接传入lambda函数中。

2024-07-11 15:47:13 561

原创 rust学习(字节数组转string)

哈哈,字符串长度竟然是32..按照我们以前写C语言的习惯,字节数据从第二位开始都是0,照理应该算是终结符,所以字符串长度应该是1啊。所以大家转换的时候一定要留意这个问题。哈哈,猜猜最后结果如何?

2024-06-05 16:29:01 596

原创 如何优雅的写C++代码(fsanitize导致无法coredump)

为了方便调试内存问题,在编译配置里面加入了-fsanitize=address,如果出现内存问题,的确很方便就能根据trace来判断问题。但是我发现有个很诡异的现象,出现crash的时候,coredump没了。最后发现是有asan的环境变量配置导致,使用下面的命令重新配置后coredump正常使用。

2024-05-16 18:53:47 246

原创 如何优雅的写C++代码(实例创建接口重构)

那就会自动生成一个createFile的函数,这个时候,如果你有其他文件也定义了createFile,那可能会出现冲突...而且,createXXX是通过一个宏进行拼接而成的,所以可能有时候改写类名的时候不容易一下子都改全(ide无法联想到)。可以看到,这样的表达就很清晰,MyData::new()是要生成一个MyData的实例。之前使用createXXX函数主要原因是Obotcha默认所有的实例都是sp(智能指针)的,为了减少创建时候的步骤(不用create的创建方法见下面),所以用了这个方法。

2024-05-13 09:53:16 247

原创 rust学习(openssl rsa加解密文件)

2.注意public_decrypt返回的数字是实际解密后的数据长度,例如你传入解密的数据是256字节(正好是rsa key的长度),那你解密后的数据长度(如果padding是PCKS1)就是256-11 = 245.使用也很方便,但是有一点注意public_encrypt这个函数每次返回的加密长度都是256.(我的key生成的时候是2048=256*4)1.解密的原理和加密类似,也是逐个block解密,每个block的长度就是rsa key的长度,这个比加密时候计算方便。上述代码使用公钥加密数据。

2024-05-09 18:47:16 558

原创 rust学习(BorrowMut异常)

一个cell貌似不能同时被借用两次,注意!所以如果出现这类错,也要考虑是否有多线程的问题。但是如果一直拿着borrow_mut的句柄,就会报错。不要长期持有borrow_mut的句柄。

2024-04-17 18:42:50 526

原创 rust学习(recursive mutex 实现)

哈哈,网上查了一下,很多人都说recursive lock是垃圾代码,要修复。鉴于个人能力,很多这样的代码我都改不掉,所以我用Rust实现了一个recursive的锁。4.如果锁的owner不是当前线程,则调用这个m_cond等待。当锁释放的时候,如果计数为0,唤醒m_cond等待的线程。2.锁的owner,每次拿到锁以后记录拿锁线程,防止其他线程调用unlock释放。6.如果当前计数为0,表明锁都已经释放,直接唤醒所有等待锁的队列。1.获取锁计数,如果计数到0的话,唤醒其他等待线程去拿锁。

2024-04-09 16:43:21 521

原创 rust学习(tokio中tcp_stream调用的问题)

我们涉及了一个socket连接的类,每次收到数据以后,我们都会把tokio::net::TcpStream对应的tcp_stream传递给其他线程。2.由于线程1一直在等数据,所以线程2只能在这里2处卡住。1.stream直接move给TarNetStream。2.回调函数中采用了Arc智能指针。1.没有数据,这里卡死。

2024-04-08 15:29:12 612

原创 rust学习(简单handler实现)

1.message处理的时候调用了ProcessMessage,这里主要考虑到使用的方便(不要再用什么unwrap),所以传出去的数据重新构造了一个新数据,性能上会有损耗。每次有新消息加入的时候,重新针对消息队列排序,然后cond.notify一下,唤醒等待线程。2.target是一个回调实现,每个message都需要带有target,这样message就能由指定的handler处理了。1.消息队列头,为了减少option,这里规定了第一个消息一直不使用,所有消息从head的next开始排队。

2024-03-20 16:24:56 481

原创 rust学习(简单链表)

我们发现,try_borrow_mut貌似只有refcell实现了,所以这个接口返回的是我们需要的值RefMut<>,但是注意一下,由于try_borrow_mut返回的是result,所以我们还需要unwrap一下。一个是BorrowMut,一个是RefCell的。目前我就遇到一个比较神奇的问题:使用borrow_mut之后,无法找到成员变量..仔细对比了2个borrow_mut函数,你会发现,我去,完全是2个接口~编写一个简单链表,主要遇到的问题就是next指针(按照C的写法)的数据如何定义。

2024-03-14 19:07:37 662 1

原创 rust学习(手动写一个线程池)

1.创建一个Condition,用智能指针控制,这样计算和等待的线程都能使用。3.cond:用来等待计算完成的condition,和Task结构体中的cond是同一个,这样task完成后就能唤醒等待了。1.results:用来存放结果,其中u32是一个future的id,T表示存放的数据。1.id:这个future的id,通过这个id可以在map中找到结果。2.将task存放到任务队列,计算线程就是从这个队列中获取任务的。只有一个get函数,如果有数据,就返回该数据,否则就等待唤醒。

2024-03-07 10:10:26 653

原创 rust学习(模拟Future)

4.MTask::future:存储了future的信息,用了智能指针,主要是等待线程需要持有一份,处理线程也需要持有一份,2个线程是通过future里面的cond来唤醒。3.生成一个future,这里i32::getDefault()获取默认数据,模板玩的不溜,这里直接写死了。原理比较简单,从future中获取数据元,如果元组第一个为true,则表明计算完成,直接返回数据,否则就调用condvar来等待。2.创建一个lambda函数,这里简单写了一个直接返回i32的函数,实际场景可能会是比较负责的函数。

2024-03-06 13:20:02 593

原创 rust学习(tokio future分析)

貌似调用block_on之后会回调一次future的poll,如果这个时候还没有计算出结果,那就直接卡死了,所以需要找个地方能唤醒。关键是在poll返回pending的时候,获取waker。1.当调用block_on的时候,会直接调用一次future的poll确认是否运算结束。所以我们现在要加一个标志位来表示运算结束,这样block_on应该就能正常走下去了吧。2.当调用waker.wake的时候貌似还会调用一次poll确认是否运算结束。自己编写一个impl future来看一下Tokio的是如何实现的。

2024-03-05 15:09:14 644

原创 rust学习(tokio协程分析二)

之前用过C语言的libco,它的原理是通过注册了libc的大部分posix的io操作函数,然后通过epoll来实现异步io来实现。例如读取socket的数据,如果没有数据,由于是异步io,所以直接切换到下一个调用栈。哈哈,可以看到,线程最后启动了一个和之前毫无关系的协程代码,里面只是一个sleep(注意!这个是tokio的sleep),这个sleep的作用就是满足线程有一个协程切换的入口点。根据代码1的情况,我们考虑是否可以保持线程不退出(如代码2),这样是否可以执行到协程(doSayHi)呢?

2024-03-01 19:29:54 770

原创 rust学习(tokio协程分析一)

从blocking队列中获取数据,注意这个blocking队列使用了mutex和condvar,所以当condvar卡住的时候,实际上是整个线程直接卡住,由于协程只是在线程中来回切换调用栈,所以协程中所有的等待处理实际上都是切换调用栈,但是这个condvar不是切换调用栈,所以就会卡住。这样实际上协程的runtime会创建线程,让协程跑在这些线程上,如上述代码,我们通过worker_threads创建了一个线程,所有的协程都会跑在这个线程上。doAsyncPrint一直没有被调用。

2024-02-29 14:17:11 974

原创 我和我的同事们(二)

我去,有人和我抢江边的座位/我先点菜了,你们慢慢来...”,每隔几分钟,D就更新一下进展,感觉比我们当年bringup时候汇报的还勤快。D是真得能说,在遇到他之前,我完全没有想到过一个理工科男生会有这么好的文学底蕴。聊着聊着,我仿佛感觉D还是我当年遇到的那个样子,一个28岁的男生,干活疯疯火火,各种事情都能和你聊。第二天九点多,还在吃早饭,D已经发来消息,他已经开始排队抢位置了。额~~,在吃这块,D的行动力的确无与伦比。于是我不得不开始加快我的步伐,快点吃完早饭,快点出们,快点去火锅店,快点去见D~~。

2024-01-21 22:29:24 409

原创 Android性能优化(bin启动优化)

android 性能优化

2023-07-10 22:31:30 275

原创 如何优雅的写C++代码 Obotcha介绍(构建自己的Handler)

用过android的同学,一定会对Handler很熟悉,使用起来也特别方便。自己看Handler的代码,你会发现其实就是一个简单的消息队列机制。Obotcha模仿android(也可以说是抄)构建了自己的一个Handler。首先介绍Obotcha中关键的几个类,

2023-07-03 22:31:51 228

原创 我和我的同事们(一)

对的,对的,我们要马上回去拯救R。“R,这个样机你保管一下”,“R,你帮我们抓一下数据”,“R,代码base我写好了,你去帮忙review一下,再修改修改”....现在回想起来,很难相信怎么会有这样一个人,能承受这么多琐碎的事。R对于我和娇娇,基本属于无脑式的信任,每次讨论问题,一旦我们有天马行空的思路,哈哈,这个头铁的R一定会想尽一切方法来实现我们的方案,因为他说过,“他觉得我们一定是对的”,有这样信任我们的同事,深感荣幸。送R去地铁站的路上,R愉快的和我说,他接下来要找一份测试的工作,这样轻松一点。

2023-06-29 07:36:17 230

原创 如何优雅的写C++代码 Obotcha介绍(简单检测单元测试覆盖率的方法)

Obotcha已经写了快4年的,大约有44K行,4K个接口。对应的单元测试集()目前已经基本涵盖了大多数的模块,但是一直没办法确定有多少接口没有被测到。所以写了个简单的python脚本去做了一个统计。

2022-12-20 21:44:48 212

原创 如何优雅的写C++代码 Obotcha介绍(Synchronized实现)

C++实现synchronized

2022-11-05 20:03:28 240

原创 博客如何优雅的写C++代码 Obotcha介绍(ForEveryone函数)

循环遍历一个容器的数据的时候,我们都会使用foreach的语法,或者类似python/rust语言中的for xxx in container的语法,这样用起来非常爽。由于我在obotcha里面自己实现了ArrayList等容器,每次遍历都需要用比较繁琐的iterator

2022-10-30 22:56:12 327

原创 如何优雅的写C++代码 Obotcha介绍(shutdwon函数)

socket shutdown函数

2022-09-12 22:13:36 459

原创 如何优雅的写C++代码 Obotcha介绍(实现读写锁)

C++实现读写锁

2022-09-05 21:48:11 296

原创 如何优雅的写C++代码 Obotcha介绍(字符串转uint8_t)

结果value的数值竟然是49,直接是1的assic码,上网找了一下,貌似很多同学都遇到了这类问题。所以这里就直接用模板类做了区分,针对uint8_t的转化使用模板特例。默认都会走默认操作,uint_8的处理就走下面。

2022-08-21 15:27:53 1094

原创 如何优雅的写C++代码 Obotcha介绍(如何解决typedef重定义)

今天遇到一个比较郁闷的问题,Obotcha中用Byte来定义一个Byte实例(类似于java中的Integer),但是在第三方的zlib库中,它有个typedef定义Byte,用来表示unsigned char。所以只要zlib库和Obotcha的Byte.hpp一起include的时候就会出现编译报错。哈哈,下面我们来写一个代码简单表示一下:#include <tuple>#include <type_traits>#include <string>#inc

2022-05-11 21:52:27 378

原创 如何优雅的写C++代码 Obotcha介绍(转载in instantiation of member function requested here异常)

z智能指针和前置声明之间的小问题对比Go等其他语言的工程,C++工程让人痛苦的一件事情就是当工程稍微庞大一点,编译时间就蹭蹭蹭往上爬。一般来说看过Effective C++这本书或者其他类似书籍的人都知道要解决编译时长的问题,就要解决好和头文件之间的依赖关系。所以在任何必要的时候要首先考虑使用前置声明而不是之间include头文件。也就是说,在定义类的时候成员变量如果是自定义类型,可以考虑将其声明为指针类型或者是配合智能指针。函数传参时也是一样,使用指针或者引用。对于一个C工程来说,因为没有智能指.

2022-05-11 21:43:12 1495

原创 Kotlin学习笔记(java.io.IOException: unexpected end of stream on Connection)

这几天一直在用kotlin写app,今天遇到一个OKHttp的异常报错,log中一直打印java.io.IOException: unexpected end of stream on Connection。但是这个web api我用浏览器是OK的,抓了服务器的cap包,发现也是正常的。从网上查找,貌似很多人遇到这类问题,基本方案都是在http header里面添加“connection”为“close”的包头。这样的话,服务器会主动关闭连接,但是这样的话,每次都要重新连接服务器。重新对比看了一下cap

2022-05-06 15:09:22 3194

原创 如何优雅的写C++代码 Obotcha介绍(如何返回多个数据)

我们写函数的时经常会遇到这样的情况,需要返回多个数据,例如:std::string getStudentInfo(int &i) { i = 100; return "wang"}这个函数原本的想法是想获得学生信息(名字,学号),但是返回值只能一个,怎么能同时返回(名字,学号)呢?额,当然,你说返回一个类啥的都可以,但是如果每次都是为了返回值创建一个类,那是不是有点繁琐啊。这里推荐大家使用std::tuple的方法来实现同时返回多个数据的返回数值。方法如下:#inc

2022-04-26 20:26:17 1007

原创 如何优雅的写C++代码 Obotcha介绍(使用模板获取class类型)

在使用std::bind的时候,我们经常会遇到这么个提示:error: decltype evaluates to ‘MyFunction&’, which is not a class or enumeration type对应的代码如下using HtmlTemplateFunction = std::function<int(std::vector<int>)>;class MyFunction {public: MyFunction()

2022-04-26 20:09:57 356

原创 如何优雅的写C++代码 Obotcha介绍(智能指针析构)

这个礼拜调试多线程偶现了一个栈溢出的问题:#0 0x55ba07 (/home/sunliwang/mysource/Obotcha/ObotchaTestSuite/testUtil/testConcurrent/testFuture/mytest+0x55ba07)#1 0x7f4008dad147 (../../../../out/lib/libobotcha.so+0x9ea147)#2 0x7f4008dad17f (../../../../out/lib/libobotcha.s

2022-01-18 22:33:52 1027

原创 如何优雅的写C++代码 Obotcha介绍(Lambda支持)

  这个春节在家开始优化多线程的代码,发现多线程的使用上比较不方便,例如:我要创建一个线程,需要如下的步骤:1.创建一个Runnable的子类。如果有参数传递,那需要在构造函数中进行赋值DECLARE_SIMPLE_CLASS(RunCase2) IMPLEMENTS(Runnable) {public: _RunCase2(int v) { value = v; } void run() { //xxxxxxxx }private: int RunCas

2021-02-28 20:46:01 188

原创 如何优雅的写C++代码 Obotcha介绍(libco 移植)

这两天,主要干的事情就是研究了一下协程。哈哈,由于我本身是搞嵌入式的,基本上很少碰到用这个东东的。看网上说的这么神奇,貌似服务器上经常用协程来大规模并发时间,所以我决定也把协程引入进Obotcha。PS:最新的C++20貌似也有协程了,但是我现在用的是C++14,呵呵。暂时还木有~。协程库我用了libco,为啥用libco,主要是网上吹嘘说这个库是微信后台使用的,牛叉的很。Libco 是微信后台大规模使用的 C++ 协程库,在 2013 年的时候作为腾讯六大开源项目首次开源。据说 201...

2020-11-12 23:08:14 362

原创 如何优雅的写C++代码 Obotcha介绍(class命名冲突解决方法)

之前使用了google的glog来实现obotcha的log存储,但是最近编译的时候发现一个问题,Obotcha的Mutex类和glog的Mutex类冲突了。glog中Mutex定义如下:#define MUTEX_NAMESPACE glog_internal_namespace_namespace MUTEX_NAMESPACE {class Mutex { public: // Create a Mutex that is not held by anybody. Thi...

2020-09-26 10:08:24 200

原创 如何优雅的写C++代码 Obotcha介绍(简单的反射实现二)

Obotcha的反射基本已经都实现。目前能支持数据库,xml,json的ORM实现。template<typename T>void reflectTo(T obj)template<typename T>void importFrom(T value)JsonValue目前提供如上两个接口,reflectTo是将json数据直接导入到class对象中。importFrom是将class对象数据直接转成json数据。接下来我们看以下reflectTo和imp...

2020-09-20 21:10:38 170

原创 如何优雅的写C++代码 Obotcha介绍(简单的反射实现一)

最近又准备蠢蠢欲动开始写Sql的ORM了。但是ORM遇到的第一个问题就是C++没有反射!!!!。用过Java的同学都知道,使用Java的反射就能实现简单的ORM功能。奈何C++没有,只能自己实现一下了。主要实现代码如下: https://github.com/wangsun1983/Obotcha/blob/master/lang/include/Reflect.hpp 代码中主要的宏定义就是:DECLARE_REFLECT_FIELD#define DECLARE_REF...

2020-08-16 21:17:29 240

开源操作系统arale代码

开源操作系统代码,可以在bochs中运行,调试。 github库:https://github.com/wangsun1983/arale

2018-03-23

Android开发环境搭建

Eclipse下Android开发环境的搭建。 呵呵。

2011-09-07

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除