- 博客(24)
- 收藏
- 关注

原创 Android 如何定位内存泄漏
1. 非root设备,Android O 及以上设备如何定位内存泄漏问题ndk的代码如下: jstring Java_com_example_hellojni_HelloJni_stringFromJNI(JNIEnv* env, jobject thiz) { int fd; if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { ...
2020-04-02 10:09:50
810
原创 openssl的命令行解析p12格式的证书
通过openssl的命令行能够轻松的将pkcs#12格式的证书解析成pem后缀的证书文件,方便程序调用从pfx中获取CA证书openssl pkcs12 -in client.pfx -password pass:11111111 -nokeys -cacerts -out ca.pem从pfx中获取客户端证书openssl pkcs12 -in client.pfx -password pass:11111111 -clcerts -nokeys -out clientcert.pem从pf
2020-09-17 17:09:13
5759
原创 内存释放问题
内存释放问题今天做Android项目的时候出现一个崩溃的问题,该崩溃问题的崩溃日志如下:signal 11 (SIGSEGV), code 2 (SEGV_ACCERR), fault addr 0x3d206578 r0 e5848200 r1 e5859274 r2 0000002c r3 3d20657a r4 00c80000 r5 009a0000 r6 e...
2020-03-17 16:56:13
1102
原创 telnet ping ipv6问题分析
项目上开始支持ipv6的网络,但是环境比较难整,今天捣鼓了半天ipv6的测试环境, 测试环境的网络拓扑如下所示:s机器的网卡的ipv6的地址:fe80::20c:29ff:fe92:47a9A机器的IPV6的地址:fe80::1e67:58ff:fe0b:481eB机器的ipv6的地址:fe80::c18a:3fe2:c205:5dc8我用A机器的wan口ping B机器的wan口的ip...
2019-09-03 20:03:31
5795
转载 linux编译相关likely与unlikely
define likely(x) __builtin_expect(!!(x), 1)define unlikely(x) __builtin_expect(!!(x), 0)__builtin_expect((x),1)表示 x 的值为真的可能性更大;__builtin_expect((x),0)表示 x 的值为假的可能性更大。也就是说,使用likely(),执行 if ...
2019-09-02 14:58:07
311
原创 go语言的interface
package mainimport “fmt”type USB interface {start()end()}type Computer struct {name string}func (c Computer) start() {fmt.Println(c.name, “被打开了”)}func (c Computer) end() {fmt.Println(c.na...
2019-09-02 14:42:44
114
原创 如何更新Submodule URL
最近项目要迁移到别的平台,这样就牵涉到如何迁移仓库的问题:仓库迁移的步骤如下:仓库迁移下载原始仓库git clone --bare git@xxxx1:repo_name.git迁移到xxxx2平台cd repo_namegit push --mirror ssh://git@xxxxx2/source/repo_name.git但是我们的项目还有很多submodule,这该怎...
2019-08-23 11:44:49
1127
原创 如何更改socket的发送缓冲去,以及更改socket的发送缓冲区出现的问题
本来是想看看当发送缓冲区快满的时候,继续发包的话,滑动窗口是怎样,就写了一个测试的demo,测试了很多次感觉设置的发送缓冲去大小不生效似的,最后发现不是真的不生效,而是这样的一个结论:在Linux系统中,不管你设置的发送缓冲去是多少,只要是你设置的小于8192,即使你通过接口拿到的缓冲区是你设置的值*2,这个fd的发送缓冲去仍然就是16384测试demo如下#include <sys/...
2019-06-26 20:22:29
1029
1
原创 close socket 后,发送rst包的场景
前几天解决了一个很棘手的问题:从抓包来看,客户端收到了rst包,但是我的应用程序无响应的问题,在解决这个问题的过程中,我详细了解了为啥服务端调用close的时候,客户端收到的都不是正常的socket的关闭流程(先发FIN包),而是发送一个rst包给客户端,通过查阅各种资料,发现原来是这样的:当程序调用close关闭socket的时候,如果发送缓冲区中仍然有数据的话,协议栈会发送RST包代替FIN...
2019-05-31 10:18:07
1885
3
原创 水平触发与边缘触发
今天开始封装c的socket的基础,在封装的时候意识到这样一个问题,如果我现在fd的接收缓冲区中有2048字节的数据,但是我只读出来1024个字节的数据,当我下次select的时候(这之间没有网络数据过来), 还会检测到该select可读吗?这样就引申出来水Linux的IO多路复用中的水平触发模式和边缘触发模式,那么什么是水平触发模式,什么是边缘触发模式呢?水平触发模式:如果文件描述符已经就绪可...
2019-05-29 17:08:47
304
原创 客户端收到客户端的异常rst包,再次调用send会返回失败吗?
最近在项目中遇到这样的一个问题,客户端收到一个rst包之后(在网卡上抓包),收到包之后客户端继续发送消息(send 是异步的)没有返回失败,甚是疑惑啊,最后查看包发现收到的rst包的seq和之前收到的包的seq一样,并且中间有数据收发,如下图所示起初以为即使rst包的seq和之前的重复,协议栈也应该正常处理,但是经过如下方式的验证:伪造异常seq的rst包给客户端1, 写一个客户端和服务...
2019-05-24 17:06:30
1051
原创 Android程序崩溃,如何根据崩溃的日志信息定位出崩溃的行数
在编译Android底层的jni程序时,有两种编译方式:ndk和cmake,现在针对两种不同的编译方式来定位出崩溃的具体行号ndk:1、找到你的项目工程里的jni生成的目录,比如说目录为:obj/armeabi/objs/2、拿到崩溃的地址,例如:0xabcb1c3d3、假如说日志崩溃到libgguardian.so库里了,在命令行里执行arm-linux-androideabi-add...
2019-02-27 15:41:33
1594
原创 开发过程中内存崩溃分析(: signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0xf8)
在项目上线之后,发现一个很不容易发现的内存崩溃,那么该如何定位崩溃的位置呢?,首先从拿到崩溃的堆栈信息,如下:18244 F DEBUG : Revision: ‘0’02-27 09:49:42.920 18244 18244 F DEBUG : ABI: ‘arm’02-27 09:49:42.920 18244 18244 F DEBUG : pid: 14285, tid...
2019-02-27 14:59:50
26672
5
原创 虚拟网卡开发过程中的坑
这两天在测试虚拟网卡模块时,发现在不断短线重连的过程中关于虚拟网卡的oif 的路由表会越来越多,并且在虚拟网卡关闭的时候该路由表还在,表现形式如下:由于Android的虚拟网卡如果创建成功之后就不能添加路由规则,这样多隧道模式的情况下如果虚拟网卡创建成功之后,需要在添加路由规则时就需要重启虚拟网卡,重启的过程如下1、关闭虚拟网卡2、创建虚拟网卡Android中操作虚拟网卡的借口都是异步操作...
2018-10-18 17:22:21
1437
原创 jni 线程内反调java方法,访问java对象
jni 线程内反调java方法在c的线程中反向访问java的对象在做项目的时候遇到这样一个问题:在c中的线程中,通过jclass managerCls = (*env)->FindClass(env, “com/test/fact/Manager”);总是会崩溃,后来发现不能在线程中去Find class(但是可以访问到系统的类, 比如说String 类)解决方案:需要在主线...
2018-10-11 17:05:08
327
原创 jni之list
jni 中参数是list,如何获取list的中的数据首先通过一个例子来说明其中的原理吧java 中的函数原型public static native int init(List ca_list);jni 中的函数原型jint Java_com_test_JNIclass_init(JNIEnv *env, jobject this, jobject ca_list_obj);首先对于j...
2018-10-11 15:11:37
1304
原创 如何使用Android NDK 工具链编译openssl
1、gcc 的sysroot 选项 sysroot 选项设定 gcc 在编译源码的时候,寻找头文件和库文件的根目录。可以这样调用 gcc --sysroot=/tmp/gcc-arm (及其他选项)。NDK 根目录下的 platforms 目录中的各个子目录的路径都可以直接传给 gcc --sysroot=<dir>。为了简化操作,可以在linux系统的命令终端执行以下命令,设置...
2018-08-28 09:17:34
2027
原创 git submodule 添加,更新与删除
git submodule 是一个很好的多项目使用共同类库的工具,它允许类库项目作为repository,子项目做为一个单独的git项目存在父项目中,子项目可以有自己独立的commit、push、pull。而父项目以submodule的形式包含子项目,父项目可以指定子项目header、父项目中的提交信息包含submodule信息,再clone父项目的时候可以把Submodule初始化,使用方法...
2018-08-14 19:18:38
46253
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人