获得徽章 16
#每天一个知识点# 今天发现一个bug,就是互斥锁导致程序主进程阻塞,查了一天,也没有找到原因是哪里导致的没有unlock, std::unique_lock<std::mutex> lock(_mutex);竟然都能写出来死锁也是醉了,但是我使用cmake生成的sln,编译出来的竟然没有发生死锁,所以这肯定是工程配置的问,但是怎么排查呢,好痛哭哦
展开
评论
点赞
#每天一个知识点# LNK1318: 非意外的 PDB 错误: FORMAT (11)
今天再次遇到这个问题,清理项目,重新编译也没有解决这个问题
后来看网上说是因为无法操作pdb导致的,我尝试着删了了debug目录,仍旧没有解决这个问题,后来尝试着寻找这个pdb文件,发现生成到了其他地方,删除这个pdb后,就正常通过了链接,有点坑!
今天再次遇到这个问题,清理项目,重新编译也没有解决这个问题
后来看网上说是因为无法操作pdb导致的,我尝试着删了了debug目录,仍旧没有解决这个问题,后来尝试着寻找这个pdb文件,发现生成到了其他地方,删除这个pdb后,就正常通过了链接,有点坑!
展开
评论
点赞
#每天一个知识点# delete只是标记指针所指向的内存区域可用,并没有消除指针所指向区域的数据。
如果在delete之后和你再次调用指针之前那块区域没有被分配作其他用途的话,那你还是可以通过指针访问内存上的数据的。但是,如果在你调用之前,内存就已经分配作其他用途的话,你通过指针访问那块区域的结果就是未知的。
所以,delete以后要将指针置零,标记为空指针,今天就被这个问题坑住了!
如果在delete之后和你再次调用指针之前那块区域没有被分配作其他用途的话,那你还是可以通过指针访问内存上的数据的。但是,如果在你调用之前,内存就已经分配作其他用途的话,你通过指针访问那块区域的结果就是未知的。
所以,delete以后要将指针置零,标记为空指针,今天就被这个问题坑住了!
展开
2
10
#每天一个知识点# 公司的电脑编译Android好慢哦,然后编译环境经常容易出现各种小问题导致编译失败,ndk开发好痛苦哦,又好开心,每次改一行代码,就可以出去抽根烟,回来还在编译,这开发效率真的很爽,老板看了都夸我是黑心打工人,又拿我没办法,家人们,我的苦谁懂啊!
7
5
#每天一个知识点# void* operator new(size_t size) {}
void operator delete (void *p) {}
对new ,delete进行重载,可以实现类似的内存检测功能,但是这个会带来性能问题,所以在release模式下,这些代码也不能编译到项目中,我们可以选择使用预处理宏来规避这个问题。
void operator delete (void *p) {}
对new ,delete进行重载,可以实现类似的内存检测功能,但是这个会带来性能问题,所以在release模式下,这些代码也不能编译到项目中,我们可以选择使用预处理宏来规避这个问题。
展开
评论
点赞
#每天一个知识点# 夜神模拟器无法通过adb devices发现设备,折腾了好久,也使用夜神自带的adb都不行,最后百度发现adb connect 127.0.0.1:62001,竟然要通过网络,好吧,夜神真厉害,服了
4
3
#每天一个知识点# 写了个vscode插件,用来调试监控Android项目的一些情况,我想让vscode和应用程序进行交互通讯,vscode创建一个server,app通过网络连接上来,这个成本有点高,虽然很灵活,因为我一直是通过adb调试监控app的,想着还能不能通过adb实现类似的功能,发现还真可以:
adb shell am broadcast
adb shell am broadcast
展开
评论
1
#每天一个知识点# 使用 char* p = new char[100]申请一段内存,然后使用delete p释放,有什么问题?
A.会有内存泄露
B.不会有内存泄露,但不建议用
C.编译就会报错,必须使用delete []p
D.编译没问题,运行会直接崩溃
答案为 B 分析:
当用delete来释放用new int[]申请的内存空间时,由于其为基本数据类型没有析构函数,所以使用delete与delete []相同,两者都会释放申请的内存空间
若是自定义的数据类型,有析构函数时,用new []申请的空间,必须要用delete []来释放,因为要delete []时会逐一调用对象数组的析构函数,然后释放空间
A.会有内存泄露
B.不会有内存泄露,但不建议用
C.编译就会报错,必须使用delete []p
D.编译没问题,运行会直接崩溃
答案为 B 分析:
当用delete来释放用new int[]申请的内存空间时,由于其为基本数据类型没有析构函数,所以使用delete与delete []相同,两者都会释放申请的内存空间
若是自定义的数据类型,有析构函数时,用new []申请的空间,必须要用delete []来释放,因为要delete []时会逐一调用对象数组的析构函数,然后释放空间
展开
评论
2
#每天一个知识点# 今天又是折腾人的一天,svn提交代码又是一大片的红色修改,但是好多都是换行符不一样,内容都一样,svn也提供了diff的可视化界面,但是差异文件有点多,不可能一个一个人工手动看,所以就查了下svn的帮助手册,发现svn命令可以检索到差异,并且可以忽略换行符,命令如下:
svn diff -x --ignore-eol-style you_file
svn diff -x --ignore-eol-style you_file
展开
评论
点赞
#每天一个知识点# perfdog,solox,都可以监测Android的性能情况,solox的底层使用的是adb命令,perfdog安装了一个apk,perfdog收费,solox免费半开源。 感觉自己敲adb命令,其实也不需要这2个工具,无非是降低了使用门槛。
评论
点赞
#每天一个知识点# 今天终于把Android上,游戏内存泄露的bug给找到了,花费了1个月的时间,没有白折腾,大概原因就是粒子系统在Android上有开启ENABLED_CACHE_DATA,导致纹理会被缓存,这部分的逻辑是有问题的,应该是引擎的bug,已经确认了,找到这个泄露的地方,最终还是多亏了leak-tracer这个第三方库,看来泄露日志还是非常可靠的,网上说的大项目可能会有误报,真是误导我,目前使用的感觉是误报率比较低。
展开
1
点赞
今天闲着无聊,做了一个小工具,在Windows上添加管理右键菜单,背后的实现原理是通过添加注册表,这样就可以在不同的环境下,鼠标右键的菜单不一样,之前是自己手动修改注册表,这次选择的是使用wpf写了一个小工具。
这个工具的目的是为了提高开发效率,可以将一些功能快速的追加到鼠标右键上,比如VS code打开某个目录,这个鼠标右键菜单,就是通过修改注册表实现的。 #每天一个知识点#
这个工具的目的是为了提高开发效率,可以将一些功能快速的追加到鼠标右键上,比如VS code打开某个目录,这个鼠标右键菜单,就是通过修改注册表实现的。 #每天一个知识点#
展开
评论
点赞
#每天一个知识点#
启动vs插件执行命令报错:Error running command not found. This is likely caused by the extension that contributes
发现js里面的确没有这个注册这个command,也就是ts没有正常编译通过,使用的还是老的ts
Executing task: npm run watch
'npm' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
原因是我重装系统后没有安装nodejs环境导致,排查了好长时间才发现控制台其实已经给出错误原因了。
启动vs插件执行命令报错:Error running command not found. This is likely caused by the extension that contributes
发现js里面的确没有这个注册这个command,也就是ts没有正常编译通过,使用的还是老的ts
Executing task: npm run watch
'npm' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
原因是我重装系统后没有安装nodejs环境导致,排查了好长时间才发现控制台其实已经给出错误原因了。
展开
评论
点赞
#每天一个知识点# 捣鼓了一周,终于将leaktracer接入到游戏中,并且可以在android平台测试内存泄露,在android平台可以通过在顶部的通知栏开启关闭内存泄露检测,非常方便,并且配合开发的addr2line 的vscode插件,一键将内存泄露的符号地址转换为可阅读的调试信息,并一键跳转到源码,这一套下来,脑子都快干报废了,休息休息,好累。
vscode插件有需要的可以自取:
marketplace.visualstudio.com
vscode插件有需要的可以自取:
展开
评论
点赞